系统:运行中
← 返回所有攻击
RESEARCH LOW NEW

实证研究:开源 LLM 智能体在 SAST 扫描上不及格

2026 年 6 月 10 日的一项研究,让本地 LLM 智能体在 101816 行 Python 代码上对决 SAST 工具 Bandit。所有模型的综合得分均为负,主因是幻觉。

2026-06-22 // 6 min affects: llama-3.1, gemma-3, qwen-2.5, ollama, llm-agents

这是什么?

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 专家提示,要求每个模型输出带有 wherewhatwhyfix 字段的 JSON。

性能以召回率(同样被找到的 Bandit 中/高检测占比,含部分得分)减去误报率来衡量,得到从 -1 到 1 的综合得分。所有单元格都是负值:

模型Beaverhabits(召回 / 误报 / 综合)Fail2banYum
gemma30.25 / 0.88 / -0.620.00 / 0.80 / -0.800.00 / 0.89 / -0.89
llama3.10.25 / 0.46 / -0.210.03 / 0.40 / -0.370.00 / 0.59 / -0.59
qwen2.50.25 / 0.28 / -0.030.01 / 0.14 / -0.120.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 智能体用作安全扫描器的团队,实用要点:

  1. 将确定性工具作为真值来源。 基于规则的 SAST(Bandit、Semgrep、CodeQL)快速、可复现、可解释且关联 CVE。把 LLM 当作可选的第二道工序,绝不作为关卡。
  2. 永远不要信任 LLM 给出的行号。 where 字段经常出现幻觉;任何智能体发现都必须重新锚定到真实源代码,人类才能据此行动。
  3. 预期会有大量误报。 针对研究中看到的 .env/dotenv、常量当密钥、注释/许可证等模式进行调优——否则你会让开发者学会彻底忽视这个工具。
  4. 采用前先度量。 复现该研究的低成本指标——在你自己的代码上,相对一个经验证的基准计算召回率与误报率——而不是相信厂商演示。
  5. 在 LLM 真正擅长之处使用它。 值得注意的是,研究者用 Claude 来生成交叉比对脚本以解析嘈杂的输出——这是把 LLM 当作确定性流水线的助手,而非扫描器。

状态

项目参考日期备注
实证评估arXiv:2606.116722026-06-10Snitch 智能体对决 Bandit,224 文件 / 101816 行
受测模型gemma3、llama3.1、qwen2.5(经 Ollama)2026-06-10均为通用型开源权重模型
最佳综合分qwen2.52026-06-10在三个仓库上仍均为负
基准工具Bandit(PyCQA)基于规则、关联 CVE 的 Python SAST

要点:在 2026 年年中,通用型开源 LLM 智能体是确定性 SAST 工具的拙劣替代品——误报高、位置靠编造、运行耗时数小时。有用的范式与喧嚣的宣传相反:让成熟工具去做检测,让模型在人类监督下协助分类与解释。

Sources