Google Mantis:用智能体闭环验证漏洞,减少 AI 扫描误报

2026-09-06 36 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

AI 可以快速找出代码中“看起来危险”的模式,但发现疑点并不等于确认漏洞。缺少可达性分析、运行时验证和稳定复现时,扫描结果很容易被误报与模型幻觉淹没。Google 开源的 Mantis 试图把 AI 从单纯的告警生成器变成执行漏洞生命周期的智能体框架,覆盖识别、验证、复现和修复。

关键变化:扫描结果不再是终点

传统扫描流程通常停在静态告警:某个输入可能未过滤、某个依赖版本可能受影响,或者某条调用链可能触发危险操作。工程团队仍要手动回答几个决定告警价值的问题:

  • 外部输入能否真正到达危险位置?
  • 触发漏洞需要哪些配置、权限和运行条件?
  • 能否构造稳定、可重复的测试用例?
  • 修复后,原有功能和漏洞回归测试是否同时通过?

Mantis 所代表的方向,是让智能体继续推进这些步骤,而不是在生成一段漏洞描述后停止。一个候选问题只有经过验证和复现,才应该获得较高优先级;修复建议也应通过测试,而不是只依赖语言模型对代码的判断。

这种闭环尤其适合减少两类噪声:一类是语法模式匹配正确、但在当前程序中不可达的告警;另一类是模型给出了听起来合理、实际上无法触发的“漏洞”。

Agentic Harness 应该约束什么

“Harness”可以理解为智能体执行安全任务时的受控环境。它的价值不只是调用模型,还要约束工具、输入、输出和判定条件。

一条可审计的验证链通常需要保存:候选漏洞及对应代码位置、智能体提出的触发假设、实际执行的复现命令、标准输出和错误输出、退出状态、补丁内容,以及补丁前后的测试结果。

判定规则也应尽量由机器执行。例如,“复现测试在旧版本失败、应用补丁后通过”比“模型认为问题已经修复”更可靠。对命令执行、网络访问和文件写入还应设置沙箱、超时与权限边界,避免验证漏洞的过程本身影响开发机或生产环境。

需要注意的是,开源框架并不自动保证零误报。漏洞是否成立仍可能依赖业务语义、部署配置和外部系统。智能体适合收集证据和自动处理重复工作,高风险结论仍需要安全工程师确认。

可以这样实践:给候选漏洞增加可执行验证门

下面是一个与具体框架无关的最小示例,用来演示“候选发现必须通过复现命令才能升级”的机制。它不是 Mantis 的官方接口,而是可以接入类似智能体工作流的本地验证器。

先创建 findings.json

[
  {
    "id": "SQLI-001",
    "summary": "User input may reach a SQL query",
    "repro_command": ["python", "-c", "assert 'admin' in 'admin OR 1=1'"]
  },
  {
    "id": "PATH-002",
    "summary": "Suspected path traversal",
    "repro_command": ["python", "-c", "raise SystemExit(1)"]
  }
]

再创建 validate_findings.py

import json
import subprocess
from pathlib import Path

ALLOWED_EXECUTABLES = {"python", "python3", "pytest"}
TIMEOUT_SECONDS = 10


def validate(finding: dict) -> dict:
    command = finding["repro_command"]
    if not command or command[0] not in ALLOWED_EXECUTABLES:
        return {**finding, "status": "blocked", "evidence": "command not allowed"}

    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            timeout=TIMEOUT_SECONDS,
            check=False,
        )
    except subprocess.TimeoutExpired:
        return {**finding, "status": "inconclusive", "evidence": "timeout"}

    return {
        **finding,
        "status": "validated" if result.returncode == 0 else "rejected",
        "evidence": {
            "exit_code": result.returncode,
            "stdout": result.stdout[-2000:],
            "stderr": result.stderr[-2000:],
        },
    }


findings = json.loads(Path("findings.json").read_text(encoding="utf-8"))
results = [validate(item) for item in findings]
Path("validation-results.json").write_text(
    json.dumps(results, indent=2, ensure_ascii=False),
    encoding="utf-8",
)

for result in results:
    print(f'{result["id"]}: {result["status"]}')

运行:

python validate_findings.py
cat validation-results.json

示例中,第一个候选项会被标记为 validated,第二个会被标记为 rejected。在真实项目中,应把 repro_command 替换成隔离容器内的单元测试、集成测试或专用漏洞复现脚本,并让智能体生成测试输入而不是任意 shell 字符串。

更完整的流水线还可以规定以下状态转换:

candidate -> validated -> reproduced -> patched -> regression-tested
          -> rejected
          -> inconclusive -> human-review

状态机能防止“发现”和“确认”混为一谈,也方便 CI、安全平台和人工审核共同消费结果。

接入现有研发流程时的边界

采用此类框架时,建议先从历史误报较多、又容易构造自动化测试的一类漏洞开始,例如输入校验缺失或路径处理问题。用已确认的真阳性和误报样本建立评估集,再比较引入智能体验证前后的准确率、平均验证时间与计算成本。

上线前至少检查这些事项:

  • 所有智能体命令均在一次性容器或等价沙箱中执行。
  • 默认禁用生产凭据、内网访问和不必要的外部网络访问。
  • 每个结论都保留代码位置、复现步骤、日志和测试结果。
  • 自动生成的补丁必须通过原有测试与新增安全回归测试。
  • 高危漏洞、依赖业务语义的判断和大范围补丁必须经过人工审核。
  • 对模型调用次数、执行时间和失败重试设置预算。

Mantis 值得关注的核心不是“再用一个模型扫描代码”,而是把漏洞工作组织成可执行、可验证、可回溯的闭环。真正降低误报的不是更自信的文字说明,而是可重复的证据和明确的质量门。


相关推荐