用 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、依赖链分析等实战内容。