Postmortem for Kernel Soundness Bug #14576 — 当验证器自身有洞
来源:Leonardo de Moura(Lean 主要创建者、Lean FRO)个人博客,2026-08-01。证据定级 high:首席架构师一手事后分析,事件时间线与 PR 编号(#14576/#14577/#14582/#14607–#14632)全部可查。编译定位为"一手事实提取 + 跨域同构综合"——事实部分 claim_type: extracted,映射到 agent 验证体系的部分为综合判断(已标注)。
编译摘要
1. 浓缩
- 核心结论1:AI 辅助产出的 Collatz "反证"不是证明能力问题,而是验证器实现缺陷被精准利用——嵌套归纳类型下 phantom 参数从辅助类型中消失、逃逸类型检查,使 kernel 接受
False的证明;这是实现 bug 而非 Lean 元理论漏洞,且仅能经 metaprogramming 直达 kernel 触发(frontend 会拦截)- 关键证据: 7-25 Ramana Kumar 发布
sorry-free "反证" → 7-28 Kiran Gopinathan 约简为False小证明并开 issue #14576 → 一小时后 #14577 修复。
- 关键证据: 7-25 Ramana Kumar 发布
- 核心结论2:exploit 同时骗过了主外部检查器 nanoda——因为涉及两个不相关的 bug(Lean kernel 缺检查 + 旧版 nanoda 不验证 projection 节点的 type name);独立检查机制因此依然成立(攻破它需要两个独立实现各有一个不同 bug),但有效性以新鲜度为前提(依赖方必须同时持有两端的 current 版本)
- 关键证据: nanoda 的 bug 由 Jeremy Chen 报告、早在 Lean bug 前一周已修复;exploit 构造恰好使 kernel 不检查的表达式正是旧 nanoda 接受的那个。时间巧合两种假说:Kumar 认为巧合(但无法排除模型见过 nanoda 报告),Joachim Breitner 归因于"能找这类 bug 的强模型变得可用了"。
- 核心结论3:架构原则——健全性不能依赖不可信组件"拒绝构造坏项";elaborator 按设计不可信,攻击者也可直写
.olean或改内存绕过它,因此 kernel 必须在自己的进程内独立拒绝 ill-typed 声明。"移除 metaprogramming 防攻击"是误诊- 关键证据: "The kernel has to reject ill-typed declarations on its own, in its own process. This separation and isolation of concerns is one of the main advantages of proof terms."
2. 质疑
- 关于"结论2"的质疑: "两个独立 bug"的独立性判断依赖事后归因——无法排除 AI 模型在训练/上下文中见过 nanoda 报告而定向构造(文中明言 cannot rule out)。若模型能系统性 harvest 多个检查器的公开 bug 报告,"bug 独立性"假设会被削弱为"未公开 bug 的独立性"。
- 关于"结论3"的质疑: kernel 自守原则在形式系统中有清晰的 trusted computing base 边界(kernel 进程即边界);迁移到 agent 系统时,enforcement point 常分散在 harness、API 网关、工具运行时多处,"在自己的进程内独立拒绝"没有同等的架构清晰度——迁移需要重新界定边界。
- 关于数据可靠性: lean4lean "本会发现该 bug" 是反事实判断(其一致性证明尚未覆盖归纳类型);OpenAI 安全 AI 发现的额外 kernel 错误"全部被 nanoda 捕获"——样本极小,不足以推广 AI 审计的通用效力。
- 积极信号: 事后响应结构完整——exploit 回归测试入 Kernel Arena、#14582 强化参数行为检查、comparator.live 默认跑 nanoda 且每日跟踪上游、主动资助外部研究者开发新 kernel。
3. 对标
- 验证器独立性的三层级镜像(综合判断):库内 Agent-Verification 已建立的独立性框架——训练数据级(跨模型 rubber duck)、目标级(独立验证者 agent)——在此获得形式验证域的精确对应:实现级独立(Lean kernel vs nanoda,不同语言不同实现)、目标级独立(lean4lean:kernel 实现其类型理论的形式化证明)。新增维度是新鲜度约束:独立性是结构属性,新鲜度是运维属性,二者缺一则独立检查失效。
- 信任边界同构(综合判断):「elaborator 按设计不可信 → kernel 必须自守」与 agent harness 的「模型按设计不可信 → 护栏必须由 harness 独立执行」是同一条原则(参见 Agent-Harness、Agent-Containment);"移除 metaprogramming"等同于"靠 prompt 让模型自我约束"——把安全性寄托在不可信组件的自我克制上。
- 可验证性的元前提:Verifiability 驱动的 RLVR 飞轮隐含"验证器正确"这一元前提。数学证明检查是可验证性最强的领域(字节级判定),恰在此处验证器出现实现缺陷——说明可验证性不是二元属性,而是"验证器可信度"的连续函数。与 Evaluator-Miscalibration(评估器本身必须被验证)同构。
- AI 的双重角色:AI 既是 exploit 的生产者(辅助构造 Collatz "反证"),又是验证器的审计者(OpenAI Daniel Selsam 的 cybersecurity AI 找出更多 kernel 错误)——攻防两端同时加速,验证基础设施进入 proof-of-work 式的持续军备竞赛。详见 AI-in-Mathematics。
- 约束分析(3c):硬约束——验证器是实现物,实现必有 bug(有限理性 + 复杂性);软约束——独立实现的语言/团队多样性、版本跟踪频率(comparator 每日同步是工程选择);自设约束——"经过检查器 = 正确"在 AI 辅助攻击时代必须让位于"经过多个当前版本的独立检查器 = 大概率正确"。