Circom的价值验证
2019年10月,安全研究人员在以太坊隐私混币器Tornado.cash中发现致命漏洞。该系统采用零知识证明(ZKP)技术实现资金匿名存取,但因ZKP电路缺陷,攻击者可伪造存款证明任意提取资金。开发团队通过紧急转移资金并修改两个字符(将=
替换为<==
)完成修复。
Circom工作原理
作为领域专用语言(DSL),Circom通过以下方式构建ZKP系统:
- 约束定义:开发者描述计算过程及输入输出信号约束
- 编译器生成:自动创建证明者(Prover)和验证者(Verifier)
- 双重验证机制:
<--
操作符仅执行赋值===
操作符添加验证约束<==
合并上述功能(关键安全特性)
Tornado.cash漏洞解析
漏洞根源在于MIMC哈希函数实现时错误使用赋值操作符=
(等效于<--
),导致验证阶段未约束输出信号。Circomspect可检测此类"未约束信号"问题,其分析流程包括:
- 抽象语法树转换
- 静态单赋值形式转换
- 数据流分析
Circomspect核心功能
-
检测能力:
- 未约束信号
- 未使用变量
- 变量声明遮蔽
- 可疑赋值操作(自动建议
<==
替换)
-
实战案例: 分析
circom-pairing
库时发现:1 2 3 4
function find_Fp_inverse() { // 检测到冗余计算链:y→newv→v→y // 这些变量不影响最终输出 }
ZKP工具链进化
Trail of Bits持续完善ZKP安全工具矩阵:
- Amarna:Cairo语言静态分析器
- Circomspect:支持以下安装方式:
1 2
cargo install circomspect # 或从GitHub仓库获取
特别提示:所有ZKP开发者都应警惕验证约束缺失问题,这是智能合约审计中最常见的高危漏洞类型。