火星链 火星链
Ctrl+D收藏火星链
首页 > SOL > 正文

TOKEN:慢雾:详解 Uniswap 的 ERC777 重入风险

作者:

时间:1900/1/1 0:00:00

前言

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 来实现)

慢雾:Platypus再次遭遇攻击,套利者获取约5万美元收益:7月12日消息,SlowMist发推称,稳定币项目Platypus似乎再次收到攻击。由于在通过CoverageRatio进行代币交换时没有考虑两个池之间的价格差异,导致用户可以通过存入USDC然后提取更多USDT来套利,套利者通过这种方式套利了大约50,000美元USDC。[2023/7/12 10:50:27]

3. 合约和普通地址都可以通过注册 tokensReceived hook 函数来控制和拒绝接受哪些token(拒绝接受通过在hook函数tokensReceived 里 revert 来实现)

4. tokensReceived 可以通过 hook 函数可以做到在一个交易里完成发送代币和通知合约接受代币,而不像 ERC20 必须通过两次调用(approve/transferFrom)来完成

5. 持有者可以"授权"和"撤销"操作员(operators: 可以代表持有者发送代币) 这些操作员通常是(去中心化)交易所、支票处理机或自动支付系统

6. 每个代币交易都包含 data 和 operatorData 字段, 可以分别传递来自持有者和操作员的数据

慢雾:苹果发布可导致任意代码执行的严重漏洞提醒,请及时更新:7月11日消息,慢雾首席信息安全官23pds发推称,近日苹果发布严重漏洞提醒,官方称漏洞CVE-2023-37450可以在用户访问恶意网页时导致在你的设备上任意代码执行,据信这个已经存在被利用的情况,任意代码危害严重,请及时更新。[2023/7/11 10:47:05]

7. 可以通过部署实现 tokensReceived 的代理合约来兼容没有实现tokensReceived 函数的地址

在这里,我们需要特别关注的点是第二点,即 ERC777 标准中的 tokenToSend 函数,根据 ERC777 协议的定义,遵循该标准的 token 代币在每一次发生代币转账的时候都会去尝试调用代币发送者 tokensToSend 函数,而代币持有者可以通过在 ERC1820 注册合约注册自己的合约并通过在这个 hook 函数中定义一些操作来处理代币转账的过程中的某些流程,如拒绝代币发送或其他操作。

了解这些关键点,有助于我们理解这次攻击的具体攻击手法。现在开始,我们可以稍微加速,看看对于 Uniswap 而言,这次到底发生了什么?

细节分析

慢雾:BTFinance被黑,策略池需防范相关风险:据慢雾区情报,智能DeFi收益聚合器BT.Finance遭受闪电贷攻击。受影响的策略包括ETH、USDC和USDT。经慢雾安全团队分析,本次攻击手法与yearnfinance的DAI策略池被黑的手法基本一致。具体分析可参考慢雾关于yearnfinace被黑的技术分析。慢雾安全团队提醒,近期对接CurveFinance做相关策略的机池频繁遭受攻击。相关已对接CurveFinance收益聚合器产品应注意排查使用的策略是否存在类似问题,必要时可以联系慢雾安全团队协助处理。[2021/2/9 19:19:41]

通过 Etherscan 查询攻击者的其中一笔交易 0x32c83905db61047834f29385ff8ce8cb6f3d24f97e24e6101d8301619efee96e

可以发现,攻击者两度向 Uniswap 合约转帐 imBTC,金额同样是 0.00823084,然后从 Uniswap 收取了两笔 ETH,看上去似乎是十分正常的两笔交易,实际上却是暗流涌动,另有玄机。为了更好的了解整一笔交易的细节,我们需要通过 bloxy.info 来查看交易的具体细节。

动态 | 慢雾:Electrum“更新钓鱼”盗币攻击补充预警:Electrum 是全球知名的比特币轻钱包,支持多签,历史悠久,具有非常广泛的用户群体,许多用户喜欢用 Electrum 做比特币甚至 USDT(Omni) 的冷钱包或多签钱包。基于这种使用场景,Electrum 在用户电脑上使用频率会比较低。Electrum 当前最新版本是 3.3.8,而已知的 3.3.4 之前的版本都存在“消息缺陷”,这个缺陷允许攻击者通过恶意的 ElectrumX 服务器发送“更新提示”。这个“更新提示”对于用户来说非常具有迷惑性,如果按提示下载所谓的新版本 Electrum,就可能中招。据用户反馈,因为这种攻击,被盗的比特币在四位数以上。本次捕获的盗币攻击不是盗取私钥(一般来说 Electrum 的私钥都是双因素加密存储的),而是在用户发起转账时,替换了转账目标地址。在此我们提醒用户,转账时,需要特别注意目标地址是否被替换,这是近期非常流行的盗币方式。并建议用户使用 Ledger 等硬件钱包,如果搭配 Electrum,虽然私钥不会有什么安全问题,但同样需要警惕目标地址被替换的情况。[2020/1/19]

通过查询交易的细节,我们发现,攻击者首先是通过 ethToTokenSwapInput 函数向 Uniswap 兑换了一些 imBTC,然后再通过 tokenToEthSwapInput 函数开始第一次用 imBTC 换取 ETH,然后 Uniswap 先将 ETH 转给了攻击者,再调用 imBTC 的 transferFrom 函数,由于 imBTC 实现了 ERC777 标准,所以在调用 imBTC 的 trasferFrom 函数的时候, imBTC 会对攻击者的 tokensToSend 函数进行调用。随后,在攻击者的 tokensToSend 函数中,攻击者会进行第二次用 imBTC 换取 ETH,然后流程结束。

声音 | 慢雾:ETDP钱包连续转移近2000 ETH到Bitstamp交易所,项目方疑似跑路:据慢雾科技反(AML)系统监测显示,自北京时间 12 月 16 日凌晨 2 点开始,ETDP 项目方钱包(地址 0xE1d9C35F…19Dc1C3)连续转移近 2000 ETH 到 Bitstamp 交易所,另有 3800 ETH 分散在 3 个新地址中,未发生进一步动作。慢雾安全团队在此提醒交易所、钱包注意加强地址监控,避免相关恶意资金流入平台。[2019/12/16]

从交易细节上看,这里似乎还是没有什么问题,我们继续跟踪 UniSwap 的代码。

上面是代码是 Uniswap 的 ethToTokenSwapInput 函数的代码,根据代码分析, Uniswap 的 ethToTokenSwapInput 函数会调用 ethToTokenInput 函数,然后会先通过 getInputPrice 获取代币能换取的 eth 数量,之后通过 send 函数将 eth 发给用户,最后再通过 transferFrom 把代币转进合约。我们继续跟进 getInputPrice 函数。

通过分析 getInputPrice 函数,我们能知道,ETH 获取量计算的公式为

把该公式放到 ethToTokenInput 函数的上下文中,该公式就变成了

在该公式下,一次正常的 imBTC 兑换 ETH 的过程中,作为分母的 imBTC 储备量在兑换过后应该要上升,对应的 ETH 储备量会变小。

但是回顾攻击者的操作方式,在攻击者第一次发送 imBTC 兑换 ETH 的过程中,Uniswap 会先发送 ETH 给攻击者,这时候 Uniswap 中 ETH 储备量减少,然后 Uniswap 调用 transferFrom 函数,(注意此时还未将攻击者的 imBTC 扣除), 紧接着在 transferFrom 函数中攻击者调用的第二次的 ethToTokenSwapInput 时,通过 getInputPrice 获取兑换的 ETH 数量的公式会变成这样:

注意看,在第二次的兑换计算中,只有 ETH 的储备量变少了,而 imBTC 的储备量并未增加,这导致相比与单独的调用 ethToTokenSwapInput 函数,攻击者可以通过重入的方式,在第二次使用 imBTC 兑换 ETH 的过程中,使计算公式的分子发生了变化,而公式的分母不会发生变化。相比正常的兑换,攻击者通过重入方式进行的第二次兑换会获取微小的利润,导致有利可图。重复这样的过程,就能通过等量的 imBTC 获取更多的 ETH,导致 Uniswap 做事商的损失。

防御方法

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 平台在接入的时候,应需要充分考虑平台本身的业务逻辑与接入代币之间的兼容性,才能避免因兼容性发生不必要的安全问题。而不是简单的将问题归咎于协议和代币提供方。

标签:ETHTOKEKENTOKENXplosive EthereumFundTokenPuppy TokenGlobal AEX Token

SOL热门资讯
区块链:金色观察 | 一文读懂蚂蚁区块链开放联盟链

4月16日,蚂蚁区块链面向中小企业正式推出开放联盟链,首次全面开放蚂蚁区块链的技术和应用能力。这也就意味着,即日起,中小企业开发者可以像搭积木般开发相关区块链应用,并与蚂蚁区块链共建数字经济的未.

1900/1/1 0:00:00
比特币:金色观察 | 大国重器 即将发布的国家区块链平台BSN是什么

最近人们正被央行DC/EP落地测试的消息所震撼。但其实在DC/EP新闻的同一时间,中国还有一项雄心勃勃的区块链项目正准备重装上线.

1900/1/1 0:00:00
STOA:日本STO协会发布新的监管指南

日本证券型通证发行协会(JSTOA)于4月20日宣布,已发布新指南来保护客户的资产和隐私。JSTOA刚刚发布了有关如何区分客户资产和电子记录转让权的自我监管指南.

1900/1/1 0:00:00
ETH:Hubi 交易所重磅上线HTDF 强强联合生态升级

HUBI交易所(www.hubi.com)重磅上线HTDF,公链技术创新代表HTDF Chain社区唯一资产通证HTDF将于2020年4月16日登陆HUBI交易所(www.hubi.com)US.

1900/1/1 0:00:00
BTC:金色百科 | 数字货币与加密货币、虚拟货币的区别

数字货币(Digital currency)数字货币是一种不具备实体形式的,仅以数字形式存在的货币,在英语语境中与电子货币同意,而在中文语境下,一般将电子货币理解为电子化的法定货币.

1900/1/1 0:00:00
BTC:晚间必读5篇 | 买币遇到 钱还能追回吗?

1.决定区块链未来的还是数据需求?区块链技术可以解决一些互联网的遗留问题,但最终决定区块链能不能成为所有互联网企业、互用户使用的技术,核心还在于互联网用户、企业对数据的需求.

1900/1/1 0:00:00