本文探讨了智能合约中常见的漏洞,包括重入攻击、整数溢出和下溢、时间戳依赖、未检查的外部调用、未初始化的存储变量、拒绝服务(DoS)、访问控制问题、抢跑交易、Oracle 操纵和糟糕的随机性等,每个漏洞都附有实际案例、发生方式和缓解策略,强调了智能合约开发中安全审计、严格测试和持续学习的重要性。
2025 年 6 月 10 日
智能合约旨在基于预定义的条件和逻辑自动执行流程、交易和任务。它们在以太坊等区块链网络或其他分布式账本技术上运行,通常依赖于被称为 预言机(oracles) 的安全数据 馈送(feeds) 来响应外部事件。这些合约经常管理有价值的资产和敏感数据,例如转移资金、提供服务或授予对受保护内容的访问权限,这使得它们成为恶意行为者的一个有吸引力的目标。
在创建和部署智能合约时,确保强大的安全性至关重要。一旦部署到区块链,更新或修补它们就极具挑战性,通常需要删除、重写和重新部署合约。此外,合约中的任何漏洞都会公开可见,从而增加了被利用的风险。
这篇博客探讨了智能合约中最常见的漏洞,阐述了它们的影响,并提供了缓解这些漏洞的最佳实践。
当智能合约允许外部合约在初始执行完成之前回调到原始函数时,就会发生重入。这可能导致意外的状态或资金耗尽。
2016 年臭名昭著的 DAO 黑客攻击利用了一个 重入(Re-entrancy) 漏洞,导致损失了 360 万以太币 (ETH),并引发了一场有争议的以太坊硬分叉。
当合约在更新其内部状态之前调用外部函数时,就会出现此漏洞。外部合约可以递归地调用原始函数,以多次执行意外操作。
当计算超过数据类型的最大值时,会发生整数溢出,而当计算低于最小值时,则会发生下溢。
2018 年,Oyster Pearl 智能合约中的一个溢出漏洞允许攻击者 铸造(mint) 无限的 代币(tokens)。
在 0.8.0 之前的 Solidity 版本中编写的智能合约不会自动检查算术溢出或下溢。
以太坊上的智能合约经常依赖 block.timestamp
来实现对时间敏感的功能,如拍卖、彩票和 代币归属(token vesting)。然而,block.timestamp
并非完全不可变的,并且矿工可以在以太坊协议规则允许的约 15 秒范围内略微调整它。这造成了一个漏洞,矿工可以为了自己的利益而操纵时间戳。
依赖 block.timestamp
进行关键操作的合约容易受到操纵。矿工可以通过以下方式利用这一点:
block.timestamp
: 考虑集成受信任的外部时间源或聚合多个时间源,以确保可靠的计时。对不受信任合约的外部调用可能表现出不可预测的行为,从而导致 重入(Re-entrancy) 攻击或 gas 耗尽。
开发者假设外部调用将成功执行,而没有处理潜在的失败或意外行为。
Solidity 中未初始化的存储变量可以指向意外的内存位置,从而导致意外的行为或漏洞。
开发者可能忘记初始化一个存储变量,导致它默认到一个不可预测的状态。
DoS 攻击通过利用 gas 限制或 垃圾信息(spamming) 关键函数来中断合约的功能。
2016 年,对以太坊网络 Parity 多重签名钱包(multisig wallet) 合约的 DoS 攻击中断了其功能。
攻击者利用设计缺陷,例如依赖用户提供的数据或允许无限循环。
不正确地实施访问控制可能会允许未经授权的实体执行特权操作。
2020 年,Lendf.Me 协议因其访问控制机制中的缺陷而损失了 2500 万美元。
开发者可能忘记对敏感函数实施或强制执行访问限制。
抢先交易(Front-running) 是指恶意行为者利用区块链的透明性,抢先执行具有更高 gas 费用的交易。
DEX 交易和 NFT 拍卖是 抢先交易(front-running) 攻击的常见目标,攻击者拦截并从待处理交易中获利。
如果 预言机(oracle) 的数据 馈送(feed) 受到损害,依赖于来自 预言机(oracles) 的 链下(off-chain) 数据的智能合约可能会被操纵。
2020 年,bZx 协议在一周内两次遭到攻击,原因是 预言机(oracle) 操纵,导致损失了近 100 万美元。
攻击者向易受攻击的 预言机(oracle) 提交虚假数据或操纵价格 馈送(feed),以触发不利的合约行为。
智能合约通常需要 随机性(randomness) 来进行彩票、游戏或其他不可预测的结果。糟糕的实施可能会使 随机性(randomness) 变得可预测。
由于可预测的随机数生成,一些基于区块链的彩票平台遭到了攻击。
使用区块 时间戳(timestamps)、矿工地址或其他 链上(on-chain) 值作为 随机性(randomness) 来源会使结果可操纵。
智能合约漏洞对区块链生态系统的安全性和可信赖性构成了重大风险。虽然它们的自主性引入了效率,但也需要更高的开发严谨性标准。通过理解常见的漏洞并实施最佳实践,开发者可以降低风险并确保其智能合约的可靠性。安全审计、严格的测试和持续学习仍然是保障 去中心化应用(decentralized applications) 未来不可或缺的。
- 原文链接: blog.immunebytes.com/202...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!