详解VETH智能合约被攻击事件
(0x75572098dc462F976127f59F8c97dFa291f81d8b)
遭受攻击,被盗 919299个VETH 。成都链安·安全实验室第一时间对本次事件进行跟踪分析。
攻击者利用自建合约
(0x47ed415006c6f8052fff05fe983f31d6d24b8fdb)
通过Uniswap将0.9 ETH兑换为138 VETH,之后对VETH智能合约
(0x75572098dc462F976127f59F8c97dFa291f81d8b)
发起攻击,在攻击完成后自建合约进行自我销毁。
本次攻击成本仅0.9 ETH,约合200美元。 交易
(hash:0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224)
详情如下:
1. 攻击者创建攻击合约,通过Uniswap将0.9 ETH兑换成138 VETH;
2. 调用VETH合约changeExcluded函数,支付128 VETH手续费,使mapAddress_Excluded[excluded]的值为true;
3. 调用transferFrom函数,因mapAddress_Excluded[excluded]的值为true,可以直接进行转账;
4. 攻击完成后,攻击者通过Uniswap将盗取的VETH兑换成16 ETH。
漏洞原理分析
此漏洞产生的主要原因是 changeExcluded函数修饰符为external,使得任何人都可以调用该函数来绕过transferFrom函数内部的授权转账额度检查,将合约的VETH代币盗走 。
首先分析transferFrom函数,在函数内部先进行!mapAddress_Excluded[msg.sender]的判断,按照正常逻辑,该结果为true后,将进行授权转账额度的检查。但是转账函数_transfer的调用放在if语句体外,这就导致攻击者可以通过将mapAddress_Excluded[msg.sender]的值设置为true而绕过授权转账额度的检查,直接进行VETH代币转移。transferFrom函数源码如下图所示:
总结
此次VETH被盗事件,漏洞出自VETH合约而非Uniswap,VETH合约代码的函数访问修饰符的错误使用导致任何人都能绕过授权转账额度的检查,以极低的成本发起攻击。
成都链安·安全实验室在此提醒: 各大智能合约运营商,在合约正式部署上线前应做好充分的代码审计工作,即使是一些简单的代码错误也会财产损失。