Administrator
Published on 2026-08-04 / 6 Visits
0
0

AI 垃圾 CVE:自动修复前先建立复现门

一条 AI 垃圾 CVE 可以具备完整外观:编号、受影响版本、技术描述、PoC 和严重度评分。这些字段都无法单独证明漏洞存在。Security Agent 修改代码或升级生产依赖前,需要一份复现合同,把漏洞声明绑定到真实源码、可达路径、隔离环境里的确定性失败,以及可验证的上游修复。

SQLite 事件暴露的是流水线问题

2026 年 7 月 30 日,JFrog 发布了六条 SQLite CVE 的逐项审计。这些记录已经进入公开漏洞数据链,并一度带有 High 或 Critical 元数据。JFrog 随后核对目标版本、函数、行号、补丁和 PoC,发现声明经不起源码检查。

问题非常具体:有的函数在所称版本中根本不存在,有的所谓修复版本没有修改相关源文件,有的引用行号超过文件总长度,有的 PoC 在解析阶段就失败,还有一条使用了源码里不存在的函数签名。

JFrog 检出指定 SQLite tag,在 Docker 中干净构建,并在 AddressSanitizer 下原样运行 PoC,同时核对 NVD、CPE 和 GHSA 元数据。SQLite 官方 CVE 页面随后把这六条记录列为并非 SQLite bug,说明它们不可复现,疑似 AI 幻觉。

JFrog 还审计了同一 GitHub 账号更广泛的 55 条通告,分类结果是 54 条完全捏造,另 1 条包含真实 bug,但套用了未经验证的 CVE 元数据。54 比 1 是 JFrog 的研究结论,不是 CVE Program 的官方分类。

状态在文章发布后继续变化。7 月 31 日,官方 CVE API 已把这 55 个 ID 全部标为 REJECTED。拒绝状态也不代表底层每个普通软件 bug 都不存在。它表示这些记录已经不能支撑把所述问题当作有效 CVE 处理。

CVE 记录包含多个证据层级

安全自动化最常见的错误,是把数据库里存在一行记录当成漏洞已经验证。

证据层级 能证明什么 仍不能证明什么
CVE ID 已分配 CNA 创建了记录编号 已完成独立复现
记录已发布 必填字段与公开引用进入系统 厂商确认或真实可利用性
NVD 或 ADP 富化 增加 CPE、CWE、CVSS 等元数据 PoC 能到达漏洞代码
维护者确认 上游项目认可问题 当前部署配置暴露
隔离复现 指定版本在记录条件下失败 提议补丁正确
修复验证 同一复现由失败变为安全 保护版本已覆盖生产资产

六条 SQLite 记录说明了为什么这些层级必须分开。严重度元数据早于源码和 PoC 核验出现。扫描器因此可能自动创建紧急工单,修复 Agent 甚至会尝试修改一个不存在的函数。

CVE CNA 规则要求 CNA 做漏洞判定并提供公开引用,但发布记录不等于独立复现。可工作的 PoC 是强证据,却不是所有 CVE 的统一发布前提。

六道复现门

原始漏洞 Feed 应先进入隔离区。只有每一道门都有明确证据,记录才可以晋升到自动修复。

第一门:来源与当前状态

记录分配 CNA、发布时间线、引用和最新状态,并在执行前刷新。状态变为 REJECTEDDISPUTED 或内容发生实质修改时,旧修复计划立即失效。

维护者官网没有记录只能算红旗,不能单独作为伪造证明。来源陌生、版本范围冲突、产品字段缺失和严重度频繁变化,都应提高审核等级。

第二门:源码身份

冻结上游仓库、tag 或 commit、构建配置、文件、函数和声明行号,确认所有符号在该版本真实存在。

这一门无需运行 PoC,就能挡住多条 SQLite 通告。比目标版本晚几年才引入的函数,不可能支撑所述调用路径。超过文件末尾的行号,也不只是普通引用误差。

第三门:可达性与威胁模型

普通 bug 只有在相关攻击能力和部署条件成立时,才构成安全漏洞。需要确认不可信输入能到达目标位置、相关功能确实启用,以及所述影响给攻击者带来了原本没有的能力。

SQLite 官方漏洞说明长期强调这一点。许多 SQLite 崩溃报告默认攻击者已经能执行任意 SQL 或提交恶意数据库,而普通应用通常没有这个暴露面。前置能力不同,安全影响也会变化。

第四门:隔离复现

从干净源码构建精确版本,在受限环境中启用 Sanitizer 和日志,先原样运行 PoC,再考虑修复。至少保留:

  • 源码与构建哈希;
  • 编译器、参数、依赖和平台;
  • PoC 哈希与执行命令;
  • 退出码、stdout、stderr、Sanitizer 输出和堆栈;
  • 重复结果与一个负向对照。

PoC 缺失或失败不一定证明漏洞为假,环境假设可能没有写全。它至少说明证据还不足以触发自动改代码。系统应把记录转入人工调查,并明确缺少什么。

第五门:补丁真实性与因果性

核验修复 commit 或 PR 真实存在,修改了所称路径,并进入声明的修复版本。通告里的一句 fixed in 某版本不足以证明补丁存在。

最强回归具有两面:冻结的旧版本在复现器下失败,新版本在同一测试下通过。还要增加边界输入,避免补丁只过滤现有 PoC,同时检查无关功能和安全不变量。

第六门:执行策略与部署证据

只有证据合同完整、变更可逆、补丁来源可信、灰度范围可控时,才允许自动修复。其余情况进入隔离、补证据或人工批准之一。

部署后继续核对运行版本、重新扫描资产,在安全条件下重复负向测试,并监控回滚阈值。生成补丁只是提议,受保护版本覆盖目标资产才算完成。

把复现门写成机器合同

一条短小结构化记录,比一段 Agent 自述更适合执行器检查。

vulnerability_gate:
  cve: CVE-YYYY-NNNNN
  state: PUBLISHED
  checked_at: 2026-08-04T08:00:00Z
  source:
    repository: https://example.org/upstream/repo
    commit: 4d3c2b1
    function_present: true
  exposure:
    feature_enabled: true
    untrusted_input_reachable: true
  reproduction:
    environment_sha256: a921...
    poc_sha256: 88c4...
    attempts: 3
    sanitizer_failure: true
  fix:
    upstream_commit: 771e...
    vulnerable_fails: true
    fixed_passes: true
  decision: allow_canary

执行器应拒绝缺失、过期或互相矛盾的字段,并把批准绑定到具体软件包、版本、目标资产和补丁哈希。所有被拒候选都可以沉淀为 Eval 数据,让同类垃圾通告下一次更早被拦截。

这套准入门与Chrome 的 AI 漏洞流水线属于两个相邻控制面。旧文衡量漏洞从发现到用户真正获得保护的全过程。本文的复现合同决定一条外部声明是否有资格进入这条流水线。

避免 AI 检测器捷径

JFrog 使用 GPTZero 作为通告文本可能由 AI 生成的一条信号。这个信号不能支撑漏洞拒绝。文本检测器可能误判人工或机器文本,人工写作也完全可能包含技术错误。

真正的问题是:所称代码是否存在、路径是否可达、输入能否复现失败、影响是否符合威胁模型、修复是否改变结果。这些检查与作者身份无关。

常见问题

什么是 AI 垃圾 CVE?

它是对低质量或伪造漏洞通告的非正式称呼,其技术细节可能由 LLM 生成或放大。这个标签只能描述质量风险,不能代替技术核验。

有 CVE 编号是否代表已经独立复现?

编号表示 CNA 按 CVE 流程分配并发布了记录。独立复现、厂商确认、环境暴露与补丁验证属于额外证据。

六条 SQLite CVE 是真的吗?

JFrog 无法复现,并在源码、PoC 与所谓补丁中发现直接矛盾。SQLite 官方把它们列为并非 SQLite bug,相关 CVE 记录随后被拒绝。

PoC 失败后应该怎么做?

保存环境和输出,复核版本与配置假设,并请求缺失证据。在得到可复现结果前,保持隔离,停止自动修复。

被拒 CVE 是否仍可能指向真实 bug?

可能。记录可能因为所述问题不构成安全漏洞、重复、产品归属错误或元数据无效而被拒绝。普通 bug 是否存在与 CVE 是否有效是两个相邻问题。

参考资料


Comment