事件概述:一起由整数溢出引发的重大安全事件
2026年1月8日,去中心化计算协议Truebit Protocol遭遇重大安全攻击,损失高达8,535.36枚以太坊(约合2644万美元)。官方在次日凌晨确认了此次事件。安全研究团队ExVul对攻击过程进行了深入的技术复盘,揭示了其核心漏洞所在。
攻击过程技术拆解
攻击者(地址:0x6c8ec8f14be7c01672d31cfa5f2cefeab2562b50)通过一笔精心构造的交易(哈希:0xcd4755645595094a8ab984d0db7e3b4aabde72a5c87c4f176a030629c47fb014)完成了攻击。其攻击模式采用了四轮循环调用,核心步骤如下:
第一轮攻击循环分析
- 价格查询阶段:攻击者首先调用 `getPurchasePrice` 函数,并传入一个巨大的代币数量参数(240,442,509,453,545,333,947,284,131枚TRU)。函数错误地返回了购买成本为0 ETH的结果。
- 零成本铸造阶段:随后,攻击者调用函数选择器为 `0xa0296215` 的合约方法,并附上 `msg.value` 为0。此操作成功地零成本铸造了上述天文数字的TRU代币。
- 代币销毁套利阶段:最后,攻击者调用函数选择器为 `0xc471b10b` 的方法,将铸造出的巨额TRU代币销毁,并从中提取了5,105.06枚ETH作为回报。
漏洞根源:关键函数逻辑缺陷剖析
通过对攻击链路的追溯,问题核心指向 `getPurchasePrice` 函数与内部函数 `0xa0296215` 的计算逻辑。在未开源的合约反编译代码中,一个关键的内部函数(此处标识为 `0x1446` 函数)负责计算购买指定数量TRU所需的ETH。
该函数在执行算术运算 `v12 + v9` 时发生了整数溢出。由于该合约基于Solidity `^0.6.10` 版本编译,此版本默认不包含内置的溢出检查。攻击者通过输入一个极其庞大的 `_amountIn` 参数,故意使加法运算 `v12 + v9` 的结果溢出,绕过了正常的数学逻辑,最终导致 `(v12 + v9) / v6` 的计算结果归零。
这意味着,协议错误地认为铸造海量TRU代币的成本为零,从而为攻击者打开了零成本铸造并立即兑换为ETH的套利大门。
安全启示与行业建议
本次Truebit Protocol安全事件的本质,是其代币经济模型中的核心价格计算函数存在严重的整数溢出漏洞。这暴露了使用旧版本Solidity(0.8.x之前)且未手动实施安全算术检查的固有风险。
当前,越来越多的攻击者开始利用自动化工具乃至AI技术,系统性扫描并攻击那些部署较早、未及时更新或审计的DeFi协议。类似的安全事件(如早前的Balancer和yETH攻击)已多次敲响警钟。
给项目方的安全建议:
- 升级与审计:强烈建议仍在使用旧版Solidity(0.8.x以下)的协议尽快升级至具有默认溢出检查的新版本,并对核心合约进行新一轮的全面安全审计。
- 主动监控与应急预案:建立完善的链上监控预警系统,对关键合约函数的异常调用保持高度警惕。同时,制定并演练资产紧急转移等应急预案,以最大限度降低潜在损失。
- 防御性编程:即使在较新的编译器版本中,对于涉及核心资产计算的数学运算,也应考虑使用经过严格审计的安全数学库(如OpenZeppelin的SafeMath)进行二次加固。