揭秘以太坊 TIME 合约黑客攻击事件,如何利用 ERC2771 协议安全问题获利?
2023-12-11 04:05
Beosin
2023-12-11 04:05
Beosin
2023-12-11 04:05
订阅此专栏
收藏此文章
当我们都以为这本是一场普通的攻击。

20231207日,据BeosinEagle Eye平台消息,以太坊的TIME 合约遭受黑客攻击,黑客获利约18.8万美元

EagleEye 平台截图

但我们发现,本次事情好像不止这么简单。

通过追踪溯源发现,我们发现在 2023 年 12 月 4 日,thirdweb 就在博客和官方发布漏洞公告称2023 年 11 月 20 日,我们意识到 web3 智能合约常用开源库特定模式的集成存在安全漏洞,该漏洞影响了 Thirdweb 的一些预构建智能合约,并联系了相关项目方进行缓解。

相关链接:
https://twitter.com/thirdweb/status/1731841493407576247
https://blog.thirdweb.com/security-vulnerability/

12 月 7 日,以太坊的 TIME 合约,成为第一个因该安全问题受害的第一项目。

今天让我们还原一下本次攻击事件真相。


协议背景简介


ERC2771 原生元交易安全协议:

EIP 2771 协议为接收者合约定义了合约级协议,以通过可信转发器合约接受元交易。没有进行任何协议更改。通过附加额外的 calldata 向接收者合约发送有效的 msg.sender(称为 _msgSender())和 msg.data(称为 _msgData()),该协议设计的初衷在于让以太坊接受来自没有 ETH 来支付 Gas 费用的外部账户的调用。

由于该设计的特殊性,其 msg.sender 正如其协议描述的那样是通过_msgSender() 函数获取的,该函数会会判断发起者是否为可信转发器,如果是,则将截取传入的 Calldata 的最后 20 个字节作为交易的发起者。
 
参考链接:https://eips.ethereum.org/EIPS/eip-2771
https://etherscan.io/address/0x4b0e9a7da8bab813efae92a6651019b8bd6c0a29#code

Muticall 批处理调用库:

Muticall 是一个由 openzeppelin contacts 提供的单个外部调用中批量处理多个调用的功能库。

从 Time 事件中我们可以看见其 Multicall() 函数中将循环调用 DelegateCall 函数处理 Calldata 并调用本合约的其他函数。

参考链接:
https://github.com/OpenZeppelin/openzeppelin-contracts
https://etherscan.io/address/0x4b0e9a7da8bab813efae92a6651019b8bd6c0a29#code


TIME 合约事件相关信息


●攻击交易
0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6
●攻击者地址
0xfde0d1575ed8e06fbf36256bcdfa1f359281455a
●攻击合约
0x6980a47bee930a4584b09ee79ebe46484fbdbdd0
●被攻击合约
0x4b0e9a7da8bab813efae92a6651019b8bd6c0a29


TIME 合约事件漏洞分析


本次攻击主要利用了转发器(Forwarder)合约调用了 TIME 代币的 multicall 函数,并由于 TIME 代币使用了 ERC2771 原生元交易的安全协议,从而恶意伪造_msg.sender 进而销毁了 pair 中的代币。最终由于 token 代币价格上涨兑换而获利。

TIME 合约事件攻击流程


1.攻击者首先使用 5 个 WTH 兑换约 34.5 亿个 Time 代币作为准备资金。
 
2.接着攻击者调用转发器的 execute 函数通过签名验证,并传入恶意的 calldata,如下
 
3.此时 execute 函数会调用 req.to 地址(Time 代币地址),并将 req.data 和 req.from 地址打包并调用 Time 代币的 multicall 函数。那这里黑客是如何将 req.from 给舍弃的呢?原因在于黑客将 data[1]的长度(size)设置为了 0x38,那么 muticall 在解析 data 时 req.from 将被截断。
 

参考:https://docs.soliditylang.org/en/v0.8.12/abi-spec.html

4. muticall 函数以 pair 的调用者身份调用 burn 函数销毁 piar 中的 Time 代币。
 
5. 最后攻击者调用 pair 中的 sync 函数同步 pair 中的储备量,使得 Time 代币价格上涨。

最后黑客使用准备阶段获得的 TIME 代币在 pair 中兑换 ETH 从而获利 18.8 万美元。
 
这次攻击事件再次提醒我们,智能合约的安全性至关重要,项目方必须加强对漏洞的识别和修复,以确保区块链生态系统的可持续发展和用户的资产安全。

Beosin 作为一家全球领先的区块链安全公司,在全球 10 多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控、预警与阻断、虚拟货币被盗资产追回、安全合规 KYT/AML 等“一站式”区块链安全产品 + 服务,公司致力于 Web3 生态的安全发展,已为全球 3000 多个企业提供区块链安全技术服务,包括 HashKey Group、Amber Group、BNB Chain 等,已审计智能合约和公链主网超 3000 份,包括 PancakeSwap、Ronin Network、OKCSwap 等。欢迎点击公众号留言框,与我们联系。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Beosin
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开