前言
4 月 18 日,Tokenlon 宣布暂停 imBTC 转账,因其发现有攻击者通过 ERC777 在 Uniswap 流动性合约中的重入漏洞,对 ETH-imBTC 池循环套利。此次的攻击手法是一个存在于 Uniswap v1 上的已知漏洞,该漏洞最早由 Consensys 于 2019 年 4 月发现,当时 Consensys 只是发现了该风险,还没有发现可以利用这种手法进行攻击的 token。随后,在 imBTC 上线 Uniswap 后,由于 imBTC 是基于 ERC777 实现的,通过组合 ERC777 的特性及 Uniswap 代码上的问题,使攻击者可以通过重入漏洞实现套利。下面,我们将来分析此次套利中的攻击手法和具体的细节。
知识准备
ERC777 协议是以太坊上的代币标准协议,该协议是以太坊上 ERC20 协议的改进版,主要的改进点如下:
1. 使用和发送以太相同的理念发送 token,方法为:send(dest, value, data)
2. 合约和普通地址都可以通过注册 tokensToSend hook 函数来控制和拒绝发送哪些token(拒绝发送通过在hook函数tokensToSend 里 revert 来实现)
慢雾:Distrust发现严重漏洞,影响使用Libbitcoin Explorer3.x版本的加密钱包:金色财经报道,据慢雾区消息,Distrust 发现了一个严重的漏洞,影响了使用 Libbitcoin Explorer 3.x 版本的加密货币钱包。该漏洞允许攻击者通过破解 Mersenne Twister 伪随机数生成器(PRNG)来访问钱包的私钥,目前已在现实世界中造成了实际影响。
漏洞详情:该漏洞源于 Libbitcoin Explorer 3.x 版本中的伪随机数生成器(PRNG)实现。该实现使用了 Mersenne Twister 算法,并且仅使用了 32 位的系统时间作为种子。这种实现方式使得攻击者可以通过暴力破解方法在几天内找到用户的私钥。
影响范围:该漏洞影响了所有使用 Libbitcoin Explorer 3.x 版本生成钱包的用户,以及使用 libbitcoin-system 3.6 开发库的应用。
已知受影响的加密货币包括 Bitcoin、Ethereum、Ripple、Dogecoin、Solana、Litecoin、Bitcoin Cash 和 Zcash 等。
风险评估:由于该漏洞的存在,攻击者可以访问并控制用户的钱包,从而窃取其中的资金。截至 2023 年 8 月,已有超过 $900,000 美元的加密货币资产被盗。
解决方案:我们强烈建议所有使用 Libbitcoin Explorer 3.x 版本的用户立即停止使用受影响的钱包,并将资金转移到安全的钱包中。请务必使用经过验证的、安全的随机数生成方法来生成新的钱包。[2023/8/10 16:18:20]
3. 合约和普通地址都可以通过注册 tokensReceived hook 函数来控制和拒绝接受哪些token(拒绝接受通过在hook函数tokensReceived 里 revert 来实现)
慢雾:近期出现新的流行恶意盗币软件Mystic Stealer,可针对40款浏览器、70款浏览器扩展进行攻击:6月20日消息,慢雾首席信息安全官/img/2022811200052/0.jpg">可以发现,攻击者两度向 Uniswap 合约转帐 imBTC,金额同样是 0.00823084,然后从 Uniswap 收取了两笔 ETH,看上去似乎是十分正常的两笔交易,实际上却是暗流涌动,另有玄机。为了更好的了解整一笔交易的细节,我们需要通过 bloxy.info 来查看交易的具体细节。
从交易细节上看,这里似乎还是没有什么问题,我们继续跟踪 UniSwap 的代码。
上面是代码是 Uniswap 的 ethToTokenSwapInput 函数的代码,根据代码分析, Uniswap 的 ethToTokenSwapInput 函数会调用 ethToTokenInput 函数,然后会先通过 getInputPrice 获取代币能换取的 eth 数量,之后通过 send 函数将 eth 发给用户,最后再通过 transferFrom 把代币转进合约。我们继续跟进 getInputPrice 函数。
通过分析 getInputPrice 函数,我们能知道,ETH 获取量计算的公式为
把该公式放到 ethToTokenInput 函数的上下文中,该公式就变成了
防御方法
1. 在 Uniswap 的 tokenToEthSwapInput 函数中加入 OpenZeppelin 的 ReentrancyGuard 函数,防止重入问题。
2. 在进行代币交换的时候,先扣除用户的代币,再将 ETH 发送给用户。
同时,针对本次攻击事件慢雾安全团队建议:
1. 在关键的业务操作方法中加入锁机制,如:OpenZeppelin 的 ReentrancyGuard
2. 开发合约的时候采用先更改本合约的变量,再进行外部调用的编写风格
3. 项目上线前请优秀的第三方安全团队进行全面的安全审计,尽可能的发现潜在的安全问题
4. 多个合约进行对接的时候也需要对多方合约进行代码安全和业务安全的把关,全面考虑各种业务场景相结合下的安全问题
5. 合约尽可能的设置暂停开关,在出现“黑天鹅”事件的时候能够及时发现并止损
6. 安全是动态的,各个项目方也需要及时捕获可能与自身项目相关的威胁情报,及时排查潜在的安全风险
最后的思考
这两天的 DeFi 世界被闹得沸沸扬扬,imBTC 作为 ERC777 代币首当其冲,ERC777 协议也饱受诟病,但是看完分析,造成此次的攻击事件原因,真的是 imBTC 或者是 ERC777 协议的问题吗?
如果 Uniswap 做好了 ERC777 的兼容,使用 ReentrancyGuard,并在代币交换的时候先扣除用户的代币,再将 ETH 发送给用户,这样的问题是不是就不会发生?
imBTC 作为 以太坊上 token 化的比特币代币协议,其安全性在自身单独运行的时候并不存在问题,第三方 DeFi 平台在接入的时候,应需要充分考虑平台本身的业务逻辑与接入代币之间的兼容性,才能避免因兼容性发生不必要的安全问题。而不是简单的将问题归咎于协议和代币提供方。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。