Scroll今晚这份事故报告,比"未被利用"四个字有意思多了。
去翻了论坛原帖(11/11 14:24 UTC)。出问题的是主网 bundle proof 验证合约 ZkEvmVerifierPostFeynman(0x7966…B254)。它手工拼输入,用 raw staticcall 去调 OpenVM 2.0 的 Halo2 验证器,而调用的前4个字节直接取自提交者给的 proof。OpenVM 2.0 那边正好有个带类型的 verify 函数,selector 是 0x24270d54。proof 以这4个字节开头,就不走 fallback 而是进了这个函数,公开输入从调用方控制的位置读。结果:一份旧的有效证明,可以拿来给新的状态根和提款根背书。翻译成人话,理论上能确认一个凭空捏造的提款根,桥里的钱就是靶子。
讽刺在这。这个合约是9月22日 OpenVM v2.0 升级时部署的,当时公告写的升级动机之一就是修 v1.7.0 的安全公告,其中一条叫"OpenVmHalo2Verifier self-call can bypass proof verification",也是验证器 wrapper 层的绕过。那次还被定性为维护升级,只发公告不走投票。修了 wrapper 层一个洞,换上来的新合约在同一层又开了个洞,挂了49天(9/22到11/10)。
为什么没出事?报告自己写了:利用需要获许可的 prover 角色,或者连续7天没有最终确认后才开放的强制批次模式。漏洞合约在线期间748次最终确认都是正常证明,强制模式从没打开过。
所以这49天真正兜底的不是ZK数学,是"只有Scroll自己的prover能交证明"。平时大家骂L2 prover中心化,这次恰恰是中心化守住了门。更扎心的是反过来看:为抗审查设计的那个7天逃生舱,一旦被触发,就成了任何人都能用的攻击入口。
披露本身我给好评。白帽 ZHOUCHUNGONG 11/3 报告,11/10 注册修复合约,新地址、修复PR、注册交易全贴了,还附了让人自己核验的步骤,比很多项目强。但"有validity proof就不用信运营方"这套话,这次是被自家报告亲手拆的。拿着L2资产的,别只问是不是ZK,要问prover谁在跑、验证合约多久换一次、换的时候有没有投票和审计。赏金多少、新合约有没有外部审计,报告没写,我也不瞎猜。
#Scroll #以太坊L2
去翻了论坛原帖(11/11 14:24 UTC)。出问题的是主网 bundle proof 验证合约 ZkEvmVerifierPostFeynman(0x7966…B254)。它手工拼输入,用 raw staticcall 去调 OpenVM 2.0 的 Halo2 验证器,而调用的前4个字节直接取自提交者给的 proof。OpenVM 2.0 那边正好有个带类型的 verify 函数,selector 是 0x24270d54。proof 以这4个字节开头,就不走 fallback 而是进了这个函数,公开输入从调用方控制的位置读。结果:一份旧的有效证明,可以拿来给新的状态根和提款根背书。翻译成人话,理论上能确认一个凭空捏造的提款根,桥里的钱就是靶子。
讽刺在这。这个合约是9月22日 OpenVM v2.0 升级时部署的,当时公告写的升级动机之一就是修 v1.7.0 的安全公告,其中一条叫"OpenVmHalo2Verifier self-call can bypass proof verification",也是验证器 wrapper 层的绕过。那次还被定性为维护升级,只发公告不走投票。修了 wrapper 层一个洞,换上来的新合约在同一层又开了个洞,挂了49天(9/22到11/10)。
为什么没出事?报告自己写了:利用需要获许可的 prover 角色,或者连续7天没有最终确认后才开放的强制批次模式。漏洞合约在线期间748次最终确认都是正常证明,强制模式从没打开过。
所以这49天真正兜底的不是ZK数学,是"只有Scroll自己的prover能交证明"。平时大家骂L2 prover中心化,这次恰恰是中心化守住了门。更扎心的是反过来看:为抗审查设计的那个7天逃生舱,一旦被触发,就成了任何人都能用的攻击入口。
披露本身我给好评。白帽 ZHOUCHUNGONG 11/3 报告,11/10 注册修复合约,新地址、修复PR、注册交易全贴了,还附了让人自己核验的步骤,比很多项目强。但"有validity proof就不用信运营方"这套话,这次是被自家报告亲手拆的。拿着L2资产的,别只问是不是ZK,要问prover谁在跑、验证合约多久换一次、换的时候有没有投票和审计。赏金多少、新合约有没有外部审计,报告没写,我也不瞎猜。
#Scroll #以太坊L2