DeFi 建设者们面临数学难题——如果他们在智能合约中使用的逼近法不防范漏洞,黑客就能从他们的协议中窃取资金。

上周,黑客从稳定币协议 Raft Finance 中窃取了 360 万美元。黑客利用闪电贷发动了一次攻击,其原理是利用了 Raft 智能合约中的精度损失漏洞。这类漏洞是由于数字逼近时产生的舍入错误导致的,使得黑客能够获得额外的份额代币。

尽管 Raft 经历了 Trail of Bits 和 Hats Finance 等公司的多次审计,但这个漏洞没有被修补。

Raft Finance 的被黑事件只是一系列 DeFi 盗窃行为中的最新一例,攻击者针对的是精度损失漏洞。像 Balancer 和 Onyx 这样的 DeFi 协议也曾受到过此类攻击。实际上,像 Onyx 一样,DeFi 借贷协议 Compound 的分叉版本也被发现在其代码中包含了舍入错误,这些错误被利用,就像 Hundred Finance 和 Midas Capital 的情况一样。

逼近法或说舍入是使用一个接近但与原始数字的真实值不完全相同的数字,其可能导致舍入误差和精度丧失,尤其是在执行大量数学计算的复杂 DeFi 协议中。

「我确实认为 DeFi 在整数舍入方面面临着数学挑战,」智能合约开发者兼安全研究员泰勒·韦伯告诉 DL News。

在逼近法造成的误差数量不多时并不是问题,但当误差不断累积到足够大的程度时,黑客就会像他们在无数次攻击中所做的那样利用这些误差值。

「一些 DeFi 应用的高度动态和创新行为可能使攻击者将精度损失放大到相当大的程度,」匿名的加密审计公司 Trust Security 负责人 Trust 告诉 DL News。

「闪电贷机制与高流动性 AMM 的结合使得黑客能够大规模利用理论上的『价值丧失』问题,」Trust 补充道。

难以检测

在加密领域,舍入错误和精度丧失是普遍存在的,而这背后有几个原因。

主要原因是支持加密的计算逻辑与分数不太兼容。

「EVM 几乎与其他任何计算架构类似,即不支持以分数形式进行计算,因此必然会损失精度,」Trust 说。

与此同时,代币的小数点位数各不相同。例如,USDC 有六位小数,而 DAI 有 18 位。在进行两种代币交换的交易池中,必须设计某种形式的精度缩放以考虑不同的小数点位数。精度缩放涉及调整次要资产的小数点位数以匹配主要资产的小数点位数。

此外,与其他算术问题一样,舍入错误,是智能合约审计员极难检测到的。实际上,这些漏洞在审计过程中经常被忽略,导致即使经过了大量审计的协议仍然会成为黑客利用此漏洞的受害者。

「一种文化的改变」

Raft Finance 的黑客事件引发了对认真对待舍入错误的讨论。

「我认为问题并不在于我们受到 EVM 的整数限制,而是在于开发人员和审计员如何处理舍入错误类的漏洞,」Webb 说。

Webb 呼吁进行「文化改变」,希望 DeFi 的建设者和审计员能像对待递归调用漏洞一样,对待舍入错误。

智能合约审计员 Joe Dakwa 告诉 DL News,健全的单元测试和模糊测试应成为标准最佳实践。模糊测试是一种可以在智能合约上进行的测试,其中将随机数据输入到代码中,以查看是否出现问题。

安全专家表示,类似于模糊测试的不变性测试也应被添加到测试组合中。