最近,在与我们的一个客户合作时,我们发现了一个有趣的错误,有可能成为一些DeFi项目的攻击媒介。这个错误尤其与著名的ERC777代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。
这篇文章对ERC777进行了全面的解释,涵盖了所有必要的细节。深入研究ERC777代币的具体细节的资源很少,这篇文章对于有兴趣深入了解ERC777代币的人来说是一个有价值的详细指南。
在文章的最后部分,将解释我们最近的发现。
这个漏洞利用了ERC777的特性,能够设置一个Hook 接收函数。通过利用在目标合约中进行任意调用的能力,恶意调用者可以调用 ERC777 注册表合约,并为目标合约分配一个特定的Hook地址。因此,只要目标合约在未来收到ERC777代币,攻击者的Hook合约就会被触发。这个Hook可以以各种方式加以利用:要么用于重入攻击以窃取代币,要么只是回退交易,从而阻止目标合约发送或接收ERC777代币。
ERC777是带有转账Hook的代币标准之一。这里是 EIP描述:https://eips.ethereum.org/EIPS/eip-777 , 这里是一篇 ERC777 实践。
FTX调整ERC20免费提币服务,质押低于150 FTT将收取手续费:加密衍生品交易平台FTX官方公告表示,鉴于最近以太坊的拥堵以及疯狂增长的GAS费,FTX对ERC20的免费提币服务进行了调整,细节如下:FTX将于新加坡时间2021年2月25日中午12点开始对ERC20提币收取手续费。如果用户质押≥150个FTT,仍可继续享受免费的ERC20提币。
此外,FTX将继续为非ERC20免费提币。FTX目前支持的非ERC20的制式包括:SPL(Solana链),TRC20,Omni (仅支持USDT的omni提币),BEP(仅支持BUSD的BEP提币)。[2021/2/25 17:51:04]
实现ERC777代币的主要动机在于希望能够模仿原生代币转账的行为。通过在代币接收时触发智能合约,开发人员可以执行特定的逻辑,以增强功能并创建更多动态的代币交互。
然而,这些在转账过程中的额外调用使ERC777与ERC20代币不同。这些Hook引入了一个新的攻击载体,可能会影响到那些没有设计时考虑到在代币转账过程中处理额外调用的智能合约。这种出乎意料的行为会给这些合约带来安全风险。
以下是以太坊主网上一些具有一定流动性的ERC777代币的列表:
Baer Chain官方映射销毁ERC20的BRC完成:据官方最新消息,近期Baer Chain官方映射销毁502455115.6枚基于ERC20发行的BRC,之前已经销毁基于ERC20发行的BRC为76079550.6枚,合计本次销毁共578534666.2枚,销毁率为99.74%。随着近期官方发布BAS协议,Baer Chain已开启全新独立时代。本次官方销毁查询地址见原文链接。[2020/3/19]
当Hook发生时
ERC20 代币只是在转账过程中更新余额。但ERC777代币是这样做的:
1.对代币发起者的地址进行Hook调用
2.更新余额
3.对代币接收方地址进行Hook调用
这在VRA代币中得到了很好的说明:
源码: https://etherscan.io/address/0xf411903cbc70a74d22900a5de66a2dda66507255
现在,让我们检查一下这些调用的代码:
分析 | 以太坊算力和活跃地址数小幅滑落 ERC20代币总市值占比有所抬头:据TokenGazer数据分析显示,截止至6月4日11时,以太坊价格为$249.46,总市值为$26,534.43M,主流交易所交易量约为$407.68M,对比特币汇率保持平稳波动;大概率受比特币下挫影响,以太坊早间价格也有一定下滑;基本面方面,以太坊链上交易量保持相对上涨的趋势,算力和活跃地址数有一定滑落;搜索方面,以太坊的搜索热度逐渐下滑;目前ERC20代币总市值约为以太坊总市值的59.02%,ERC20总市值占比有一定回升;在ERC20活跃地址数方面,排名前五的代币为CRO、USDC、LBA、DAI、TUSD。[2019/6/4]
正如你所看到的:
这个函数从_ERC1820_REGISTRY中读取称为implementer(实现者)的合约
如果该函数找到了一个实现者,那么这个实现者就会被调用。
让我们研究一下这个注册表,看看什么是实现者。
所有 ERC777 代币都与注册表(Registry)的合约有关:https://etherscan.io/address/0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24。
这个地址被ERC777代币用来存储设定的 Hook 接收者。这些 Hook 接收者被称为 "接口实现者"。
动态 | Pandora Boxchain开发出ERC1329令牌:据 Coincryptorama 消息,Pandora Boxchain联合创始人Maxim Orlovsky宣布,团队开发了ERC1329令牌的参考实现,这个令牌在GitHub上可用。他说,这个令牌不是具有市场价格和经济价值的普通令牌的替代品,而是对它们的补充。[2018/9/17]
这意味着Alice可以选择Bob作为她的接口实现者。如果Alice接收或发送ERC777代币,Bob将收到Hook。
Alice 可以管理不同的Hook类型。因此,当 Alice发送代币时,她可以选择Bob作为接口实现者,而只有当Alice收到代币时,她选择Tom作为实现者。
在大多数情况下,她也可以为不同的代币选择不同的接口实现者。
这些偏好设置被存储在这个映射的注册表中:
_interfaceHash是Alice为一个事件选择接口实现者的标识。
而任何人都可以用这个函数读取Alice的接口实现者:
币安:ERC20代币提款手续费降低25%:币安创始人赵长鹏发推文称,币安上ERC20代币提款手续费降低了25%,此费率将不断调整变化。[2018/2/26]
正如你所看到的,这就是我们之前在VRA代码中遇到的函数。
变量_TOKENS_SENDER_INTERFACE_HASH被用作_interfaceHash,它可以是任何字节。但是VRA代币使用这些字节来识别这种类型的Hook:
设置一个Hook接收函数,Alice只需在注册表上调用这个函数并输入Bob的地址作为_implementer参数。
她还必须指定一个_interfaceHash。她会从VRA代币代码中获取这个_TOKENS_SENDER_INTERFACE_HASH。
还有一个重要的细节。
在为上面的VRA设置实现者后,Alice 也将会意识到,即使其他ERC777代币被转账,Bob也会收到调用。比如 imBTC, imBTC在发送的代币上有相同的_interfaceHash。
这是由于所有ERC777代币共享相同的注册表合约来存储Hook的偏好设置。但这取决于ERC777代币为他们的Hook指定名称,虽然有时它们是相似的,但并不总是如此。
调用注册表是所有 ERC777 都具有的特征。因此,我们可以尝试dune.com来调用所有调用注册表的智能合约。
我们可以使用这个SQL脚本。事实上,我们应该另外过滤出代币地址,但至少我们有一个完美的开始,结果有78个地址。
译者备注:dune traces表 会记录交易内部调用记录。
理论上,没有人能够保证某些代币恰好使用这个0x1820合约作为注册表。但我们可以用dune.com来检查。
它返回这些地址
0x1820a4b7618bde71dce8cdc73aab6c95905fad240xc0ce3461c92d95b4e1d3abeb5c9d378b1e4180300x820c4597fc3e4193282576750ea4fcfe34ddf0a7我们检查过,0x1820是唯一拥有有价值的ERC777代币的注册表。其他注册表的代币并不那么有价值。
ERC777 不仅是一个带有Hook的标准。还有 ERC223、ERC995或ERC667。它们并不那么稀奇。你一定听说过实现 ERC667 的LINK代币。
这是最近为我们的客户发现的攻击载体。
研究人员通常认为ERC777代币会对调用发起者和接收者进行调用。但实际上,发起者和接收者可选择任意 "Bob" 作为Hook接收者。
因此,想象一下结合那些具有任何数据对任何地址进行任意调用的合约会发生什么?
就有任意调用功能的可以广泛存在于 DEX 聚合器、钱包、multicall 合约中。
译者注:任意调用功能是指在合约中存在类似这样的函数:
function execute(address target, uint value, string memory signature, bytes memory data, uint eta) public payable;
它可以调用任何的其他的方法。
攻击方法:
攻击者找到一个允许任意调用的函数的目标合约(Target)
攻击者在目标(Target)上调用:
registy1820.setInterfaceImplementer(Target, hookHash, Attacker)
现在,我们的Attacker 是 Target 的实现者
Attacker 会随着 ERC777代币中使用的 hookHash 而被调用。
每当目标合约(Target)收到ERC777代币时,Attacker就会收到一个 Hook 调用。
下面的攻击,取决于 Target代码 而不同:
Attacker 可以在一些用户执行目标合约中的函数时进行重入
Attacker 可以直接回退,这样用户的交易就直接被还原了
如果DEX聚合器计算最佳兑换路径是通过某个有ERC777代币的DEX交易对时,那么可能会遇到问题。
经过与客户数小时的讨论,我们找到了一个不会破坏任意调用的解决方案。
项目方最好限制使用 Registry1820作为任意调用的地址。因此,没有攻击者能够利用任意调用来设置接口实现者。
项目和审计人员必须注意到ERC777中描述的Hook行为。这些代币不仅对接收者和发起者进行调用,也对其他一些Hook接收者进行调用。
在这个意义上,允许任意调用的项目必须特别注意,并考虑ERC777的另一个攻击载体。
登链社区
个人专栏
阅读更多
金色早8点
Odaily星球日报
金色财经
Block unicorn
DAOrayaki
曼昆区块链法律
标签:777HOOHOOKRC27777欢乐代币券买什么hook币最新消息HOOK币itokenwallet转trc20需要手续费吗
加密世界的新晋热门,ZK-Rollup 技术何以成为开发者们竞相追逐的热点?高度保障隐私与安全,拥有强大的扩容能力,是否能让 ZK-Rollup 技术在市场竞争中突出重围?面向 Web3 的未来.
1900/1/1 0:00:00从搬运 BRC-20 Token 发行模式到 ETH 的 $FERC、到直接把图片转 Base64 字符串插入到 ETH 交易的 Hex Data 字段实现 比特币 NFT 刻录方式的 ETHscriptions.
1900/1/1 0:00:007月3日币安宣布其创新区于18:00上线Pendle,并成为Binance Launchpool上的第35个项目,7月4日8:00开始挖矿.
1900/1/1 0:00:00随着 Azuki 事件的发酵,NFT 社区和行业都在面临着考验。不仅各大蓝筹 NFT 系列经历了不同幅度的下跌,众多 NFT 借贷平台也承受了压力.
1900/1/1 0:00:00作者:杨涛 国家金融与发展实验室副主任 摘要 自从ChatGPT横空出世,这款人工智能对话机器人俨然成为了全球最热门的话题之一.
1900/1/1 0:00:00作者:Chainalysis;编译:深潮TechFlow加密货币市场,正在日益变得复杂。散户、巨鲸、机构和交易平台.... 不同的角色有不同的交易行为,而识别和理解这些行为比以往任何时候都更为重要.
1900/1/1 0:00:00