您好,欢迎您来到林间号!
官网首页 小额贷款 购车贷款 购房贷款 抵押贷款 贷款平台 贷款知识 手机租机

林间号 > 区块链 > ERC777 与任意调用合约可能出现的安全问题,调用合约失败

ERC777 与任意调用合约可能出现的安全问题,调用合约失败

区块链 岑岑 本站原创

最近在和我们的一个客户合作的时候,发现了一个有趣的错误,可能会成为一些DeFi项目的攻击媒介。这个错误尤其与著名的ERC777令牌标准有关。另外,不仅仅是知名黑客中常见的简单的重入问题。

本文全面解释了ERC777,涵盖了所有必要的细节。很少有资源深入研究ERC777令牌的细节。对于那些有兴趣深入了解ERC777令牌的人来说,本文是一份有价值的详细指南。

在文章的最后,我们将解释我们最近的发现。

攻击载体的漏洞简述利用了ERC777的特性,可以设置钩子接收功能。通过利用在目标协定中进行任意调用的能力,恶意调用方可以调用ERC777注册表协定,并为目标协定分配特定的挂钩地址。因此,只要目标契约在未来收到ERC777令牌,攻击者的钩子契约就会被触发。这个钩子可以以多种方式使用:或者用于重入攻击以窃取令牌,或者只是回滚事务,从而阻止目标契约发送或接收ERC777令牌。

ERC777及其钩子什么是ERC777ERC777是带有传送钩子的令牌标准之一。下面是https://eips.ethereum.org/EIPS/eip-777,对EIP的描述:这里是一个ERC777的练习[4]。

实现ERC777令牌的主要动机是模仿原生令牌的传输行为。通过在收到令牌时触发智能合约,开发人员可以执行特定的逻辑来增强功能并创建更动态的令牌交互。

但是,传输过程中的这些额外调用使得ERC777不同于ERC20令牌。这些挂钩引入了新攻击媒介,这可能会影响那些不是为处理令牌传输期间的额外调用而设计的智能合约。这种意想不到的行为会给这些合同带来安全隐患。

以下是以太坊主网上部分具有一定流动性的ERC777代币列表:

当钩子出现的时候,

ERC20代币仅在转账过程中更新余额。但是ERC777令牌可以做到这一点:

1.挂钩令牌发起者的地址。

2.更新余额

3.挂钩令牌接收者的地址。

VRA令牌很好地说明了这一点:

源代码:https://ethers can . io/address/0xf 411903 CBC 70 a 74d 22900 a5de 66 a2 DDA 66507255。

现在,让我们检查这些调用的代码:

如你所见:

此函数从_ERC1820_REGISTRY中读取名为implementer的契约。

如果函数找到一个实现者,那么这个实现者将被调用。

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

实现者的注册表和所有ERC777令牌都与注册表的契约有关:https://ethers can . io/address/0x 1820 a4 b 7618 bde 71 DCE 8 CD 73 aab 6 c 95905 fad 24。

ERC777令牌使用该地址来存储设置的挂钩接收器。这些钩子接收者被称为& # 8220;接口实现者& # 8221;。

这意味着Alice可以选择Bob作为她的接口实现者。如果Alice接收或发送ERC777令牌,Bob将接收Hook。

爱丽丝可以管理不同类型的钩子。因此,当Alice发送令牌时,她可以选择Bob作为接口的实现者,只有当Alice收到令牌时,她才选择Tom作为实现者。

在大多数情况下,她还可以为不同的令牌选择不同的接口实现者。

这些首选项存储在此映射注册表中:

_interfaceHash是Alice为事件选择的接口实现者的标识符。

而且任何人都可以用这个函数来读取Alice的接口实现者:

如你所见,这是我们之前在VRA代码中遇到的函数。

变量_TOKENS_SENDER_INTERFACE_HASH用作_interfaceHash,可以是任意字节。但是VRA令牌使用这些字节来标识这种类型的钩子:

接收钩子设置一个钩子接收函数,Alice只需要在注册表上调用这个函数,输入Bob的地址作为_implementer参数。

她还必须指定一个_interfaceHash。她将从VRA令牌码中获得这个_令牌_发送者_接口_散列。

还有一个重要的细节。

在为上面的VRA设置了实现者之后,Alice会意识到,即使转移了其他ERC777令牌,Bob也会被调用。例如,imBTC[5]在发送的令牌上有相同的_interfaceHash。

这是因为所有的ERC777令牌共享同一个注册表契约来存储Hook的首选项。但是要由ERC777令牌来给它们的钩子命名。虽然有时它们是相似的,但并不总是这样。

如何找到ERC777令牌来调用注册表是所有ERC777的一个特性。所以我们可以尝试dune.com[6]调用所有调用注册中心的智能合约。

我们可以使用这个SQL脚本。其实应该单独过滤掉令牌地址,但至少我们有一个完美的开始,有78个地址。

译者注:dune traces表[7]会记录事务的内部调用记录。

这个注册表是唯一的可能性吗?理论上,没有人能保证某些令牌只是使用这个0x1820契约作为注册表。但是我们可以使用dune.com[8]来检查。

它返回这些地址。

0x1820 a 4b 7618 bde 71 DCE 8 CDC 73 aab 6 c 95905 fad 240 x0ce 3461 c 92d 95 be 4 E1 d 3 abeb 5 c 9d 378 B1 e 4180300 x820c 4597 C3 e 4193282576750 ea 4 fcfe 34 ddf 0 a 7我们查了一下,只有0x 1820有价值的ERC777代币。来自其他注册中心的令牌并不那么有价值。

钩子令牌ERC777的概况不仅仅是一个带钩子的标准。以及ERC223、ERC995或ERC667。他们没那么不寻常。你一定听说过实现ERC667 [9]的链接令牌。

使用可以随意调用的攻击向量。这是我们的客户最近发现的一种攻击媒介。

研究人员通常认为ERC777令牌会呼叫呼叫的发起者和接收者。但实际上,发起者和接收者可以任意选择& # 8220;鲍勃& # 8221;作为钩形接收器。

因此,想象一下,当您将任意调用任意地址和任意数据的合同组合在一起时会发生什么。

在DEX聚合器、钱包和多呼叫契约中可以广泛使用任意函数。

译者注:随意调用一个函数意味着契约中存在这样的函数:

函数execute(地址目标、uint值、字符串内存签名、字节内存数据、uint eta)public payable;

它可以调用任何其他方法。

攻击方法:

攻击者找到一个允许任意调用函数的目标。

攻击者呼叫目标:

registy 1820 . setinterfaceiimplementer(目标、挂钩散列、攻击者)

现在,我们的攻击者是目标的实现者。

将使用ERC777令牌中使用的hookHash调用攻击者。

每当目标契约收到ERC777令牌时,攻击者就会收到一个钩子调用。

以下攻击因目标代码而异:

当一些用户执行目标契约中的功能时,攻击者可以重新进入。

攻击者可以直接回滚,让用户的事务直接恢复。

如果DEX聚合器通过带有ERC777令牌的DEX事务对计算最佳交换路径,它可能会遇到问题。

经过与客户数小时的讨论,我们找到了一个不会破坏任意呼叫的解决方案。

项目方最好限制使用Registry1820作为任何呼叫的地址。因此,任何攻击者都不能使用任意调用来设置接口实现者。

根据经验,项目和审计人员必须注意ERC777中描述的挂钩行为。这些令牌不仅调用接收者和发起者,还调用其他钩子接收者。

从这个意义上说,允许任意调用的项目必须特别注意,要考虑ERC777的另一个攻击载体。

本网站声明:网站内容来源于网络。如有侵权,请联系我们,我们会及时处理。

温馨提示:注:内容来源均采集于互联网,不要轻信任何,后果自负,本站不承担任何责任。若本站收录的信息无意侵犯了贵司版权,请给我们来信,我们会及时处理和回复。

原文地址"ERC777 与任意调用合约可能出现的安全问题,调用合约失败":http://www.ljycsb.cn/qukuailian/212182.html

微信扫描二维码投放广告
▲长按图片识别二维码