技术教程 · 阅读约 9 分钟

用 AI 找到你代码里的安全漏洞——Google 黑客用的方法,你也能用

用 AI 找到你代码里的安全漏洞——Google 黑客用的方法,你也能用

最近 HN 上有一条新闻挺炸的:Google 披露,有犯罪黑客用 AI 辅助发现了一个重大软件漏洞。

很多人看完的第一反应是"AI 被坏人用了"。但换个角度想:同样的方法,防守方为什么不能先用?

这篇文章就教你用 LLM 做一次真正有效的代码安全审计——不是让 AI 泛泛地"帮我看看有没有问题",而是用结构化 prompt + 自动化脚本,把整个 repo 喂给模型,拿到可操作的漏洞报告。


为什么"直接粘代码问 AI"效果很差

大多数人的用法是:把一段代码复制进对话框,问"有没有安全问题"。

这有几个致命缺陷:

1. 上下文割裂:漏洞往往跨文件,A 文件的输入没做校验,B 文件才是注入点,单文件看不出来

2. Prompt 太宽泛:模型会给你一堆"建议使用参数化查询"之类的废话

3. 没有优先级:Critical 和 Info 混在一起,不知道先修哪个

正确的做法是:按文件批量扫描 + 结构化输出 + 按严重程度聚合。


实战:30 行 Python 扫完整个 repo

下面这个脚本会递归读取你项目里所有 .py / .js / .ts 文件,逐个送给模型审计,最后输出一份 JSON 格式的漏洞报告。


import os

import json

from openai import OpenAI



# 改一行 base_url,直连国内,比官方省 60%

client = OpenAI(

    api_key="your_api_key",

    base_url="https://api2everything.xyz/v1"

)



EXTENSIONS = {".py", ".js", ".ts", ".go", ".java"}



AUDIT_PROMPT = """你是一名资深安全工程师,请对以下代码进行安全审计。



只输出 JSON,格式如下:

{

  "file": "文件路径",

  "issues": [

    {

      "severity": "Critical|High|Medium|Low|Info",

      "type": "漏洞类型,如 SQL注入/XSS/路径穿越/硬编码密钥 等",

      "line": "大概行号或范围",

      "description": "一句话描述问题",

      "fix": "具体修复建议"

    }

  ]

}



如果没有发现问题,issues 返回空数组。不要输出 JSON 以外的任何内容。



文件路径:{filepath}

代码内容:

{code}


"""



def collect_files(root_dir):

    for dirpath, _, filenames in os.walk(root_dir):

        # 跳过常见无关目录

        if any(skip in dirpath for skip in ["node_modules", ".git", "__pycache__", "venv"]):

            continue

        for fname in filenames:

            if os.path.splitext(fname)[1] in EXTENSIONS:

                yield os.path.join(dirpath, fname)



def audit_file(filepath):

    with open(filepath, "r", encoding="utf-8", errors="ignore") as f:

        code = f.read()



    # 跳过空文件或超大文件(避免超 token)

    if not code.strip() or len(code) > 60000:

        return None



    prompt = AUDIT_PROMPT.format(filepath=filepath, code=code)



    response = client.chat.completions.create(

        model="gpt-4.1",          # 也可以换成 claude-sonnet-4-5 或 deepseek-r1

        messages=[{"role": "user", "content": prompt}],

        temperature=0,            # 安全审计要确定性输出

        max_tokens=1024

    )



    raw = response.choices[0].message.content.strip()



    # 清理模型可能输出的 markdown 代码块包裹

    if raw.startswith("```"):

        raw = raw.split("```")[1]

        if raw.startswith("json"):

            raw = raw[4:]



    return json.loads(raw)



def main(target_dir="."):

    all_issues = []

    files = list(collect_files(target_dir))

    print(f"共找到 {len(files)} 个文件,开始审计...\n")



    for i, fp in enumerate(files, 1):

        print(f"[{i}/{len(files)}] 审计: {fp}")

        try:

            result = audit_file(fp)

            if result and result.get("issues"):

                all_issues.append(result)

        except Exception as e:

            print(f"  ⚠️  跳过({e})")



    # 按严重程度排序

    severity_order = {"Critical": 0, "High": 1, "Medium": 2, "Low": 3, "Info": 4}

    all_issues.sort(

        key=lambda x: min(

            severity_order.get(issue["severity"], 5)

            for issue in x["issues"]

        )

    )



    output_path = "security_report.json"

    with open(output_path, "w", encoding="utf-8") as f:

        json.dump(all_issues, f, ensure_ascii=False, indent=2)



    # 打印摘要

    total = sum(len(r["issues"]) for r in all_issues)

    critical = sum(

        1 for r in all_issues

        for issue in r["issues"]

        if issue["severity"] == "Critical"

    )

    print(f"\n✅ 审计完成:共 {total} 个问题,其中 Critical {critical} 个")

    print(f"📄 完整报告已保存至 {output_path}")



if __name__ == "__main__":

    import sys

    target = sys.argv[1] if len(sys.argv) > 1 else "."

    main(target)

用法很简单:


pip install openai

python audit.py ./your_project


几个让效果翻倍的技巧

1. 换更强的模型做 Critical 复审

初筛用 gpt-4.1-mini 或 deepseek-v3 控制成本,对输出了 Critical/High 的文件,再用 claude-sonnet-4-5 或 o3 做二次确认,误报率能降一半。

2. 加入数据流上下文

如果你知道某个函数是外部输入入口(比如 Flask 的 request.form),可以在 prompt 里标注,让模型追踪污点传播路径,发现跨文件漏洞。

3. 结合 AST 做预过滤

用 ast 模块(Python)或 @babel/parser(JS)先提取函数签名和导入关系,只把"有外部输入"的函数送给 AI,大幅减少 token 消耗。


关于模型选择和成本

这个脚本对一个中型项目(200 个文件)大概消耗 50-80 万 token。

用 OpenAI 官方 API 的话,gpt-4.1 大概要花 $3-5。

我自己用的是无量Api(api2everything.xyz),国内直连不需要梯子,支持 OpenAI / Claude / Gemini / DeepSeek 等 300+ 模型,价格比官方便宜约 65%,同样的审计任务成本直接砍到 ¥7-12 左右。注册还送 ¥1 余额,余额永久有效,可以先试试水。

接入方式就是改一行 base_url,其他代码完全不用动,上面脚本里已经写好了。


最后

AI 辅助安全审计不是银弹,它找不到所有漏洞,也会有误报。但作为"第一道筛查",它能在 10 分钟内给你一份比人工粗扫更全面的问题清单,让你把精力集中在真正高危的地方。

黑客已经在用 AI 找你代码里的洞了,你没理由不用同样的工具守住它。


你的项目跑出来有什么有趣的发现?或者脚本跑不起来?评论区见,我都会回。

觉得有用的话点个赞,后续还会写 AI 辅助 Fuzzing、依赖链分析等实战内容。