Solidity常见安全漏洞

  • Dedaub
  • 发布于 2024-08-28 16:38
  • 阅读 14

本文探讨了Solidity智能合约中常见的安全漏洞,包括访问控制失效、未经验证的外部调用、重入攻击、整数溢出/下溢、Gas耗尽情况、Oracle数据陈旧和操纵等问题。强调了智能合约安全的重要性,并建议开发者在部署前进行代码审计,并使用安全工具来尽早发现和修复漏洞。

Ingram Bondin

常见的 Solidity 安全漏洞

Solidity 安全漏洞

理解和缓解 Solidity 安全漏洞

对于在以太坊区块链和其他 EVM 兼容平台上构建智能合约的开发者来说,Solidity 安全漏洞是至关重要的问题。Solidity 是在以太坊区块链和其他 EVM 兼容平台上创建智能合约的主要语言。它使开发者能够构建自动执行复杂流程的去中心化应用程序 (DApp)。然而,区块链的不可变性和去中心化特性使得智能合约中的漏洞尤其关键。正如许多备受瞩目的黑客事件所表明的那样,一个单一的安全缺陷可能导致数百万美元加密货币的损失。

本指南着眼于最常见的 Solidity 安全漏洞。

访问控制失败

最常见的 Solidity 安全漏洞 之一是未能使用访问控制修饰符保护敏感的外部函数。通常,合约会具有一些特权功能,这些功能应该只能由合约的所有者调用,例如,配置其某些参数。未能使用诸如 onlyOwner 之类的访问控制修饰符来保护此功能可能会导致灾难性的后果,因为任何攻击者都将能够修改智能合约的核心行为。

未经检查的外部调用

未经检查的外部调用可能会引入重大的 Solidity 安全漏洞

开发者应该控制他们的应用程序与哪些合约进行交互。信任任意合约并将控制权交给它们意味着接受恶意合约可能会与你的应用程序进行交互。这可能导致意外的行为,甚至攻击。

一般来说,开发者应该只与受信任的合约进行交互。如果这些合约是未知的,他们应该实施一个系统,允许合约所有者按需将合约加入白名单。

重入攻击

重入是一种臭名昭著的 Solidity 安全漏洞,其中外部合约可以劫持目标合约的控制流. 当智能合约的外部函数在继续执行其自身的状态修改代码之前,临时将控制权转移到另一个合约时,可能会发生这些情况。

如果另一个合约是恶意的,它可以再次调用外部函数,使其在控制权转移发生之前重新执行代码。这种情况发生在外部函数完成超出控制点转移的原始调用的执行之前。该过程称为重入,并可能允许攻击者以不希望的方式更改合约的状态。

开发者可以通过使用 checks-effects-interactions 模式来防止此类攻击。此模式确保所有状态更改都发生在将控制权转移到外部合约之前。任何重入尝试都会产生一个新的调用,从而避免与部分执行的计算进行交互。

整数溢出/下溢

Solidity 使用整数数据类型进行各种计算。超出这些数据类型的最大值或最小值可能会导致溢出或下溢。如果发生这种情况,Solidity 0.8.0 或更高版本将自动恢复,这可能会导致智能合约中出现意外的恢复。另一方面,如果整数变量是未检查代码的一部分,它们会回绕,尽管这可能会导致意外行为,除非有特定原因导致不会发生溢出和下溢。

Gas 不足的情况

以太坊对交易设置了 gas 限制,以防止无限循环和资源耗尽。智能合约开发者必须了解这些限制并妥善处理 gas 不足的情况。

例如,资源密集型循环可能会因达到 gas 限制而导致交易失败,这可能会导致令人沮丧的用户体验。

有时,这种情况也可能导致拒绝服务 (DoS) 攻击,攻击者可以任意延长循环的长度,从而有效地禁用该功能。

这种情况的一个例子是循环所有注册用户并向他们发送一些资金的函数。攻击者可以通过使用此系统注册许多虚假帐户来增加此循环的长度。

一般来说,最好避免嵌套循环,并采用拉取系统,其中单个用户请求操作,而不是为所有用户执行操作的推送系统。

Oracle 数据过时和操纵

某些合约与 oracle 交互,oracle 在区块链上提供链下数据,例如 Chainlink 价格馈送。开发者在与 oracle 交互时,应该对提供的数据执行基本的完整性检查。因此,如果 oracle 失败,拥有备用计划至关重要。

例如,合约应始终通过检查最后一个数据点的时间戳不超过过去指定的数量来检查数据是否已过时。他们还应检查数据是否为异常值,例如零或负数。在这些情况下,合约应采取合理的默认值或暂停应用程序,直到信息源再次开始报告正确的数据。

开发者应该只使用高质量的 oracle,以避免上面提到的一些问题。某些 oracle,例如来自自动化做市商 (AMM) 的定价数据,不能被依赖,因为它们可能会受到价值操纵。此类操纵也会对你的应用程序产生连锁反应。

结论:Solidity 安全漏洞

Solidity 是一种强大的语言,但很容易犯导致严重漏洞的错误。这些只是可能对智能合约产生破坏性影响的众多漏洞中的一小部分。因此,在主网上线之前,审计你的代码至关重要。

你还可以使用诸如 Dedaub Security Suite 之类的工具来尽早发现问题。此工具可帮助你查找并修复智能合约中的漏洞,从而使你在部署之前对代码充满信心。立即在 app.dedaub.com 创建你的免费帐户。

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

0 条评论

请先 登录 后评论
Dedaub
Dedaub
Security audits, static analysis, realtime threat monitoring