慢雾:Akutars拍卖合约多个代码缺陷导致11539.5枚ETH永久无法取出
据慢雾区,Akutars拍卖合约由于多个代码缺陷导致11539.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。6. claimProjectFunds函数要求refundProgress退款数必须大于等于totalBids,项目方本意是保证全部用户完成退款后才可取款。而refundProgress根据出价人总数计算。这就出现refundProgress永远不会大于totalBids的情况。最终导致合约中11539.5枚ETH永远无法取出。即使在用户无法退款问题被解决的情况下,由于出价人数与拍卖数量的计数不一致以及项目方取款函数的缺陷,最终都会导致Akutars资金被永久锁住的结果。