以太坊智能合约安全漏洞 (1):重入攻击

本文转自公众号:亨利笔记
首发于: https://hash1024.org/topics/27

本文的英文原文已有若干个中文翻译版本,但译文和原文都有错漏或不足。本文系基于译者(Henry)的理解,重新翻译并做了修正,并且加入了个人的注解和插图,力求让读者更容易领会原文的含义。为不影响阅读体验,注解没有单独标出, 可当译文 +“笔记”来阅读。感兴趣的读者可参考文末的原文地址。

虽然仍然处于起步阶段,但 Solidity 已被广泛采用,成为事实上的智能合约标准,新的区块链项目不少都兼容了 Solidity 语言, Solidity 已经用于编写了大量的以太坊智能合约。由于语言和EVM的细微差别,开发人员和用户都体会到了许多深刻的经验教训。本文目的是作为相对深入和最新的介绍性文章,详细阐述 Solidity 开发人员如何吸取前人踩坑的教训,避免重蹈覆辙。

重入问题(Re-Entrancy)

以太坊智能合约能够调用和利用其他外部合约的代码。合约通常也处理以太币,因此将以太币发送到各种外部用户地址。调用外部合约或将以太币发送到地址的操作要求合约提交外部调用。这些外部调用可以被攻击者劫持,从而迫使合约执行更多的代码(即通过 fallback 回退函数),包括回调原合约本身。所以,合约代码执行过程中将可以“重入”该合约,有点像编程语言里面的间接递归函数调用。在臭名昭著的The DAO事件中黑客使用了这种攻击,最终导致了以太坊的硬分叉。

漏洞细节

当合约将以太币发送到未知地址时,可能会发生此攻击。攻击者可以在外部地址小心地构建合约,该地址包含回退函数中的恶意代码。因此,当合约把以太币发送到此地址时,将激活恶意代码。通常,恶意代码在易受攻击的合约上执行函数,是开发人员没有预期的操作。

“Re-entrancy”的名称来自这样的现实:外部恶意合约回调了受攻击合约上的一个函数,并在受攻击合约上的任意位置“重新进入”代码执行。因为原合约的程序员可能没有预料到合约代码可以被“重入”,因此合约会出现不可预知的行为。</

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值