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

本页内容
智能合约以其高效、透明和不可篡改的特性正在革新全球各行业。然而,其开放和自动化的设计也使其面临风险。要在最大化其潜力的同时最小化威胁,理解其漏洞和可能的攻击途径至关重要。编写和维护这些合约需要细致关注并遵循最佳实践。本文深入探讨常见漏洞,并通过真实案例加以说明以加深理解。让我们看看以下由 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。
重入漏洞防护:
- 始终遵循检查-生效-交互模式。
- 对所有敏感操作采用重入保护。
- 谨慎处理每一次外部调用。
整数溢出:
当计算超出限制时会发生溢出,通常导致极小或极大的值。
示例攻击:
- BeautyChain(2018):攻击者通过整数溢出获取 10^58 BEC,抛售了高达 9 亿美元。
- Poolz(2023):在以太坊、币安和 Polygon 链上共损失约 66.5 万美元。
整数溢出防范措施:
- 使用安全计算方法,如 safeMath 库。
- 优先进行边界检查以确保结果在范围内。
- 采用 solidity 编译器 0.8.0 或更高版本以内置溢出检测。
访问控制:
访问控制漏洞源于处理关键操作的函数缺乏严格的访问限制。
- 重大攻击:
- DAOMaker(2021):在
init函数存在漏洞后,高达约 400 万美元被窃取。 - GymNetwork(2022):攻击者利用 depositFromOtherContract() 中的身份验证疏忽,在没有任何实际付款的情况下非法增加余额。损失?约 2,475.91 WBNB。
- Tempdao(2023):对 migrateStake 函数的访问控制松懈导致损失超过 234 万美元。
访问控制漏洞
- 描述:由于管理系统中特定操作访问和权限的限制机制不足而产生的漏洞。
防范措施:
- 严格权限检查:始终对函数执行严格的权限协议,尤其是处理敏感操作的函数。
- 多重签名机制:对于需要共同决策的任务,使用多重签名协议,在执行敏感操作前需要多方批准。
常见攻击途径
- 描述:攻击者利用系统漏洞(主要是在智能合约中)的各种方法或渠道。
典型案例:
- 闪电贷攻击:利用去中心化金融系统的即时借贷功能执行恶意活动。
- 抢跑:攻击者获知另一用户的待处理交易,并通过提供更高的 gas 费抢先执行。
闪电贷攻击
- 描述: 虽然本质上不是攻击,但 FlashLoan 是一项 DeFi 功能,允许用户在没有抵押品的情况下即时借入大量资金。由于合约交互和关系中的逻辑缺陷,它已被利用。
著名攻击事件:
- Harves Finance (2020.10.26): 造成 3800 万美元损失。
- InverseFinance (2022.6.16): 导致损失 53.2445 WBTC 和 99,976.29 USDT。
- NewFreeDAO (2022.9.8):耗尽 4,481 WBNB,约合 125 万美元。
- Lodestar (2022.12.11):通过预言机价格操纵被利用。
- 0vix (2023.4.28): 导致 Polygon 链上损失 200 万美元。
预防建议:
- 在项目开发过程中识别闪电贷特征。
- 为准确确定价格,请使用时间加权平均或多个预言机。
抢跑
- 描述: 攻击者从内存池中获知其他用户的交易,并通过提供更高的 gas 费用加以利用。
著名攻击事件:
- Sushi Badger Digg(2021.1.25): 造成 81.68 ETH 的损失。
- Sushiswap Ape-ETH 池(2022.5.17): 攻击者获利约 0.3 ETH。
- Uniswap (2023.4.2):通过三明治攻击造成约2500万美元损失。
防范建议:
- 交易时使用滑点保护。
- 在非高峰时段执行交易,尤其是在波动剧烈的市场中。
- 使用1inch的FlashBot rpc将交易直接发送给矿工,从而绕过内存池。
总结
恭喜!你已完成模块2——智能合约漏洞:深入探讨重入攻击与常见漏洞利用
让我们回顾一下你的学习内容:
重入漏洞 - 攻击者利用漏洞,在函数完全执行完毕前重新进入该函数。
- 单函数重入: 恶意合约重新进入另一个合约中的函数。
- 跨函数重入: 由于重入保护不足,不同函数之间共享的状态被利用。
- 跨合约重入: 利用不同合约之间共享的状态进行攻击。
- 只读重入: 利用状态不一致时产生错误输出的函数进行攻击。
整数溢出 - 计算超出设定上限,导致出现极端值。
访问控制漏洞 - 源于关键函数缺乏严格的访问限制。
常见攻击向量 - 攻击者利用系统漏洞的方法。
**FlashLoan Attack **- 一种DeFi功能,允许在无抵押的情况下即时大额借款,但因逻辑缺陷而被利用。
抢跑攻击- 攻击者获知待处理交易的信息,并通过提供更高的gas费用来获利。
本文由以下机构提供:
