前言&背景
北京时间 2022 年 10 月 7 日,BNB Chain 跨链桥遭遇黑客攻击,额外增发盗走了约 200 万枚 BNB,价值 5.66 亿美元
新旧链
币安有两条链:
- 币安链,BC(Binance Chain);尚未开源,代码架构采用了 Tendermint
- 币安智能链,BSC(Binance Smart Chain);兼容 EVM,代码架构沿用 Ethereum
ps:币安官方于 2022 年 2 月 15 宣布合并老链与新链(生态合并统一名称,非物理合并),并更名为 BNB Chain
跨链
- BSC relayer,拉取 BC 块头和跨链数据包
- Oracle relayer,拉取 BSC 跨链数据包,针对 BC 的预言进行声明


攻击分析
基本信息
- Hacker:0x489A8756C18C0b8B24EC2a2b9FF3D4d447F79BEc
- Token Hub:0x0000000000000000000000000000000000001004
- Relayer Hub:0x0000000000000000000000000000000000001006
- Cross Chain:0x0000000000000000000000000000000000002000
- Hack tx1:0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b
- Hack tx2:0x05356fd06ce56a9ec5b4eaf9c075abd740cae4c21eab1676440ab5cd2fe5c57a
攻击流程

通过 Relayer Hub 合约缴纳 100 BNB 注册成为 relayer
tx:0xe1fe5fef26e93e6389910545099303e4fee774427d9e628d2aab80f1b53396d6

注册成为 relayer 之后,才可调用跨链桥的 handlePackage 函数进行跨链操作




调用跨链桥合约 handlePackage 函数,增发 100W BNB
tx1:0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

handlePackage 函数中会使用 MerkleProof.validateMerkelProof() 方法校验 proof 数据的合法性

内联汇编调用 0x65 地址的预编译合约





至此,BSC 公链代码部分流程分析完毕,最终流程指向 cosmos 的 IAVL 库,后续跟进调用流程较冗长,可跳至结尾
IAVL 库流程跟进
https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_iavl_value.go#L87

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_range.go#L178

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_range.go#L186

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_range.go#L213

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_path.go#L30

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof_path.go#L70

https://github.com/cosmos/iavl/blob/6c1300ae54a9bb851e77dbcc4ba4b21832279027/proof.go#L64

攻击者构造的数据中始终使用了相同的高度 110217401
该高度的原始跨链数据包 proof
https://bscscan.com/tx/0x79575ff791606ef2c7d69f430d1fee1c25ef8d56275da94e6ac49c9c4cc5f433

后续资金
90 万枚 BNB 抵押在 Venus 协议,借出 6250 万 BUSD、5000 万 USDT、3500 万 USDC
跨链到 Ethereum、 FTM、Arbitrum、Avalanche、Polygon、Optimism
后续处理及修复
BSC 官方
10 月 7 日,攻击发生后第一时间升级 BSC 源码,添加黑名单


10 月 11 日,代码层修复漏洞,添加判断

Cosmos
10 月 9 日,修复漏洞,添加判断

随后的 commit 添加了判断,当 Left 和 Right 都不为空时抛出错误

总结&影响
黑客质押 100 BNB 成为 Relayer 之后,通过伪造 IAVT Tree 的 proof ,由于 BSC 跨链桥采用的 Cosmos 的 IAVL 库,该库的验证存在缺陷,proof 可填充恶意数据,导致通过了该恶意数据的验证,增发了大量 BNB。
- 第三方开源库的安全性
- 底层架构复杂,问题难以发现
- 舆论影响,中心化
10 月 24 日,CZ 表示在执法部门帮助下,缩小了攻击者身份范围,被盗资金能冻结 80%~90%,大约 1 亿美金无法追回,实际损失要小得多
参考链接
https://foresightnews.pro/article/detail/15703
https://www.8btc.com/article/6781172
https://mp.weixin.qq.com/s?__biz=MzU2NzUxMTM0Nw==&mid=2247500129&idx=1&sn=dd1255a5f432c1f237ca927f8ad81e8c&chksm=fc9e913dcbe9182be865517d65a81ccfb4824aa406803eb4a1ff0ed2970fb577d55c579afda6&scene=21#wechat_redirect