博客

自动翻译 · 阅读英文原文

SSO 模块 2 - 智能合约漏洞:深入剖析重入攻击

智能合约提供透明度,但也伴随风险。本文揭示重入等漏洞,并以 DAO 损失 1.5 亿美元为案例。整数溢出导致 BeautyChain 损失 9 亿美元。DAOMaker 因访问控制缺陷损失 400 万美元。闪电贷攻击导致 Harves Finance 损失 3800 万美元。

作者 Markos Mebellis

SSO 模块 2 - 智能合约漏洞:深入剖析重入攻击
本页内容

智能合约以其高效、透明和不可篡改的特性正在革新全球各行业。然而,其开放和自动化的设计也使其面临风险。要在最大化其潜力的同时最小化威胁,理解其漏洞和可能的攻击途径至关重要。编写和维护这些合约需要细致关注并遵循最佳实践。本文深入探讨常见漏洞,并通过真实案例加以说明以加深理解。让我们看看以下由 Salus Security 提供的文章。

关键漏洞:

**重入:**攻击者利用间隙,在关键操作完成或值更新之前重新进入函数。

单函数重入: 当合约与恶意合约交互时发生,允许后者重新进入某个函数。例如,恶意合约可以不断重新进入 'withdrawBalance' 函数,在余额更新之前窃取更多以太币。

著名攻击:

  • The DAO(2016): 在筹集 1.5 亿美元后,因编码漏洞被黑客攻击。这导致以太坊网络分裂。
  • PolyDex(2021): 因 PLX Locker 智能合约遭受重入攻击损失 50 万美元。
  • Bacon Protocol(2022): 因 lend() 函数中的重入漏洞损失 100 万美元。
  • Lendf.Me(2020): 在多种加密货币中损失约 2470 万美元。

**跨函数重入:**源于不同函数之间共享状态以及重入保护不足。上述 'balances' 示例表明,尽管 'withdrawAll' 有保护,攻击者仍可利用 'transfer' 函数。

臭名昭著的事件:

  • DFX Finance(2022): 因攻击利用一个没有重入保护的函数损失超过 700 万美元。
  • Hundred Finance(2022): 在一次重入攻击利用 borrowFresh 函数后损失约 650 万美元。
  • Fei Protocol(2022): 因攻击利用重入漏洞损失约 8000 万美元。

**跨合约重入:**源于不同合约之间共享状态以及错误的变量修改顺序。即使函数有保护,其他函数(如 'burnAccount')仍可能被利用。

重大攻击:

  • Rari Capital(2021): 在不到一小时内损失约 1000 万美元(约 2600 ETH)。
  • ValueDefi(2021): 因依赖外部数据的无效份额计算损失 5345.314 WBNB。

只读重入:

只读重入利用一个函数,该函数虽然不改变合约状态,但在状态不一致时仍可能产生错误输出。

值得注意的攻击:

  • QuickSwap(2022):攻击者滥用闪电贷调整资产现货价格,骗取 138 ETH 和 700 MATIC 代币。这得益于 Curve LP 预言机的缺陷。
  • dForce(2023):在 Arbitrum 和 Optimism 链上访问 Curve Finance 价格预言机的代码中存在只读重入漏洞。
  • Sentimente(2023):一次利用只读重入漏洞的攻击导致 100 万美元被盗。幸运的是,攻击者归还了 90%。
  • Sturdy(2023):因 Balancer 的只读重入问题导致 B-stETH-STABLE 的价格被篡改,损失约 442 ETH。

重入漏洞防护:

  1. 始终遵循检查-生效-交互模式。
  2. 对所有敏感操作采用重入保护。
  3. 谨慎处理每一次外部调用。

整数溢出:

当计算超出限制时会发生溢出,通常导致极小或极大的值。

示例攻击:

  • BeautyChain(2018):攻击者通过整数溢出获取 10^58 BEC,抛售了高达 9 亿美元。
  • Poolz(2023):在以太坊、币安和 Polygon 链上共损失约 66.5 万美元。

整数溢出防范措施:

  1. 使用安全计算方法,如 safeMath 库。
  2. 优先进行边界检查以确保结果在范围内。
  3. 采用 solidity 编译器 0.8.0 或更高版本以内置溢出检测。

访问控制:
访问控制漏洞源于处理关键操作的函数缺乏严格的访问限制。

  • 重大攻击:
  • DAOMaker(2021):在 init 函数存在漏洞后,高达约 400 万美元被窃取。
  • GymNetwork(2022):攻击者利用 depositFromOtherContract() 中的身份验证疏忽,在没有任何实际付款的情况下非法增加余额。损失?约 2,475.91 WBNB。
  • Tempdao(2023):对 migrateStake 函数的访问控制松懈导致损失超过 234 万美元。

访问控制漏洞

  • 描述:由于管理系统中特定操作访问和权限的限制机制不足而产生的漏洞。

防范措施:

  1. 严格权限检查:始终对函数执行严格的权限协议,尤其是处理敏感操作的函数。
  2. 多重签名机制:对于需要共同决策的任务,使用多重签名协议,在执行敏感操作前需要多方批准。

常见攻击途径

  • 描述:攻击者利用系统漏洞(主要是在智能合约中)的各种方法或渠道。

典型案例:

  • 闪电贷攻击:利用去中心化金融系统的即时借贷功能执行恶意活动。
  • 抢跑:攻击者获知另一用户的待处理交易,并通过提供更高的 gas 费抢先执行。

闪电贷攻击

  • 描述: 虽然本质上不是攻击,但 FlashLoan 是一项 DeFi 功能,允许用户在没有抵押品的情况下即时借入大量资金。由于合约交互和关系中的逻辑缺陷,它已被利用。

著名攻击事件:

  1. Harves Finance (2020.10.26): 造成 3800 万美元损失。
  2. InverseFinance (2022.6.16): 导致损失 53.2445 WBTC 和 99,976.29 USDT。
  3. NewFreeDAO (2022.9.8):耗尽 4,481 WBNB,约合 125 万美元。
  4. Lodestar (2022.12.11):通过预言机价格操纵被利用。
  5. 0vix (2023.4.28): 导致 Polygon 链上损失 200 万美元。

预防建议:

  1. 在项目开发过程中识别闪电贷特征。
  2. 为准确确定价格,请使用时间加权平均或多个预言机。

抢跑

  • 描述: 攻击者从内存池中获知其他用户的交易,并通过提供更高的 gas 费用加以利用。

著名攻击事件:

  1. Sushi Badger Digg(2021.1.25): 造成 81.68 ETH 的损失。
  2. Sushiswap Ape-ETH 池(2022.5.17): 攻击者获利约 0.3 ETH。
  3. Uniswap (2023.4.2):通过三明治攻击造成约2500万美元损失。

防范建议:

  1. 交易时使用滑点保护。
  2. 在非高峰时段执行交易,尤其是在波动剧烈的市场中。
  3. 使用1inch的FlashBot rpc将交易直接发送给矿工,从而绕过内存池。

总结

恭喜!你已完成模块2——智能合约漏洞:深入探讨重入攻击与常见漏洞利用

让我们回顾一下你的学习内容:

重入漏洞 - 攻击者利用漏洞,在函数完全执行完毕前重新进入该函数。

  • 单函数重入: 恶意合约重新进入另一个合约中的函数。
  • 跨函数重入: 由于重入保护不足,不同函数之间共享的状态被利用。
  • 跨合约重入: 利用不同合约之间共享的状态进行攻击。
  • 只读重入: 利用状态不一致时产生错误输出的函数进行攻击。

整数溢出 - 计算超出设定上限,导致出现极端值。

访问控制漏洞 - 源于关键函数缺乏严格的访问限制。

常见攻击向量 - 攻击者利用系统漏洞的方法。

**FlashLoan Attack **- 一种DeFi功能,允许在无抵押的情况下即时大额借款,但因逻辑缺陷而被利用。

抢跑攻击- 攻击者获知待处理交易的信息,并通过提供更高的gas费用来获利。

本文由以下机构提供:

摘要 — 插图