Bybit事件的理解
refer to:
https://www.certik.com/zh-CN/resources/blog/3wI26AFKF1UtSDjJEXNEDM-bybit-incident-technical-analysis
https://www.bitpush.news/articles/7321502
下面的图就不放了。见certik 的链接。
一、总结
通过web2 + web3 方式发起的组合攻击。大概是 70%依赖钓鱼(伪造)攻击,30%则是科学家攻击(利用区块链的智能合约的特性)
二、基本的攻击过程
1.(web2)攻击方伪造转账UI:让Bybit的3个人员,在把资产进行转账签名时,以为是做一个普通的转账交易。当他们点击确认后,实际上发起的是一个更新合约的操作。
2.Bybit员工用的冷钱包的转移操作,是使用了gnosis safe这个合约。
3.(web3)攻击方获得了一次为所欲为的机会。所以:
3.1 使用提前部署好的恶意合约A,利用delegateCall 这个函数,修改了gnosis 合约的参数,使之可以调用合约B
3.2 恶意合约B中包含了2个函数,sweepETH()和sweepERC20(),一次调用,就转走了所有资产。
三、值得关注的点
1.本次攻击成功,传统的web2手法占比更重。 钓鱼(伪造)的水平很厉害。做到了:
a)知道bybit的人员所使用的钱包的界面(或者对应的软件)
b)伪造该界面
c)估计进一步渗透到了bybit人员的工作电脑中。
d)现在真实的情况尚未披露.
2.bybit为什么不直接使用冷钱包的转账功能?
答:为了多签,这种机制更适合大交易所。避免了单签的 单点风险。
多签更加适合责权分离。适合设计和监管。
3.链上钱包是每次操作都需要签名授权的,所以黑客是设计好的逻辑,一次签名,所有资产全都取出。
4.delegateCall 属于EVM的原罪漏洞,是web3黑客最常见的利用手段,很难彻底规避:
a)Caller 来调用 callee (合约1),然后合约1调用合约2的方法
b)只要合约2跟合约1的member变量类型和顺序一致,就可以修改合约1的变量
四、完整的攻击过程
1.黑客提前部署了2个合约
a)恶意合约1 0x...7242(用来升级 gnosis safe相关的合约,使之调用恶意合约B)
b)恶意合约2 0x..9516(用来转账)
2.Bybit的3个员工准备做一笔操作,把资金从冷钱包 ( 转移到‘温钱包’。
3.3个员工从电脑的操作界面上看,本次操作是一次普通的转账操作 ( transfer(addres, uint256)) ,此时已经入套。
4.当3个员工都做了签名之后,该交易被链上的GnosisSafe合约执行,产生了一个Proxy 合约。
(本次交易地址: https://etherscan.io/tx/0x46deef0f52e3a983b67abf4714448a41dd7ffd6d32d32da69d62081c68ad7882 )
5.Proxy合约通过delegateCall调用了恶意合约1的代码,自身的变量被修改为恶意合约2.
下图可见,operation这个参数是1. 表示需要执行delegateCall.
下图是恶意合约1的源代码,用来触发恶意合约2:
6.恶意合约2的代码被执行。所有资产被一次转出。
下图是具体的方法的调用链:
下图可见,恶意合约2中的两个方法:sweepETH , sweepERC20, 甚至可以看到还很贴心的做了地址校验。只黑这个地址。 Orz
7.黑客的首次收款地址为:
https://etherscan.io/address/0x47666fab8bd0ac7003bce3f5c3585383f09486e2
8.黑客在过去3天内做了4370次转账或者混币操作,现在难以溯源。
参考资料
https://www.certik.com/zh-CN/resources/blog/3wI26AFKF1UtSDjJEXNEDM-bybit-incident-technical-analysis