Balancer黑客攻击分析与DeFi生态系统指导
TL;DR
- 黑客攻击的根本原因是代码中存在多年的舍入方向问题
- 当该漏洞最初引入时,区块链生态系统的威胁环境大不相同,算术问题并未被广泛认为是可能的攻击向量
- 随着容易攻击的路径日益减少,攻击者变得更加复杂,将继续在DeFi协议中寻找新型威胁,如算术边缘情况
- 全面的不变式文档和测试现在至关重要;简单的规则"舍入必须有利于协议"已不足以捕获边缘情况
- 此事件凸显了针对性安全技术(如开发和维护模糊测试套件)和整体安全实践(包括监控和次级控制)的重要性
事件经过:理解漏洞
2025年11月3日,攻击者利用Balancer v2中的漏洞,在九个区块链网络上盗取了超过1亿美元。这次攻击针对多个Balancer v2池,利用了舍入方向错误。
自11月3日得知攻击以来,Trail of Bits一直与Balancer团队密切合作,了解该漏洞及其影响。我们独立确认Balancer v3不受此漏洞影响。
2021年审计:我们的发现与经验教训
2021年,Trail of Bits对Balancer v2进行了三次安全审查。在2021年4月的第一次审计期间审查的提交中没有此漏洞;然而,我们使用智能合约模糊测试工具Echidna发现了各种其他类似的舍入问题。作为报告的一部分,我们编写了一个附录(附录H),深入探讨了如何在代码库中管理舍入方向和精度损失。
2021年10月,Trail of Bits对Balancer的线性池进行了安全审查。在那次审查中,我们发现了线性池使用稳定数学库的问题。然而,该发现被标记为"未确定严重性"。
在审计时,我们无法明确确定已识别的舍入行为在配置的线性池中是否可利用。我们标记了此问题,因为我们在第一次审计中发现了类似问题,并建议实施全面的模糊测试,以确保所有算术运算的舍入方向符合预期。
我们现在知道周一被黑客攻击的可组合稳定池是利用了我们审计报告中报告的相同漏洞。我们在2022年9月对可组合稳定池进行了安全审查;然而,稳定数学库明确不在范围内。
上述案例说明了评估精度损失或舍入方向问题影响的困难。当模糊测试器首次识别出错误方向的1 wei精度损失时,可能看起来不显著,但在特定情况下,例如配置了特定参数的低流动性池,精度损失可能足够大而变得有利可图。
2021至2025年:生态系统的演进
当我们2021年审计Balancer时,区块链生态系统的威胁环境与今天大不相同。特别是,整个行业并未将舍入和算术问题视为生态系统的重大风险。如果回顾2021年最大的加密黑客攻击,你会发现根本原因是不同的威胁:访问控制缺陷、私钥泄露(钓鱼)和前段妥协。
看2022年,情况类似;那一年特别发生了巨大的黑客攻击,通过私钥泄露(钓鱼)或传统的智能合约漏洞耗尽了几个跨链桥。明确地说,在此期间,也发生了更多DeFi特定的攻击,如预言机价格操纵攻击。然而,这些攻击在当时被认为是新型威胁,其他DeFi攻击(如涉及舍入问题的攻击)尚未变得普遍。
虽然这些舍入问题在当时不是最严重或最普遍的威胁,但我们团队认为它们是一个重要但未被充分强调的风险。这就是为什么我们向Balancer报告了舍入问题的风险,并在2021年对Uniswap v3的审计中报告了类似问题。然而,我们必须进行自己的改进以应对这种日益增长的风险;例如,我们此后收紧了代码库成熟度评估的评级标准。Balancer的线性池在2021年被评为"中等",我们现在将没有全面舍入策略的代码库评为算术成熟度"弱"。
进入2023年和2024年,这些DeFi特定的攻击,特别是舍入问题,变得更加普遍。2023年,Hundred Finance协议因舍入问题被完全耗尽。同样的漏洞在各种协议中被多次利用,包括Sonne Finance,这是2024年最大的黑客攻击之一。这些更广泛的行业趋势也在我们当时的客户工作中得到验证,我们继续识别严重的舍入问题,这就是为什么我们在2023年开源了roundme,一个用于人工辅助舍入方向分析的工具。
现在,在2025年,算术和正确精度比以往任何时候都更加关键。导致2021年和2022年最大黑客攻击的缺陷,如私钥泄露,继续发生并仍然是重大风险。然而,很明显,区块链和DeFi生态系统的几个方面已经成熟,攻击也相应地变得更加复杂,特别是对于像Uniswap和Balancer这样在过去几年经过彻底测试和审计的主要协议。
2025年防止舍入问题
在2025年,舍入问题比以往任何时候都更加关键,保护免受这些问题的最稳健方法如下:
不变式文档
DeFi协议应投入资源记录所有与精度损失和舍入方向相关的不变式。每个不变式必须使用非正式证明或解释来辩护。规范不变式"舍入必须有利于协议"不足以捕获在多操作用户流中可能发生的边缘情况。最好在产品设计和开发阶段开始记录这些不变式,并使用代码审查与研究人员合作验证和扩展此列表。可以使用像roundme这样的工具来识别每个算术操作所需的舍入方向以维护不变式。
以下是一些可用于不变式测试系统的优秀资源和示例:
- 我们2021年为Balancer v2做的工作在附录H中包含固定点舍入指南。本指南涵盖舍入方向识别、幂舍入和其他有用的舍入指导。
- 我们2024年与Curvance的工作是记录舍入行为然后使用模糊测试验证的优秀代表。
- 遵循我们关于构建安全合约的指南,包括安全开发工作流和确定安全属性。
全面的单元和集成测试
捕获的不变式然后应驱动全面的测试套件。单元和集成测试应导致100%覆盖率。使用slither-mutate和necessist等解决方案的突变测试然后有助于识别单元和集成测试套件中的任何盲点。我们今年早些时候还写了一篇关于如何有效使用突变测试的博客文章。
我们2025年为CAP Labs做的工作在附录D中包含关于如何设计有效测试套件的广泛指导,该套件彻底单元、集成和模糊测试系统的不变式。
使用模糊测试进行全面不变式测试
一旦所有关键不变式被记录,需要使用强大的模糊测试活动来验证它们。根据我们的经验,模糊测试是此类不变式测试最有效的技术。
要了解更多关于模糊测试器如何工作以及如何利用它们测试DeFi系统,可以阅读我们的模糊测试器Echidna和Medusa的文档。
使用形式化验证进行不变式测试
使用形式化验证为不变式测试获得进一步保证。这些工具可以非常补充模糊测试。例如,形式化模型的限制或抽象是深入模糊测试的优秀候选。
DeFi生态系统的四个经验教训
此事件为整个DeFi社区提供了关于构建和维护安全系统的重要经验教训:
1. 数学和算术在DeFi协议中至关重要
参见以上部分关于如何最好保护系统的指导。
2. 维护模糊测试套件并用最新威胁情报通知它
虽然智能合约可能是不可变的,但测试套件不应如此。我们观察到一个常见问题是协议会开发模糊测试套件,但在某个时间点后未能维护它。例如,函数可能向上舍入,但未来的代码更新可能要求此函数现在向下舍入。具有正确不变式的维护良好的模糊测试套件将有助于识别函数现在以错误方向舍入。
除了防止代码更改的保护之外,测试套件还应随着最新威胁情报而发展。每次发生新型黑客攻击时,这都是可以改进自己测试套件的情报。如Sonne Finance事件所示,特别是对于这些算术问题,相同的错误(或其变体)被多次利用是很常见的。你应该养成响应每个新事件重新访问测试套件的习惯,以识别可能存在的任何差距。
3. 设计稳健的监控和警报系统
在发生安全事件时,必须有能够快速警报可疑行为并通知相关利益相关者的自动化系统。系统的设计也对其有效应对威胁的能力有重大影响。例如,系统是否可暂停、可升级或完全去中心化将直接影响在事件情况下可以做什么。
4. 通过次级控制减轻攻击影响
即使是DeFi协议也是高保证软件,但即使是像DeFi协议这样的高保证软件也必须接受一些风险。然而,接受风险时必须有减轻其影响的次级控制。没有任何控制的纯风险接受在高保证系统中很少见;每个接受风险的决定后应跟随一个问题:“如果我们接受此风险是错误的,我们如何保护自己?”
即使是像DeFi协议这样的高保证软件也必须接受一些风险,但接受这些风险时必须有次级控制,如果被利用则减轻其影响。今年早些时候,我们写了关于使用次级控制减轻私钥风险的文章,解释了速率限制、时间锁、暂停守护者和其他次级控制如何通过未识别类型的攻击减少安全事件风险和黑客攻击的爆炸半径。