top of page

Trail of Bits 的 Miden 审计:AI Agents 构建缺失工具后发现 Falcon 漏洞

6天前
讀畢需時 14 分鐘

Trail of Bits 为 Miden 审计准备了六个月,随后借助其 AI agents 从零构建的工具发现了一个高严重性漏洞。Trail of Bits 对 Miden 的审计并不只是让模型直接查看源代码。其 agents 在正式审查开始前构建了 LSP server、反编译器、静态分析引擎和 Lean 模型。

这些准备工作揭示了一个据称约束不足的值,恶意证明者可能利用它伪造 Falcon 签名并耗尽受影响账户中的资产。分析器还识别出 400 多处可以加强类型验证的位置。与此同时,形式化验证工作产出了 95 项经机器检查的正确性证明,并发现了现有单元测试遗漏的两个 bug。

关键并不在于 AI agents 与人类审计师之间的较量,而在于直接使用 AI 审查代码,与借助 agents 构建使复杂代码审查成为可能的基础设施之间的区别。Trail of Bits 仍依赖人工监督、人工定理审查以及传统安全判断。agents 改变的是哪些配套项目在经济上切实可行。

Trail of Bits 的 Miden 审计提前六个月启动

决定性的工作在审计师拿到待审查的完整目标之前就已开始。

根据该公司详尽的 Miden 审计记录,Miden 团队在 2025 年末联系了 Trail of Bits。Miden 希望在发布前审查其零知识虚拟机的部分组件。其中一部分涵盖核心库,该库包含以 Miden Assembly(MASM)编写的密码学原语。

零知识虚拟机,通常简称 zkVM,能够证明程序已正确执行,而无需每个验证者重复执行该计算。Miden 采用栈机器架构:指令从栈中消耗值,再将结果放回栈中。

这一架构之所以重要,是因为 MASM 代码中的输入和输出往往是隐式的。审查者必须追踪每条指令如何改变栈状态,再将该状态贯穿于分支、循环和过程调用之中。熟悉的源代码层级线索可能会消失。

MASM 还缺少审计师通常期待的大部分工具。它几乎没有编辑器支持,没有适用于审查的成熟语言服务器,对核心库的自动化分析能力也有限。Trail of Bits 知道该实现尚未功能完备,但也知道距离审查还有六个月。

该公司利用这段窗口期构建了自己的审查环境。Trail of Bits 表示,Claude 在几天内就产出了初始语言服务器原型。最终形成的 MASM language server 提供导航、引用发现、悬停文档、语法诊断、指令说明和栈效应信息。

这些功能听起来像是普通的开发便利工具。但在一种陌生的汇编语言中,它们会成为安全方法的一部分。导航帮助审计师跨越过程边界追踪一个值;内联栈效应减少重复的人工重建;诊断则在假设演变为发现之前将其暴露出来。

随后,Trail of Bits 将项目扩展至反编译、静态分析、命令行工具和形式化建模。Claude 负责规划与实现任务,Codex 则参与代码审查。agents 还会互换角色,为生成的工作提供独立的审查环节。

这并非一次性生成流程。实现一项功能后,团队要求 agents 反编译随机生成的过程,并将结果与原始 MASM 对比。回归问题会变成测试,模型随后再围绕这些测试开展工作。

这一反馈循环是故事的核心。团队并未将 agents 视作输出理应被自动信任的权威。它们是在一个不断扩展的验证系统中运作,该系统包含测试、审查阶段、分析器,以及后续加入的证明检查器。

因此,这次审计的起点不同于通常的做法。Trail of Bits 不只问 agent 能否发现漏洞,还问:哪些缺失的工具阻碍了包括 agents 在内的审计师首先理解代码。

这种范围的变化为最终发现创造了条件,也给那些主要将 AI 审查宣传为更快源代码扫描的安全团队带来了压力。Trail of Bits 的方法需要更多前期准备,但将这些准备转化为可复用的技术基础设施。

反编译器比其输出更有价值

反编译器最重要之处在于,其内部表示为其他分析提供了可靠的运行基础。

反编译 MASM 并不只是用易读表达式替换汇编指令。大部分核心库过程没有声明签名,因此工具往往必须根据上下文推断其输入与输出。过程也缺少统一的调用约定。

循环带来了另一个问题。MASM 的 while 循环不必在每次迭代之间维持相同的栈形状。其条件可能移动到另一个栈位置,从而破坏为指令输入分配稳定名称的简单尝试。

条件分支也可能产生不同的栈效应。如果一个分支增加一个项目,另一个分支移除一个项目,反编译器就不能盲目合并两者状态。栈效应推断中的错误随后可能传播至每个调用相关代码的过程。

Trail of Bits 通过限制承诺来应对这一点。其 MASM decompiler 针对定义明确的子集,而非宣称可以完美恢复每一个过程。这一选择将正确性置于表面覆盖率之上。

反编译器成为该项目中投入最大的工具建设工作。Trail of Bits 报告称,数月间完成了 100 多次由 AI 生成的提交。然而,最终的伪代码并非其最具影响力的产出。

项目构建了一种中间表示(IR),将过程的输入和输出表达为可分析的表达式。IR 是为转换或分析而设计的结构化代码形式。MASM 指令一旦以这种形式存在,团队就可以应用成熟的数据流与静态分析技术。

分析器可以询问由证明者提供的值是否在使用前经过验证。它能够追踪代码是否强制执行预期类型,例如 32 位整数或布尔值。它还可以确定局部变量是否在所有可能的执行路径上都已初始化。

Trail of Bits 在部分工作中使用了抽象解释。抽象解释评估的是可能值的类别,而不是使用一个具体输入执行程序。一个值可能被表示为有效的 32 位整数、布尔值或未知值。

分析会重复进行,直至达到不再出现新信息的稳定状态。若设计得当,它会对真实执行可能做出的行为进行过近似。这可能产生误报,但不应悄然排除模型覆盖的真实行为。

这说明了为什么 Trail of Bits 对 Miden 的审计不同于普通的 AI 编程演示。由 agent 生成的反编译器并未被信任来判定代码安全。它帮助构建了一个基础层,供明确、可检查的分析在其上运行。

该工作流同样为人类带来收益。反编译后的过程使编辑器中的高层控制流与数据流更易审查。栈注释减少了心智负担。命令行接口则让自动化审查流程也能使用相同能力。

对于评估编程 agents 的团队而言,这里有一个更广泛的启示:最有价值的生成产物未必是用户能看到的东西。如果其解析器、控制流模型和 IR 能解锁多项更高价值的检查,一个覆盖范围有限的反编译器依然可能值得投入成本。

这一结论也改变了团队保存项目上下文的方式。Agent prompts、回归案例、架构决策和审查者评论都会成为持久的工程输入。一套可搜索的知识库可以帮助这些材料在长期安全项目中持续可用。

直接使用 AI 审查通常从目标代码开始,并要求其找出缺陷。Trail of Bits 则利用 agents 改变了审查面。接下来的结果说明了这种区别为何重要。

一项缺失检查触及 Falcon 身份验证

据称,一个未经验证的余数让算术辅助程序变成了伪造身份验证的路径。

审计期间,静态分析识别出 400 多处可加强类型验证的独特位置。Trail of Bits 表示,它们全部可从核心库的公共 API 访问。许多问题源于:对外暴露的过程可能在调用时不具备原作者预期的前提条件。

公共过程不能安全地假设每位调用者都会提供预期类型的值。在证明系统中,区分由证明者提供的值与受证明约束的值尤为重要。仅将数据放入计算,并不能证明它代表所声称的整数或布尔值。

这一高严重性发现聚焦于 mod_12289,该过程将一个 64 位值对 12,289 取模。证明者通过 advice 机制提供商和余数。Advice 值是在 VM 外部计算的执行提示,通常用于避免 VM 内部成本高昂的计算。

商经过检查,以确认其符合预期的 64 位表示;但余数在进入 u32overflowing_sub——一条 32 位减法指令——之前,没有得到等效验证。

Trail of Bits 表示,攻击者能够改变商和余数,同时仍满足减法约束。这使 mod_12289 可以返回不同于数学上正确余数的结果。

该 bug 的影响并不止于错误的算术结果。该过程支持 Falcon 签名验证。Falcon 是一种后量子数字签名方案,Miden 在账户身份验证中使用了它的一个变体。

据 Trail of Bits 称,恶意证明者可能利用这个约束不足的值伪造 Falcon 签名,并耗尽由 Falcon 密钥对控制的账户资产。这是该公司的技术主张,而非公开文章中展示的、经独立复现的攻击利用。

其严重性源于 Miden 的执行模型。Miden VM design 支持在生成证明时提供的非确定性输入。这些输入能够提高效率,但程序必须对它们施加谨慎约束。

验证者不会推断开发者的意图。它只检查提交的证明是否满足已编码的约束。如果这些约束接受无效余数,即使所声称的算术关系不成立,证明依然可能有效。

这正是核心的反转:零知识证明可以证明指定系统被忠实执行,但无法修复不完整的规范。对一个约束不足程序的密码学证明,可能会让人对错误的性质产生信心。

来自后续一项独立 Miden 合约审计 的背景信息强化了这一总体观点。OpenZeppelin 将 Miden 交易描述为:当存在相应证明时即为有效,这使得每项 MASM 检查都成为证明者必须满足的约束条件之一。

这项独立工作覆盖的是不同的代码库范围,不应与 Trail of Bits 的审查混为一谈。不过,两份报告都表明,认证逻辑、由证明者控制的输入以及链上假设都需要得到明确处理。

超过 400 处类型验证位置也应谨慎解读。它们并未被描述为 400 个可被利用的漏洞,而是代表了可改进验证的地方;其中报告了一项高严重性问题。

这一差异很重要,因为静态分析往往会发现需要分诊处理的条件。可靠的分析器可能会有意报告更多案例,而其中只有一部分最终会成为安全缺陷。它的价值在于系统地定位值得检查的假设。

对安全团队而言,这一结果对一种常见捷径提出了挑战:在没有先对目标语言的值规则建模之前,就让智能体概括可疑函数。模型可以解释代码表面上在做什么;分析器则可以追问,每一种被允许的执行是否都确实遵守了所需的类型要求。

Falcon 的发现来自两种能力的结合。智能体加快了工具构建,而静态语义将关于证明者控制数据的直觉转化为可重复执行的检查。

Lean 证明发现了单元测试遗漏的问题

形式化验证并未取代测试,但它迫使团队以足够精确的方式陈述行为,从而暴露出两项未经测试的失败情况。

即使在构建编辑器和静态分析工具之后,Trail of Bits 仍继续进行形式化建模。问题刻意有所不同:如果一个库过程不包含明显缺陷,团队能否证明其实现符合预期的算术行为?

该公司在 Lean 中构建了一个最小化的 Miden VM 执行器。Lean 是一款交互式定理证明器,其精简的可信内核会检查提交的证明是否遵循其定义和假设。Claude 还帮助构建了一个将 MASM 过程转换为 Lean 表示的转换器。

随后,多名智能体并行处理过程证明。最终形成的 MASM Lean 模型 包含可执行的 VM 语义、转换后的过程、共享证明支持以及各个正确性定理。

该代码库列出了 95 个已检查的过程证明:31 个针对 64 位操作,36 个针对 128 位操作,17 个针对 256 位操作,11 个针对字操作。它们共同覆盖了 Trail of Bits 所描述的二进制算术部分。

这些并不是对 Miden 每个部分都安全的证明。它们针对的是特定过程已定义的正确性属性。这一边界至关重要,因为定理证明器验证的是提交给它的定理,而非开发者头脑中未被陈述的意图。

Trail of Bits 表示,因此人工审查者将重点放在审计定理陈述上。如果某个智能体证明的定理遗漏了关键前置条件,或表达了错误结果,那么仅凭内核接受也无法使软件变得正确。

从高层看,许多定理遵循一种容易识别的模式。给定包含特定输入的栈,执行某个过程应当终止,并在栈顶留下数学上预期的结果。与调用者相关但不属于该过程的栈值应保留在预期位置。

这种规格压力暴露了现有单元测试遗漏的两项缺陷。第一项影响名为 rotr 的 64 位右旋过程。当旋转量为 32 的倍数时,对于大于 Goldilocks 素数的大输入,它的行为不正确。

Goldilocks 素数定义了 VM 使用的有限域,因此接近或超出该边界的值需要谨慎表示。在证明工作中,如果不加入排除该问题移位情况的假设,所需定理便无法成立。

证明失败并不自动意味着代码存在漏洞。定理、模型或辅助引理同样可能有误。在这里,对阻碍因素的人工审查最终让团队发现了实现中的边界情况。

第二个漏洞出现在 256 位 wrapping_mul 过程中。Trail of Bits 表示,它在返回前从栈中移除了属于调用者的值。对乘法结果进行常规测试可能通过,却未能检查周边栈状态是否得到保留。

这一缺陷说明了精确后置条件的重要性。一个过程可能计算出正确的数值答案,却违反了其调用契约。在栈机器中,损坏相邻状态即使栈顶项看起来正确,也可能影响后续执行。

单元测试仍发挥着核心作用。它们执行迅速,可防止已知回归,并覆盖尚未拥有形式化模型的集成行为。Lean 工作则针对明确陈述的属性提供了另一类保障。

关键优势在于组合性。智能体可以大规模生成证明尝试,而 Lean 的内核会拒绝无效推导。人类无需信任模型在文字表述中的自信程度;他们需要审查定义,并确认被接受的定理代表了预期保障。

这比让另一个语言模型判断生成的代码看起来是否正确,形成了更强的控制边界。它并未消除人工判断,但将这种判断转向规格和假设。

对于工程负责人而言,该案例提出了一种实用的分工方式。智能体可以生成重复性的证明脚手架、转换器和候选引理。人类专家则决定必须证明什么,并调查关键陈述为何失败。

这一结果并不意味着自主审计值得信赖

该项目支持由智能体辅助的审计工程,而非无人监督的安全认证。

Trail of Bits 直接阐述了经济层面的变化。几年前,该公司很难证明为一次项目投入数月进行探索性工具开发是合理的。这类附带项目结果不确定,在其价值显现之前也难以销售。

该公司认为,智能体降低了探索成本,足以改变这一计算方式。失败的实验越来越多地消耗 token 和监督时间,而不再需要完整投入专业工程人力。

这一说法值得谨慎解读。审计前仍历时六个月,仅反编译器就累计了超过 100 次由 AI 生成的提交。公开说明未提供受控对比,包括人员工时、模型总成本,或相较于传统项目的缺陷产出。

它也未证明智能体能为每一种特殊语言构建等效工具。MASM 具备有利于分析和形式化建模的特性。Miden VM 的指令集紧凑,且许多操作避免了复杂副作用。

即使在这一有利目标中,反编译器也无法安全覆盖每个过程。Trail of Bits 缩小了其支持的子集,因为不一致的栈效果和缺失的签名使完整、可靠的反编译变得不切实际。

Lean 工作流还有另一项限制。经内核检查的证明仅在已建模语义下确立所陈述的定理。错误翻译的指令、不完整的 VM 模型或薄弱的定理,都可能使已证明行为与真实部署之间保留差距。

人工审查在整个过程中始终清晰可见。审计人员审查智能体生成的代码,将回归问题转化为测试,检查定理陈述,并分析失败的证明。Claude 和 Codex 在开发与审查之间交替,而非作为未经观察的权威独立运行。

这使主要比较更加鲜明。直接 AI 审查要求模型在既有表示中识别漏洞。构建工具的智能体则帮助专家创建一种表示,使缺失约束、无效类型和错误后置条件变得明确。

两种方法都不应单独存在。模型可以提出静态分析器未编码的假设。静态分析可以覆盖概率型审查者可能遗漏的执行路径。形式化证明随后可以按照机器可检查的标准处理选定属性。

这一过程也带来维护义务。解析器必须跟随语言变化。分析器需要回归测试套件。形式化模型必须持续与 VM 语义保持一致。过时的生成工具可能制造虚假的安全感。

Trail of Bits 报告称,Miden 团队已为未来核心库更新采用静态分析引擎。这是一个重要信号,因为它让工具超越了单次审计快照。持续使用将检验分析器能否在语言和库演进过程中继续保持实用性。

考虑类似工作流的组织还应规划可追溯性。团队需要了解哪一个模型生成了变更、哪位人工审查者进行了审查、运行了哪些测试,以及哪些假设被纳入证明。工程工作流 的可审查程度,取决于围绕它保存的记录。

因此,公开证据支持一个有边界的结论:智能体让这一项目雄心勃勃的准备计划成为可能。安全保障仍来自领域专家、测试、明确分析与证明检查组成的综合体系。

这一体系比“AI 发现了一个漏洞”的说法更有意思。它为如何使用并不完美的智能体提供了具体模型,而不将其自信视为证据。

三项信号将检验这一审计模式能否延续

下一项检验在于:智能体构建的保障工具能否在头条发现之后仍保持正确、被采纳并富有成效。

第一个信号是 MASM 分析器能否持续融入 Miden 的开发流程。Trail of Bits 表示,Miden 团队已为未来核心库变更采用静态分析引擎。在持续集成中例行使用,将强化审计工具能够成为预防性基础设施的论点。

重要衡量标准不是它发出了多少警告,而是在发布前新的公开过程是否接受了所需验证,以及分析器更新是否跟踪 MASM 语义变化。持续的误报或过时模型都会削弱这一成果。

第二个信号是对 95 个 Lean 证明的扩展与维护。新增经验证过程将表明,初始模型支持持续工作,而非固定演示。对现有算术代码的改动也应触发证明更新或失败。

应关注转换后的代码与人工审查规格之间的边界。若自动化仅增加证明数量,却未加强定理覆盖范围,就无法提供同等保障。随着规模扩大,对假设的清晰记录将与原始总数同样重要。

第三个信号是其他审计团队和语言生态系统的复现。Miden 呈现出一种异常适合的组合:自定义语言、缺失工具、明确的证明语义以及数月的准备时间。

如果这一模式能在不同 zkVM 或低级语言中重复出现,将支持 Trail of Bits 更广泛的经济性主张。若无法在具有并发、复杂内存或庞大依赖图的系统上复现,则将揭示其局限。

Trail of Bits 的 Miden 审计已经产出了超越推测性工作流的成果。它交付了编辑器集成、反编译器、分析器、VM 模型、已检查证明以及具体的安全发现。

更持久的问题在于,团队能否让这些产物始终与它们所保护的系统保持一致。评估智能体辅助安全的开发者应审查代码库,检查建模假设,并追问哪些位置可由机器验证的控制措施替代对模型的信心。这才是下一次审计应当坚持的标准。

 
 

免费开始使用

一款本地优先的AI助手

为了获得更好的人工智能体验,

remio 目前仅支持Windows 10+ (x64)和M-Chip Mac 。

你的 AI 工作伙伴

和 remio 一起高效工作

规划、创作、交付

一站式完成

bottom of page