实证研究:开源 LLM 智能体在 SAST 扫描上不及格
2026 年 6 月 10 日的一项研究,让本地 LLM 智能体在 101816 行 Python 代码上对决 SAST 工具 Bandit。所有模型的综合得分均为负,主因是幻觉。
这是什么?
2026 年 6 月 10 日,佛罗里达理工学院的 Derek Yohn、Luke Flancher、Mirajul Islam 和 Khaled Slhoub 发表了 Can Open-Source LLM Agents Replace Static Application Security Testing Tools? An Empirical Assessment(arXiv:2606.11672,cs.CR)。这个问题很及时:交付 AI 生成代码的团队越来越希望由 AI 智能体来审查代码,而许多小团队从未在流水线中接入过真正的静态应用安全测试(SAST)工具。
作者构建了一个名为 Snitch 的简单 Python 智能体,依次由三个经 Ollama 托管的开源权重模型驱动——Google 的 gemma3、Meta 的 llama3.1 和阿里巴巴的 qwen2.5——并在三个真实的开源仓库上将其与 Bandit(一款成熟的、基于规则的 Python SAST 工具)进行对比。结论很直接:通用型开源 LLM 智能体目前并不适合在现实条件下进行 SAST 扫描。
工作原理
实验设置是一场干净的对决。Bandit 与 Snitch 各自扫描了横跨 Beaverhabits(习惯追踪器)、Fail2ban(安全守护进程)和 Yum(成熟的 RPM 包管理器)的 224 个 Python 文件 / 101816 行代码。Bandit 的中/高严重度检测被用作基准真值——Beaverhabits 中 4 条、Fail2ban 中 37 条、成熟的 Yum 代码中 0 条。Snitch 运行一个固定的 SAST 专家提示,要求每个模型输出带有 where、what、why、fix 字段的 JSON。
性能以召回率(同样被找到的 Bandit 中/高检测占比,含部分得分)减去误报率来衡量,得到从 -1 到 1 的综合得分。所有单元格都是负值:
| 模型 | Beaverhabits(召回 / 误报 / 综合) | Fail2ban | Yum |
|---|---|---|---|
| gemma3 | 0.25 / 0.88 / -0.62 | 0.00 / 0.80 / -0.80 | 0.00 / 0.89 / -0.89 |
| llama3.1 | 0.25 / 0.46 / -0.21 | 0.03 / 0.40 / -0.37 | 0.00 / 0.59 / -0.59 |
| qwen2.5 | 0.25 / 0.28 / -0.03 | 0.01 / 0.14 / -0.12 | 0.00 / 0.40 / -0.40 |
最主要的失败模式是幻觉。where 字段——每个问题的文件与行号范围——经常被凭空编造,指向不存在的文件或位置。只有单独捕获的文件名才让研究者得以分析这些输出。模型还把正常的工程模式误判为漏洞:把 .env / dotenv 配置当作硬编码的生产密钥,把 calendar.MONDAY 等标准库常量当作密钥,把许可证头部和 Python 的 dunder 方法当作注入。qwen2.5 表现最不差(误报最少),gemma3 最差。作者指出,闭源或专用模型配合更好的提示也许能取得更高分数——但差距的量级表明这是结构性问题,而非提示调优的产物。
为什么重要
这是近期智能体漏洞挖掘工作(如 Code-Augur 和长周期缺陷狩猎基准)的防御侧镜像:剥去脚手架后,直接把通用模型对准一个代码库,其表现还不如一个 1990 年代风格的模式匹配器。危险不在于智能体一无所获——而在于它产出流畅、自信却基本是噪声的结果,促使开发者去”修复”伪问题,而真正的发现被淹没。这种虚假信心本身就是一个风险面,并加剧了围绕编码 LLM 可用性和 AI 引入的代码缺陷已被记录的信任问题。速度让情况更糟:Bandit 在不到一分钟内处理完每个仓库,而 Snitch 每个仓库需要一到四小时(约 672 次 LLM 调用,总计 10–12 小时)。
防御
对于考虑将 LLM 智能体用作安全扫描器的团队,实用要点:
- 将确定性工具作为真值来源。 基于规则的 SAST(Bandit、Semgrep、CodeQL)快速、可复现、可解释且关联 CVE。把 LLM 当作可选的第二道工序,绝不作为关卡。
- 永远不要信任 LLM 给出的行号。
where字段经常出现幻觉;任何智能体发现都必须重新锚定到真实源代码,人类才能据此行动。 - 预期会有大量误报。 针对研究中看到的
.env/dotenv、常量当密钥、注释/许可证等模式进行调优——否则你会让开发者学会彻底忽视这个工具。 - 采用前先度量。 复现该研究的低成本指标——在你自己的代码上,相对一个经验证的基准计算召回率与误报率——而不是相信厂商演示。
- 在 LLM 真正擅长之处使用它。 值得注意的是,研究者用 Claude 来生成交叉比对脚本以解析嘈杂的输出——这是把 LLM 当作确定性流水线的助手,而非扫描器。
状态
| 项目 | 参考 | 日期 | 备注 |
|---|---|---|---|
| 实证评估 | arXiv:2606.11672 | 2026-06-10 | Snitch 智能体对决 Bandit,224 文件 / 101816 行 |
| 受测模型 | gemma3、llama3.1、qwen2.5(经 Ollama) | 2026-06-10 | 均为通用型开源权重模型 |
| 最佳综合分 | qwen2.5 | 2026-06-10 | 在三个仓库上仍均为负 |
| 基准工具 | Bandit(PyCQA) | — | 基于规则、关联 CVE 的 Python SAST |
要点:在 2026 年年中,通用型开源 LLM 智能体是确定性 SAST 工具的拙劣替代品——误报高、位置靠编造、运行耗时数小时。有用的范式与喧嚣的宣传相反:让成熟工具去做检测,让模型在人类监督下协助分类与解释。