智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

这篇具有很好参考价值的文章主要介绍了智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。

智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析

这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源很少,这篇文章对于有兴趣深入了解 ERC777 代币的人来说是一个有价值的详细指南。
在文章的最后部分,将解释我们最近的发现。

简短描述攻击载体

这个漏洞利用了 ERC777 的特性,能够设置一个 Hook 接收函数。通过利用在目标合约中进行任意调用的能力,恶意调用者可以调用 ERC777 注册表合约,并为目标合约分配一个特定的 Hook 地址。因此,只要目标合约在未来收到 ERC777 代币,攻击者的 Hook 合约就会被触发。这个 Hook 可以以各种方式加以利用:要么用于重入攻击以窃取代币,要么只是回退交易,从而阻止目标合约发送或接收 ERC777 代币。

ERC777 和它的 Hook

什么是 ERC777

ERC777 是带有转账 Hook 的代币标准之一。
这里是 EIP 描述:https://eips.ethereum.org/EIPS/eip-777 , 这里是一篇 ERC777 实践。
实现 ERC777 代币的主要动机在于希望能够模仿原生代币转账的行为。通过在代币接收时触发智能合约,开发人员可以执行特定的逻辑,以增强功能并创建更多动态的代币交互。
然而,这些在转账过程中的额外调用使 ERC777 与 ERC20 代币不同。这些 Hook 引入了一个新的攻击载体,可能会影响到那些没有设计时考虑到在代币转账过程中处理额外调用的智能合约。这种出乎意料的行为会给这些合约带来安全风险。
以下是以太坊主网上一些具有一定流动性的 ERC777 代币的列表:
VRA:https://etherscan.io/address/0xf411903cbc70a74d22900a5de66a2dda66507255
AMP:https://etherscan.io/address/0xff20817765cb7f73d4bde2e66e067e58d11095c2
LUKSO:https://etherscan.io/address/0xa8b919680258d369114910511cc87595aec0be6d
SKL:https://etherscan.io/address/0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7
imBTC:https://etherscan.io/address/0x3212b29e33587a00fb1c83346f5dbfa69a458923
CWEB:https://etherscan.io/address/0x505b5eda5e25a67e1c24a2bf1a527ed9eb88bf04
FLUX:https://etherscan.io/address/0x469eda64aed3a3ad6f868c44564291aa415cb1d9

当 Hook 发生时

ERC20 代币只是在转账过程中更新余额。但 ERC777 代币是这样做的:

  1. 对代币发起者的地址进行 Hook 调用
  2. 更新余额
  3. 对代币接收方地址进行 Hook 调用

这在 VRA 代币中得到了很好的说明:
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
源码: https://etherscan.io/address/0xf411903cbc70a74d22900a5de66a2dda66507255
现在,让我们检查一下这些调用的代码:
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
正如你所看到的:

  1. 这个函数从_ERC1820_REGISTRY 中读取称为 implementer(实现者)的合约
  2. 如果该函数找到了一个实现者,那么这个实现者就会被调用。

让我们研究一下这个注册表,看看什么是实现者。

注册表和实现者

所有 ERC777 代币都与注册表(Registry)的合约有关:https://etherscan.io/address/0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24。
这个地址被 ERC777 代币用来存储设定的 Hook 接收者。这些 Hook 接收者被称为 “接口实现者”。
这意味着 Alice 可以选择 Bob 作为她的接口实现者。如果 Alice 接收或发送 ERC777 代币,Bob 将收到 Hook。
Alice 可以管理不同的 Hook 类型。因此,当 Alice 发送代币时,她可以选择 Bob 作为接口实现者,而只有当 Alice 收到代币时,她选择 Tom 作为实现者。
在大多数情况下,她也可以为不同的代币选择不同的接口实现者。
这些偏好设置被存储在这个映射的注册表中:
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
_interfaceHash 是 Alice 为一个事件选择接口实现者的标识。
而任何人都可以用这个函数读取 Alice 的接口实现者:
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
正如你所看到的,这就是我们之前在 VRA 代码中遇到的函数。
变量_TOKENS_SENDER_INTERFACE_HASH 被用作_interfaceHash,它可以是任何字节。但是 VRA 代币使用这些字节来识别这种类型的 Hook:
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析

接收 Hook

设置一个 Hook 接收函数,Alice 只需在注册表上调用这个函数并输入 Bob 的地址作为_implementer 参数。
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
她还必须指定一个_interfaceHash。她会从 VRA 代币代码中获取这个_TOKENS_SENDER_INTERFACE_HASH。
还有一个重要的细节。
在为上面的 VRA 设置实现者后,Alice 也将会意识到,即使其他 ERC777 代币被转账,Bob 也会收到调用。
比如 imBTC, imBTC 在发送的代币上有相同的_interfaceHash。
这是由于所有 ERC777 代币共享相同的注册表合约来存储 Hook 的偏好设置。但这取决于 ERC777 代币为他们的 Hook 指定名称,虽然有时它们是相似的,但并不总是如此。

如何找到 ERC777 代币

调用注册表是所有 ERC777 都具有的特征。
因此,我们可以尝试dune.com来调用所有调用注册表的智能合约。
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
我们可以使用这个 SQL 脚本。事实上,我们应该另外过滤出代币地址,但至少我们有一个完美的开始,结果有 78 个地址。
译者备注:dune traces 表 会记录交易内部调用记录。

这个注册表是唯一可能的吗?

理论上,没有人能够保证某些代币恰好使用这个 0x1820 合约作为注册表。
但我们可以用dune.com来检查。
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击,智能合约,安全,区块链,web安全,安全威胁分析
它返回这些地址

0x1820a4b7618bde71dce8cdc73aab6c95905fad24
0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030
0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

我们检查过,0x1820 是唯一拥有有价值的 ERC777 代币的注册表。其他注册表的代币并不那么有价值。

可 Hook 代币的普遍情况

ERC777 不仅是一个带有 Hook 的标准。还有 ERC223、ERC995 或 ERC667。
它们并不那么稀奇。你一定听说过实现 ERC667 的LINK 代币。

使用任意调用的攻击载体

这是最近为Safful的客户发现的攻击载体。
研究人员通常认为 ERC777 代币会对调用发起者和接收者进行调用。但实际上,发起者和接收者可选择任意 “Bob” 作为 Hook 接收者。
因此,想象一下结合那些具有任何数据对任何地址进行任意调用的合约会发生什么?
就有任意调用功能的可以广泛存在于 DEX 聚合器、钱包、multicall 合约中。
译者注:任意调用功能是指在合约中存在类似这样的函数:
function execute(address target, uint value, string memory signature, bytes memory data, uint eta) public payable;
它可以调用任何的其他的方法。
攻击方法:

  1. 攻击者找到一个允许任意调用的函数的目标合约(Target)
  2. 攻击者在目标(Target)上调用:
  3. registy1820.setInterfaceImplementer(Target, hookHash, Attacker)
  4. 现在,我们的 Attacker 是 Target 的实现者
  5. Attacker 会随着 ERC777 代币中使用的 hookHash 而被调用。
  6. 每当目标合约(Target)收到 ERC777 代币时,Attacker 就会收到一个 Hook 调用。
  7. 下面的攻击,取决于 Target 代码 而不同:
    • Attacker 可以在一些用户执行目标合约中的函数时进行重入
    • Attacker 可以直接回退,这样用户的交易就直接被还原了

如果 DEX 聚合器计算最佳兑换路径是通过某个有 ERC777 代币的 DEX 交易对时,那么可能会遇到问题。

保护

经过与客户数小时的讨论,我们找到了一个不会破坏任意调用的解决方案。
项目方最好限制使用 Registry1820 作为任意调用的地址。因此,没有攻击者能够利用任意调用来设置接口实现者。

经验之谈

项目和审计人员必须注意到 ERC777 中描述的 Hook 行为。这些代币不仅对接收者和发起者进行调用,也对其他一些 Hook 接收者进行调用。
在这个意义上,允许任意调用的项目必须特别注意,并考虑 ERC777 的另一个攻击载体。文章来源地址https://www.toymoban.com/news/detail-762206.html

到了这里,关于智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • conflux开发NFT智能合约(ERC721 & 工厂合约 & 可升级合约)

    以下场景可借鉴本文内容 需要创建很多合约 需要使用conflux代付机制(只需将工厂合约设置为代付,即可无限创建新合约) 合约想要有可升级的能力(如:特殊玩法 or 代码有bug) ERC-721 NFT 基于以上场景,需要三个主要合约实现 工厂合约 代理合约 逻辑合约 想要完全掌握本文

    2024年01月17日
    浏览(51)
  • Solidity ERC777标准

    ERC777是一种能够向后兼容ERC20的代币标准,与ERC20的区别在于其新功能:openrater和hooks。 operator可以代理用户进行transfer、mint、burn操作,并且没有allowance的限制。应用场景举例: 1.有些朋友有多个以太坊钱包地址,不管是用于薅空投还是分批管理自己的代币资产;这样的情况下

    2024年02月16日
    浏览(48)
  • NFT合约分析:ERC721A

    读者可前往我的博客获得更好的阅读体验。 本文主要介绍标准NFT实现的一个变体,即 ERC721A 合约实现的相关细节。 ERC721A 是由著名NFT系列Azuki提出,该系列NFT是著名的蓝筹NFT。本文主要聚焦于 Azuki 提出的 ERC721A 合约的代码细节分析。 与传统的 ERC721 实现相比, ERC721A 在批量铸

    2023年04月26日
    浏览(50)
  • 关于以太坊ERC-20通证智能合约协议

    ERC代表“Etuereum Request for Comment”,以太坊社区为了创建一个以太坊平台的标准,开发人员提交了一个以太坊改进方案(EIP),改进方案中包括协议规范和合约标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。这使得智能合约可以遵循这些通用的接口标准来构建。可

    2024年02月04日
    浏览(43)
  • 如何使用Alchemy开发NFT智能合约(ERC721)

    使用Solidity开发智能合约并在区块链上部署可能一开始听起来有些吓人:Solidity、安全性、gas优化、开发环境和gas费用,这些只是你需要了解的一些事情,才能让你的代码托管在区块链上。不用担心,我们来帮你梳理一下。 不过,幸运的是,在过去几个月中,已经发布了许多工具,让开发人员可以更轻松地进行智能合约开发工作。

    2024年02月06日
    浏览(51)
  • 前端VUE使用web3调用小狐狸(metamask)和合约(ERC20)交互

    1.创建vue项目 2.安装web3 npm install web3 3.项目web3 main.js 项目结构 页面代码中引用web3,倒入ERC20代币的abi 项目页面   调用小狐狸metamask演示   项目任何难题,可以加入qq群:981921011      

    2024年02月15日
    浏览(46)
  • 探索 ERC721A:下一代NFT智能合约标准

    项目地址:https://gitcode.com/chiru-labs/ERC721A 在区块链世界中,非同质化代币(NFT)已经成为了一种创新的艺术形式和数字资产所有权的代表。随着市场的发展,对于更高效、更安全的NFT发行协议的需求日益增长。这就是我们今天要介绍的 ERC721A 出现的原因。这是一个针对以太坊网

    2024年03月27日
    浏览(55)
  • 调用智能合约报错分析小技巧 Error: execution reverted

    前端在调试调用合约的时候经常会遇到合约revert的情况,大部分区块浏览器只会显示 execution reverted,并不会把具体原因告诉我们。这个时候一般会去找合约大哥帮忙分析错误,但是合约大哥是怎么分析报错的呢? 这篇文章给你一个解题方法。 测试: main(\\\'0x5ac9e43a32a651e92cff8

    2024年02月11日
    浏览(51)
  • 通过metamask与合约交互(发送ERC20 TOKEN/原生TOKEN/方法调用) javascrpt实现

    1. 首先引入web3.js最新版本 ,再引入 jquery 遇到合约有ABI文件.个人习惯单独保存ABI文件.通过jquery远程读取. 实例化合约后直接在链上与合约交互 通过按钮什么的触发后就可以通过代码转账了.  2. 无ABI与合约交互,因为有的合约闭源了,所以我们直接手工构造data参数内容,免去了实

    2024年02月16日
    浏览(37)
  • 创建你自己的ERC-721代币:一个简单的以太坊游戏智能合约模板

    区块链游戏正在成为一种新兴的游戏形式,其中代币化的游戏资产成为了一个重要的组成部分。今天,我们将介绍一个简单的ERC-721智能合约模板,这个模板可以帮助你在以太坊区块链上创建你自己的ERC-721代币,让你的游戏更有趣。 源码下载 ERC-721是一种免费的开放标准,它

    2024年02月07日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包