智能合约中的常见漏洞 – ImmuneBytes

本文探讨了智能合约中常见的漏洞,包括重入攻击、整数溢出和下溢、时间戳依赖、未检查的外部调用、未初始化的存储变量、拒绝服务(DoS)、访问控制问题、抢跑交易、Oracle 操纵和糟糕的随机性等,每个漏洞都附有实际案例、发生方式和缓解策略,强调了智能合约开发中安全审计、严格测试和持续学习的重要性。

2025 年 6 月 10 日

智能合约旨在基于预定义的条件和逻辑自动执行流程、交易和任务。它们在以太坊等区块链网络或其他分布式账本技术上运行,通常依赖于被称为 预言机(oracles) 的安全数据 馈送(feeds) 来响应外部事件。这些合约经常管理有价值的资产和敏感数据,例如转移资金、提供服务或授予对受保护内容的访问权限,这使得它们成为恶意行为者的一个有吸引力的目标。

在创建和部署智能合约时,确保强大的安全性至关重要。一旦部署到区块链,更新或修补它们就极具挑战性,通常需要删除、重写和重新部署合约。此外,合约中的任何漏洞都会公开可见,从而增加了被利用的风险。

这篇博客探讨了智能合约中最常见的漏洞,阐述了它们的影响,并提供了缓解这些漏洞的最佳实践。

1. 重入攻击

是什么?

当智能合约允许外部合约在初始执行完成之前回调到原始函数时,就会发生重入。这可能导致意外的状态或资金耗尽。

真实案例

2016 年臭名昭著的 DAO 黑客攻击利用了一个 重入(Re-entrancy) 漏洞,导致损失了 360 万以太币 (ETH),并引发了一场有争议的以太坊硬分叉。

如何发生的?

当合约在更新其内部状态之前调用外部函数时,就会出现此漏洞。外部合约可以递归地调用原始函数,以多次执行意外操作。

缓解策略

  • 使用检查-生效-交互模式 (Checks-Effects-Interactions Pattern): 在调用外部合约之前执行所有状态更改。
  • 重入保护: 使用 互斥锁(mutex locks) 或 OpenZeppelin 的 Re-entrancyGuard 来防止多次进入一个函数。
  • 避免直接发送以太币: 优先选择基于 拉取(pull-based) 的支付机制,而不是直接的 call、send 或 transfer。

2. 整数溢出和下溢

是什么?

当计算超过数据类型的最大值时,会发生整数溢出,而当计算低于最小值时,则会发生下溢。

真实案例

2018 年,Oyster Pearl 智能合约中的一个溢出漏洞允许攻击者 铸造(mint) 无限的 代币(tokens)。

如何发生的?

在 0.8.0 之前的 Solidity 版本中编写的智能合约不会自动检查算术溢出或下溢。

缓解策略

  • 升级到 Solidity 0.8.0 或更高版本: 这些版本包括内置的算术检查。
  • 使用 SafeMath 库: 引入 OpenZeppelin 的 SafeMath 以进行安全的算术运算。

3. 时间戳依赖

是什么?

以太坊上的智能合约经常依赖 block.timestamp 来实现对时间敏感的功能,如拍卖、彩票和 代币归属(token vesting)。然而,block.timestamp 并非完全不可变的,并且矿工可以在以太坊协议规则允许的约 15 秒范围内略微调整它。这造成了一个漏洞,矿工可以为了自己的利益而操纵时间戳。

例子

依赖 block.timestamp 进行关键操作的合约容易受到操纵。矿工可以通过以下方式利用这一点:

  1. 提前或延迟触发函数: 矿工可以调整 时间戳(timestamps) 以便提前结束拍卖等活动,或延迟关键更新,从而扰乱预期的合约行为。
  2. 利用基于时间的逻辑: 攻击者可以将 时间戳(timestamps) 与特定条件对齐,比如通过满足预定义的标准来赢得彩票。
  3. 促进抢先交易: 时间戳(Timestamp) 可预测性使攻击者能够有策略地执行交易,从而给其他人造成重大经济损失,同时不公平地使自己受益。

缓解策略

  • 避免完全依赖 block.timestamp 考虑集成受信任的外部时间源或聚合多个时间源,以确保可靠的计时。
  • 增加时间缓冲: 为关键的时间敏感操作实施 宽限期(grace period)。例如,将拍卖结束时间延长到至少超过设定的截止日期一分钟,以使矿工更难操纵结果。
  • 设计弹性逻辑: 使用对轻微 时间戳(timestamp) 变化不太敏感的逻辑,以最大限度地减少 漏洞利用(exploitation) 机会。

4. 未经检查的外部调用

是什么?

对不受信任合约的外部调用可能表现出不可预测的行为,从而导致 重入(Re-entrancy) 攻击或 gas 耗尽。

如何发生的?

开发者假设外部调用将成功执行,而没有处理潜在的失败或意外行为。

缓解策略

  • 检查返回值: 始终验证外部调用是否成功。
  • 限制 Gas: 在进行外部调用时指定 gas 限制,以防止恶意循环。
  • 首选接口: 与受信任的接口交互,而不是直接调用不受信任的合约。

5. 未初始化的存储变量

是什么?

Solidity 中未初始化的存储变量可以指向意外的内存位置,从而导致意外的行为或漏洞。

如何发生的?

开发者可能忘记初始化一个存储变量,导致它默认到一个不可预测的状态。

缓解策略

  • 始终初始化变量: 显式地为所有存储变量设置初始值。
  • 执行严格的测试: 使用自动化工具来检测未初始化的变量。

6. 拒绝服务 (DoS)

是什么?

DoS 攻击通过利用 gas 限制或 垃圾信息(spamming) 关键函数来中断合约的功能。

真实案例

2016 年,对以太坊网络 Parity 多重签名钱包(multisig wallet) 合约的 DoS 攻击中断了其功能。

如何发生的?

攻击者利用设计缺陷,例如依赖用户提供的数据或允许无限循环。

缓解策略

  • 避免大量循环: 优化合约逻辑以减少 gas 消耗。
  • 使用拉取支付模式: 允许用户提取资金,而不是推送支付。
  • 限制输入数据: 验证 数据大小(input sizes) 和范围。

7. 访问控制问题

是什么?

不正确地实施访问控制可能会允许未经授权的实体执行特权操作。

真实案例

2020 年,Lendf.Me 协议因其访问控制机制中的缺陷而损失了 2500 万美元。

如何发生的?

开发者可能忘记对敏感函数实施或强制执行访问限制。

缓解策略

  • 使用修饰符: 实施 onlyOwner 或基于角色的访问控制。
  • 利用库: 使用 OpenZeppelin 的 AccessControl 来安全地管理权限。
  • 执行安全审计: 定期审查和测试访问控制。

8. 抢先交易 (Front-Running)

是什么?

抢先交易(Front-running) 是指恶意行为者利用区块链的透明性,抢先执行具有更高 gas 费用的交易。

真实案例

DEX 交易和 NFT 拍卖是 抢先交易(front-running) 攻击的常见目标,攻击者拦截并从待处理交易中获利。

缓解策略

  • 使用提交-揭示方案 (Commit-Reveal Schemes): 隐藏交易数据,直到它最终确定。
  • 加入时间延迟: 通过添加时间 缓冲(buffers) 来降低可预测性。
  • 使用隐私解决方案: 探索像 zk-SNARKs 这样的工具来模糊敏感的交易细节。

9. 预言机操纵

是什么?

如果 预言机(oracle) 的数据 馈送(feed) 受到损害,依赖于来自 预言机(oracles) 的 链下(off-chain) 数据的智能合约可能会被操纵。

真实案例

2020 年,bZx 协议在一周内两次遭到攻击,原因是 预言机(oracle) 操纵,导致损失了近 100 万美元。

如何发生的?

攻击者向易受攻击的 预言机(oracle) 提交虚假数据或操纵价格 馈送(feed),以触发不利的合约行为。

缓解策略

  • 使用去中心化预言机: 选择像 Chainlink 这样强大的解决方案,以减少单点故障。
  • 实施合理性检查: 针对预定义的范围或多个来源验证 预言机(oracle) 数据。
  • 加入断路器: 当检测到异常数据时,暂停操作。

10. 糟糕的随机性

是什么?

智能合约通常需要 随机性(randomness) 来进行彩票、游戏或其他不可预测的结果。糟糕的实施可能会使 随机性(randomness) 变得可预测。

真实案例

由于可预测的随机数生成,一些基于区块链的彩票平台遭到了攻击。

如何发生的?

使用区块 时间戳(timestamps)、矿工地址或其他 链上(on-chain) 值作为 随机性(randomness) 来源会使结果可操纵。

缓解策略

  • 使用可验证的随机性: 整合像 Chainlink VRF 这样的解决方案。
  • 避免链上来源: 不要依赖区块属性来实现 随机性(randomness)。

结论

智能合约漏洞对区块链生态系统的安全性和可信赖性构成了重大风险。虽然它们的自主性引入了效率,但也需要更高的开发严谨性标准。通过理解常见的漏洞并实施最佳实践,开发者可以降低风险并确保其智能合约的可靠性。安全审计、严格的测试和持续学习仍然是保障 去中心化应用(decentralized applications) 未来不可或缺的。

  • 原文链接: blog.immunebytes.com/202...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ImmuneBytes
ImmuneBytes
Stay Ahead of the Security Curve.