DeFi协议因智能合约漏洞而损失了数十亿美元。这些损失不是源于市场下跌或监管行动,而是源于代码的行为不符合开发者的预期,尤其是当有人故意将其推向极端时。理解这些攻击如何运作不仅仅是学术研究。如果你使用DeFi,你的资金就存放在这些合约中。
自2020年DeFi开始扩展以来,仅以太坊 ETH$2,200ETH$2,20024h+0.46%7d+6.96%30d+8.02%1y+31.82%via Statility 生态就已有超过50亿美元通过漏洞被盗走。其中一些是复杂的零日攻击。许多是审计人员遗漏的已知漏洞模式,或是在审计完成后引入的缺陷。以下是不断出现的攻击向量。
常见嫌疑犯
重入攻击
重入攻击是最古老的智能合约漏洞,至今仍然有效。这种攻击利用了一个简单的逻辑缺陷:合约在更新自身内部余额之前向外部地址发送资金。攻击者的合约接收资金,然后立即回调原始合约进行再次提取。由于余额尚未更新,合约认为攻击者仍有资金并再次发送。
最著名的重入攻击是2016年的DAO黑客事件,该事件盗走了约6000万ETH,最终导致以太坊硬分叉,产生了以太坊经典。你可能会认为业界已经吸取教训。实际上并没有。
2023年7月,Vyper编译器中的重入漏洞(不是任何单个协议的代码,而是编程语言本身)导致Curve Finance多个资金池被利用,损失超过6000万美元。该漏洞在Vyper 0.2.15到0.3.0版本中已存在多年。这很重要,因为它表明重入攻击可能隐藏在堆栈的各个层次中,而协议开发者和审计人员甚至没有检查这些地方。
预言机操纵
DeFi协议需要价格数据才能运作。借贷平台需要了解抵押品价值。DEX需要参考价格以防止滑点。这些价格数据来自预言机,操纵预言机就意味着操纵协议。
2022年10月的Mango Markets漏洞是一个典型案例。Avraham Eisenberg使用500万美元在Mango自有交易所人为抬高MNGO代币价格,这使他的抵押头寸价值膨胀。他随后以该膨胀的抵押品借入1.14亿美元并提取。从技术上讲,协议的工作方式完全符合设计。预言机报告了它看到的价格。借贷逻辑遵循了其规则。但系统假设预言机价格反映真实市场价值,而这一假设是错误的。
使用单一链上来源(特别是低流动性代币自身交易池)获取价格数据的协议,本质上容易受到这种攻击。 Chainlink和其他去中心化预言机网络的存在就是为了通过汇总多个来源的数据来缓解这一问题,但并非每个协议都使用它们,即使在极端条件下,聚合信息源也可能被操纵。
闪电贷攻击
闪电贷是无抵押贷款,必须在单个交易中借入和偿还。如果未能偿还,整个交易将回滚,就好像它从未发生过一样。这是一个真正新颖的金融原始工具,在传统金融中没有对应物。
它也是使许多漏洞在经济上可行的工具。在闪电贷出现之前,想要操纵5000万美元资金池的攻击者需要5000万美元。有了闪电贷,他们只需足够的ETH来支付gas费用和闪电贷溢价,通常只需几百美元。
这个模式在数十个漏洞中重复出现:通过闪电贷借入大量资金,利用它操纵价格预言机或掏空易受攻击的资金池,偿还贷款,保留利润。2020年的bZx攻击是首批演示这一模式的之一。2021年Pancake Bunny因闪电贷驱动的价格操纵损失4500万美元。列表还在不断增长。
闪电贷不会产生漏洞。它们放大漏洞。任何容易受到大额资本流动影响的协议本来就已经存在缺陷。闪电贷只是使任何人都可以成为那笔大额资本,而且是免费的。
审计真正能做什么(和不能做什么)
智能合约审计是逐行代码审查,通常由专门的安全公司执行,寻找已知漏洞模式、逻辑错误和规范偏差。优秀的审计人员还会测试边界情况、模拟攻击场景并审查经济激励结构。
以下是审计不是什么:保证。经过审计的协议定期被黑客入侵。这有几个原因。
首先,被审计的代码可能不是部署的代码。协议经常在审计后进行更改,有时是重大更改,并在不重新审计的情况下部署。其次,审计检查合约时是隔离的或范围有限的。DeFi协议是可组合的,意味着它们与其他协议交互的方式会产生任何单个审计都无法预测的紧急行为。借贷协议本身可能是安全的,但当有人创建与其交互的新资金池时,可能会变得容易受攻击。
第三,许多漏洞是经济性而非技术性的。代码完全按照编写方式工作,但经济激励结构存在攻击者可以利用的缺陷。拥有纯工程背景的审计人员可能无法发现这些。这就是为什么一些安全公司现在在审计团队中纳入经济学家和机制设计师。
审计捕捉的内容与遗漏的内容
| 审计通常捕捉 | 审计经常遗漏 |
|---|---|
| 重入攻击模式 | 审计后的代码更改 |
| 整数溢出/下溢 | 跨协议可组合性风险 |
| 访问控制错误 | 经济或激励设计缺陷 |
| 已知漏洞模式 | 新颖的攻击向量 |
| Gas优化问题 | 治理攻击表面 |
| 标准合规性(ERC-20等) | 基础设施层级缺陷(编译器、EVM) |
事后剖析模式
在足够多的漏洞事后剖析后,模式浮现。大多数漏洞并非新颖。它们是对已知主题的变体,应用于存在盲点的协议。
未验证的假设是最常见的根本原因。开发者假设预言机价格会准确。他们假设只有意图中的合约会调用特定函数。他们假设没人会有足够的资本在单个块内推动市场40%。每个假设都是潜在的攻击面。
可升级合约和管理员密钥是另一个经常出现的主题。许多协议使用代理模式,允许团队在部署后升级合约逻辑。这作为安全机制的目的,让开发者能够快速修复bug。但这也意味着被泄露的管理员密钥可能被用来用恶意合约替换工作中的合约。2022年Ronin Bridge黑客事件损失6.25亿美元,最终是管理员密钥泄露,而不是智能合约逻辑缺陷。
值得注意的DeFi漏洞
| 协议 | 年份 | 损失金额 | 攻击类型 |
|---|---|---|---|
| The DAO | 2016 | 6000万美元 | 重入攻击 |
| Ronin Bridge | 2022 | 6.25亿美元 | 验证器密钥泄露 |
| Wormhole | 2022 | 3.2亿美元 | 签名验证绕过 |
| Mango Markets | 2022 | 1.14亿美元 | 预言机/价格操纵 |
| Curve (Vyper) | 2023 | 6000万美元 | 编译器级重入攻击 |
| Euler Finance | 2023 | 1.97亿美元 | 清算逻辑缺陷 |
保护自己
除非你是Solidity开发者,否则你无法自己审计智能合约,即使是这样,你也可能会遗漏一些东西。但通过提出正确的问题,你可以更清楚地评估风险。
检查协议是否已被审计、由谁审计以及最近何时审计。两年前对已被更新五十次的代码库的审计不会提供太多保证。来自独立公司的多个审计比一个审计更好。Bug赏金计划是个好信号,因为它为白帽研究人员创造了持续的激励,让他们在攻击者之前发现问题。
了解谁持有管理员密钥。如果一个拥有三个签名者的多签钱包控制升级合约的能力,这是一个有意义的中心化风险。如果这些密钥后面有一个时间锁,给用户48小时在更改生效前退出,这是更好的设计。
对分叉要谨慎。当一个团队复制另一个协议的代码并启动新版本时,他们经常修改代码片段,但完全没有理解安全含义。一些最严重的漏洞已经击中了条件不足的、本来安全的协议分叉。
跨协议多样化。不要把所有法定货币都放在一家银行的逻辑也适用于这里。如果你使用的协议被利用,只要风险限制在你投资组合的一小部分,损失是可以承受的。集中是不行的。
DeFi安全正在改进。形式化验证工具、更复杂的审计实践,以及 Uniswap和 Aave等经过时间考验的代码库已经证明,构建良好的合约可以在多年内保护数十亿美元,而不会出现事故。但前沿领域总是混乱的,新代码带来新风险。提供最高收益的协议往往是最少经过时间和对抗条件测试的协议。这不是巧合。
在寻找加密平台、交易所和DeFi应用?浏览我们的精选目录: