慢雾:QBridge遭受攻击,对充值代币进行白名单检查后未检查是否为native代币

2022-01-28 14:36:44

据慢雾区,Qubit的QBridge遭受攻击损失约8000万美元。 1. 攻击者通过ETH上QBridge合约进行存款操作,存款时传入所要跨的目标链destinationDomainID、所要跨链资产resourceID及跨链资金数量与接收地址等参数构成的data。 2. 攻击者指定传入resourceID为跨ETH代币所需值,但调用QBridge的deposit函数,因此首先绕过跨链资金数量与msg.value检查。由于攻击者传入的是真实跨ETH代币所需要的值所以可以顺利调用handler合约的deposit函数。 4. handler合约的deposit函数中会根据resourceID取出的所要充值的代币是否在白名单内进行检查,由于攻击者传入的resourceID对应ETH,因此映射中取出的所要充值的代币为0地址,即会被认为是充值ETH而通过白名单检查。但deposit函数中却并没有对所要充值的代币地址再次进行检查,随后直接通过safeTransferFrom调用所要充值的代币的transferFrom函数。 5. 由于所要充值的代币地址为0地址,而call调用无code size的EOA地址时其执行结果都会为true且返回值为空,因此通过transferFrom的转账操作通过safeTransferFrom的检查,最后触发Deposit跨链充值事件。 6. 由于传入的resourceID为跨ETH所需要的值,因此触发的Deposit事件与真正充值ETH的事件相同,这让QBridge认为攻击者进行ETH跨链,因此在BSC链上为攻击者铸造大量qXETH。攻击者利用此qXETH凭证耗尽Qubit借贷池。 本次攻击的主要原因在于对白名单内代币进行转账操作时未对其是否是0地址再次进行检查,导致本该通过native充值函数进行充值的操作却能顺利走通普通代币充值逻辑。