慢雾简析NFT项目Akutars资金锁定事件,11,539.5 枚ETH永远无法取出

fffmCQ.jpg

NFT项目Akutars 项目拍卖合约由于多个代码缺陷导致 11,539.5 枚 ETH 永久无法取出。慢雾安全团队进行分析了合约后发现:
 1. Akutars 拍卖合约中存在 bid 与 processRefunds 功能,用户分别可以进行拍卖出价与退款操作。  

2. 在拍卖结束后发起 processRefunds 退款操作时拍卖合约将遍历出价用户,并通过低级调用 call 为用户进行退款,但并未限制这一调用的 gasLimit。而未做此 gasLimit 限制的情况下,拍卖合约将使用发起者的全部 gas 进行外部调用。  

3. 但由于 Akutars 拍卖合约并不限制合约参与拍卖,因此“恶意用户”可以使用合约参与拍卖,并在其合约的接收以太函数中写入恶意消耗 gas 的逻辑,使得在进行退款流程时触发此用户合约,进而恶意消耗了调用发起者的全部 gas,直接导致后续退款无法正常进行。  

4. 幸运的是此“恶意用户”仅仅只是做了风险验证测试,最终解除了恶意消耗 gas 的逻辑使得退款可以继续顺利进行。当然用户也可以在拍卖结束的 3 天后进行紧急退款。  

5. 在用户退款完成后项目方可以通过 claimProjectFunds 功能提取合约中的拍卖所得。但拍卖合约在用户进行 bid 时使用 totalBids 与 bidIndex 记录用户所拍的数量与出价次数,而用户是可以在一次出价中任意选择所拍的数量的,因此在拍卖结束 totalBids 实际上大于 bidIndex。当前 totalBids 为 5495,bidIndex 仅为 3669。  

6. 但在 claimProjectFunds 函数中却要求 refundProgress 退款数必须大于等于 totalBids,项目方本意应是为了保证全部用户完成退款后才可进行取款。而实际上 refundProgress 是根据出价人总数进行计算的,也就是全部退款完成 refundProgress 也只是会等于 bidIndex。这就出现了 refundProgress 永远不会大于 totalBids 的情况。最终导致合约中 11,539.5 枚 ETH 永远无法取出。  

综上,即使在用户无法退款问题被解决的情况下,由于出价人数与拍卖数量的计数不一致以及项目方取款函数的缺陷,最终都会导致 Akutars 资金被永久锁住的结果。

声明:该文观点仅代表作者本人,与炒币网无关。炒币网系信息发布平台,仅提供信息存储空间服务。对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,并不对文章观点负责。 提示:投资有风险,入市须谨慎。本资讯仅供参阅,不作为投资理财建议。

发表评论

登录后才能评论