Vyper 被黑的时间线和反思
"Trust but verify"(信任,但要核查),不要做“事后诸葛亮”。最厉害的 bug 都是灯下黑。
由于合约的不可变性, 项目会隐性依赖多年前编写的代码, 我们在修复 bug 时,就更需要注意它的潜在影响。
这次的事情是这样发生的。
时间线
在本文中,我会用“我们”来指代所有为这次事件努力的人。我觉得,虽然我最初对发现漏洞作出了一些贡献,但在整个过程中,有无数人提供了更多的帮助。
13:10 UTC pETH/ETH 1100 万美元[1] 流失。
13:19 UTC Michal 在 ETHSecurity 上发布有关 pETH 价格突然暴跌的消息。
Igor 首先注意到不对劲。多亏了他,我们开始深入调查。
但是机器人是如何在remove_liquidity()调用中重入add_liquidity()的呢?
14:01 UTC 就这个问题组建了一个应急小组。
14:07 UTC 我们用我们最喜欢的反编译器[2]反编译了 JPEGd 合约,并注意到重入保护存储槽有点不同。
// Dispatch table entry for add_liquidity(uint256[2],uint256)
label_0057:
if (storage[0x00]) { revert(memory[0x00:0x00]); }
storage[0x00] = 0x01;
// Dispatch table entry for remove_liquidity(uint256,uint256[2])
label_1AF3:
if (storage[0x02]) { revert(memory[0x00:0x00]); }
storage[0x02] = 0x01;
14:27 UTC 我们通过一个简单的本地测试合约确认了这个问题。
@external
@nonreentrant("lock")
def test(addr: address) -> bool:
returnTrue
@external
@nonreentrant("lock")
def test2(addr: address) -> bool:
returnFalse
这不仅仅是另一个重入 bug。
此时,我们意识到这将产生多大的影响。封锁消息,我们删除了有关该漏洞的公开消息。
14:37 UTC Wavey 帮助确认了存在漏洞的提交和受影响的版本。我和 Charles 通过手动检查 Vyper 编译器输出也证实了这一点。
这是一场与黑客的竞赛。
值得庆幸的是,人们还将其与只读重入混淆。摘自 “Web3 安全警报” 频道-Alchemix 和 Metronome DAO 也因只读重入 bug 遭到黑客攻击[3]
Michael 发现运行 0.2.15 版本的 alETH 和 msETH 池也存在潜在漏洞。
- 星际资讯
免责声明:投资有风险,入市须谨慎。本资讯不作为投资建议。