在2026年1月8日,以太坊区块24,191,019,Truebit的TRU代币崩溃,因为一笔交易将协议的购买价格迫使为零。这个单一条件使得无限铸造成为可能,并快速退出到ETH。 更多细节如下。
攻击者调用了 getPurchasePrice,然后调用 buyTRU (0xa0296215),铸造了超过总供应量的 TRU,重复了这个循环,然后通过 sellTRU 出售。总成本不到 40 美元,交易返回了 8,535 ETH(约 2600 万美元)。
只有 TRU 代币代理在 Sourcify 中经过验证,使用 Solidity 0.5.3 编译。那个时代还没有内置的溢出检查和许多安全功能。旧代码可以运行多年,然后在遇到更好的分析时在一个边缘案例下失败。
我们反编译了未经验证的购买合约,并追踪了 getPurchasePrice 到一个内部函数 (0x1446),该函数根据供应 S、储备 R 和 THETA(当时为 75)计算价格。在大多数路径中使用了安全数学助手。
失败的关键在于最终表达式:v13 = _SafeDiv(v6, v12 + v9)。这个加法没有进行检查,而Solidity 0.5.3在溢出时不会回滚。输入足够大时,它会发生溢出,整数除法返回零。
我们的完整报告涵盖了遗留系统的根本原因和教训:
5.28K