深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里?

2022年10月08日17:51:28 科技 1248

事件背景

北京时间2022年10月7日凌晨,BNB Chian跨链桥BSC Token Hub遭遇攻击。黑客利用跨链桥漏洞分两次共获取200万枚BNB,价值约5.66亿美元。

漏洞分析

BSCTokenHub是BNB信标链(BEP2)和BNB链(BEP20 或 BSC)之间的跨链桥。BNB链使用预编译合约0x65验证BNB信标链提交的IAVL的Proof,但BNB链对提交的Proof边界情况处理不足,它仅考虑了Proof只有一个Leaf的场景,对多个Leaves的处理逻辑不够严谨。黑客构造了一个包含多Leaves的Proof数据,绕过BNBChain上的校验,从而在BNB链造成了BNB增发。

以其中一次攻击交易为例:0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

黑客构造输入数据payload和proof,输入参数通过validateMerkleProof校验,返回值为true。

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

在后续IApplication(handlerContract).handleSynPackage处理中,合约给黑客增发100万个BNB。

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

函数调用过程

交易首先调用CrossChain合约0x2000的handlePackage函数:

handlePackage会进一步调用MerkleProof.ValidateMerkleProof对输入的proof进行校验:

MerkleProof相关代码可以看到,实际的验证逻辑是使用预编译合约0x65完成:https://github.com/bnb-chain/bsc-genesis-contract/blob/master/contracts/MerkleProof.sol#L66

系统预编译合约0x65对应iavlMerkleProofValidate功能:https://github.com/bnb-chain/bsc/blob/f3fd0f8bffb3b57a5a5d3f3699617e6afb757b33/core/vm/contracts.go#L81

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

系统合约0x65实现代码如下,主要逻辑为使用DecodeKeyValueMerkleProof解码输入参数,并调用Validate进行校验:

https://github.com/bnb-chain/bsc/blob/master/core/vm/contracts_lightclient.go#L106

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

其中kvmp.Validate()实现代码如下:https://github.com/bnb-chain/bsc/blob/master/core/vm/lightclient/types.go#L220-L234

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

DefaultProofRuntime构造函数使用IAVL库进行Proof的验证:

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

IAVL代码问题

IAVL的Proof校验过程中,Hash计算存在漏洞,导致黑客可以在Proof添加数据,但计算Hash时并没有用到添加的数据。详细分析如下:

在len(pin.Left)不为0的分支中,计算Hash并没有使用pin.Right数据。黑客利用该处漏洞构造数据,添加proof.LeftPath[1].Right数据,但是该数据并不参与Hash计算。https://github.com/cosmos/iavl/blob/master/proof.go#L79-L93

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

根据上述分析,正常数据组织结构如下,proof.LeftPath[1].Right为空值,计算得到正确的Hash。

  • proof.LeftPath = len(2)
  • proof.LeftPath[0]是一个正常数据,proof.LeftPath[1].Left是一个正常数据,proof.LeftPath[1].Right空值
  • proof.InnerNodes = len(0)
  • proof.Leaves = len(1),proof.Leaves[0]是一个正常数据

黑客构造攻击数据结构如下,添加proof.LeftPath[1].Right数据,且该数据不参与Hash计算。

  • proof.LeftPath = len(2)
  • proof.LeftPath[0]是一个正常数据,proof.LeftPath[1].Left是一个正常数据,proof.LeftPath[1].Right是一个伪造数据
  • proof.InnerNodes = len(1), InnerNodes[0]=nil
  • proof.Leaves = len(2),proof.Leaves[0]是一个正常数据,proof.Leaves[1]是一个伪造数据
  • 且proof.LeftPath[1].Right = COMPUTEHASH(proof.Leaves[1])

IAVL的Proof校验代码如下,主体逻辑为COMPUTEHASH递归调用。由于lpath.Right也为黑客输入数据,使得黑客构造的数据能够通过bytes.Equal(derivedRoot, lpath.Right)的校验,并返回上一轮COMPUTEHASH通过proof.Leaves[0]计算的结果,该结果为正常数值,从而绕过了IAVL的Proof校验。

https://github.com/cosmos/iavl/blob/master/proof_range.go#L222-L309

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

黑客攻击构造的数据中,包括了IAVL:V和multistore相关数据,multistore数据也是基于IAVL进行操作,原理是一样的,不再进行详细分析。

这次IAVL Proof暴露的问题在于,数据局部的变化无法反应到整体,使得校验发生错误。在Cosmos生态中,IBC使用 ICS23来做数据的校验处理,ICS23与IAVL Proof校验不同点在于,ICS23会对所有的“叶子节点”的值进行数据校验,最后计算得出的根Hash再与链上数据进行校验,OKC采用的是ICS23的Prove,因此不存在BNBChain这次遇到的安全漏洞。

测试验证代码

利用黑客攻击交易数据,基于BNBChain单元测试代码,增加了基于黑客攻击交易的测试用例,可以完整复现黑客的攻击交易。单元测试代码利用iavlMerkleProofValidate.Run接口验证输入数据,即相当于调用预编译合约。https://github.com/BananaLF/bsc/blob/bsc-hack/core/vm/contracts_lightclient_test.go#L99-L100

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

利用黑客攻击交易数据,构造新的payload数据为value := []byte(“okc test hack”),并对proof相应数据进行了修改,即修改proof.LeftPath[1].Right和proof.Leaves[1]对应的数据,新构造的数据可以通过okcIavlMerkleProofValidate校验,即修改了黑客数据也能通过校验。另外,如下单元测试代码对原始黑客数据和修改后的数据两种case都进行了校验,且校验都能成功,从而说明如下测试代码利用本文所述漏洞成功进行了复现。https://github.com/BananaLF/bsc/commit/697c5cd73a755a7c93c0ed6c57d069e17f807958

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

深扒BSC攻击始末,凭空增发200万BNB的“奥秘”在哪里? - 天天要闻

事件过程

1)北京时间2022年10月6日7点27分黑客使用ChangeNOW服务转入了100多个BNB到BSC链上,作为起始攻击资金:0xa84f85e1afc3e1b8ed5111ba16e11325f8fc5d6081cb6958becd6a333f6d0d1d

2)北京时间2022年10月7日0点55分黑客调用系统RelayerHub合约 0x1006 进行注册,成为relayer:0xe1fe5fef26e93e6389910545099303e4fee774427d9e628d2aab80f1b53396d6

3)黑客使用Bsc跨链桥的漏洞执行了两次,总共从里面盗取了200万个BNB:

北京时间2022年10月7日2点26分:https://www.oklink.com/zh-cn/bsc/tx/0xebf83628ba893d35b496121fb8201666b8e09f3cbadf0e269162baa72efe3b8b

北京时间2022年10月7日4点43分:https://www.oklink.com/zh-cn/bsc/tx/0x05356fd06ce56a9ec5b4eaf9c075abd740cae4c21eab1676440ab5cd2fe5c57a

4)黑客使用Venus的借贷服务,抵押了90万个BNB,从里面借走了5000 万 USDT、6250万 BUSD和3500万USDC。

5)黑客使用Stargate跨链桥,将资产转移到ETH,AVAX,FTM等网络上,总计转出资产约为9000万美金。

6)北京时间2022年10月7日6点19分,币安暂停BNBChain链。

目前,OKLink 多链浏览器已标记 BNB Chain 被盗案黑客地址(0x489A 开头),关于此次被盗后续,欧科云链链上卫士团队将进一步追踪案件细节并及时同步。

科技分类资讯推荐

获巨额云计算合同!甲骨文股价创新高 - 天天要闻

获巨额云计算合同!甲骨文股价创新高

智通财经APP获悉,甲骨文(ORCL.US)表示,该公司已签署一项年收入高达300亿美元的单一云计算服务合同,这一金额已超过其当前整个云基础设施业务的规模。受该消息推动,甲骨文股价周一早盘一度上涨8.6%,创下盘中历史新高,收盘涨近4%。今年以来,甲骨文股价已累计上涨约32%。甲骨文在周一提交的一份监管文件中披露,这笔收入...
中金:运营商配合意愿亟待提升 eSIM热度有望重启 - 天天要闻

中金:运营商配合意愿亟待提升 eSIM热度有望重启

智通财经APP获悉,中金发布研报称,根据GSMA Intelligence预测,至2025年底,全球预计将有约10亿eSIM智能手机连接,2030年将增长至69亿,随着消费电子轻薄化、可穿戴设备以及物联网终端漫游需求增加,eSIM的应用有望在2025年加速。但eSIM的应用落地仍面临运营商配合意愿度不高的阻力,支持终端数量有限。eSIM卡具备小尺寸、...
网易腾讯发布暑期限玩日历:未成年人每周限玩3小时 - 天天要闻

网易腾讯发布暑期限玩日历:未成年人每周限玩3小时

随着暑期来临,未成年人网络使用需求显著上升。为防止未成年人沉迷游戏,6月30日,网易游戏、腾讯游戏分别发布了2025年暑期未成年人限玩日历(7月1日-8月31日),两家企业均采取严格时段限制措施,规则基本一致。
“闪灯即推+边推边开”!太原机场开启高效运行新模式 - 天天要闻

“闪灯即推+边推边开”!太原机场开启高效运行新模式

近日,东航MU5273航班在T2站坪顺利完成“闪灯即推+边推边开”新流程操作,这标志着航空器地面高效运行新模式在太原国际机场有限责任公司正式投入应用。资料图 据介绍,太原机场公司二跑道预计在2025年底正式投运。经模拟机测算,航空器地面滑行距离、滑行时间将显著增加。不仅直接冲击航班正常性,也将极大影响机场整体运行...
特斯拉官宣Model 3长续航全轮驱动版28.55万起售 - 天天要闻

特斯拉官宣Model 3长续航全轮驱动版28.55万起售

7月1日,特斯拉官方微博宣布Model 3长续航全轮驱动版车型升级,CLTC续航升至753公里,百公里加速升至3.8秒,售价28.55万元起。特斯拉表示,7月31日(含)前下单,还可享8000元限时保险补贴、5年0息、8000元车漆选装金等购车优惠政策。...
央视新闻报道:全国加能站充电桩配置率达45% - 天天要闻

央视新闻报道:全国加能站充电桩配置率达45%

报名 | 扫描上图二维码,锁定超级沙龙重庆站席位 产品 | 扫描上方二维码提交需求 可高效对接 本文来源 | 中国石油石化6月28日,2025能源产业生态论坛在北京召开。论坛上发布了《中国加油(能)站发展蓝皮书2024-2025》,数据显示,当前,传统加油站正从单一能源供给,向综合服务生态深度转型。《蓝皮书》显示,截至2024年底...
韦东奕,民族的脊梁,崇尚他,国家民族更有前途和希望 - 天天要闻

韦东奕,民族的脊梁,崇尚他,国家民族更有前途和希望

最近,北大韦神韦东奕又“霸屏”了。这位北京大学助理教授、数学科学学院微分方程教研室研究员,因开通个人网络账号,两天涨粉两千万。这是什么概念?一般头部网络主播,即便有团队共同打造账号,要涨粉两千万,没有几年时间也难以达成。这说明什么?
厉害!荣耀400系列三周激活量超70万台 - 天天要闻

厉害!荣耀400系列三周激活量超70万台

上周行业消息显示荣耀400系列全球激活量已经突破100万台,还引起了行业的热议。大家都在讲这一次荣耀400系列的销量确实牛,市场认可度确实高。不过当时给出的是全球数据,并不知道国内与海外的占比。