qubit 攻击分析

合约代码:
QBridge:https://etherscan.io/address/0x99309d2e7265528dC7C3067004cC4A90d37b7CC3#code
QBridgeHandler:https://etherscan.io/address/0x99309d2e7265528dC7C3067004cC4A90d37b7CC3#code
攻击交易:
https://etherscan.io/tx/0x478d83f2ad909c64a9a3d807b3d8399bb67a997f9721fc5580ae2c51fab92acf
设置0地址白名单交易:
https://etherscan.io/tx/0xe3da555d506638bd7b697c0bdf7920be8defc9a175cd35bf72fb10bc77167b66

在合约QBridge中有函数depositdepositETH代码功能几乎相同,分别调用handler的depositdepositETH
但handler中函数deposit

 function deposit(bytes32 resourceID, address depositer, bytes calldata data) external override onlyBridge {
        uint option;
        uint amount;
        (option, amount) = abi.decode(data, (uint, uint));

        address tokenAddress = resourceIDToTokenContractAddress[resourceID];
        require(contractWhitelist[tokenAddress], "provided tokenAddress is not whitelisted");

        if (burnList[tokenAddress]) {
            require(amount >= withdrawalFees[resourceID], "less than withdrawal fee");
            QBridgeToken(tokenAddress).burnFrom(depositer, amount);
        } else {
            require(amount >= minAmounts[resourceID][option], "less than minimum amount");
            tokenAddress.safeTransferFrom(depositer, address(this), amount);
        }
    }

未校验tokenaddress地址是否为合约(同时将地址0x000000000…00设置为默认eth地址),导致在调用tokenAddress.safeTransferFrom(depositer, address(this), amount);时,由于 tokenAddress 地址为 0 地址,而 call 调用无 code size 的地址时其执行结果都会为 true 。最后触发了Deposit事件,跨链铸造了大量qXETH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值