宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > Bitcoin > 正文

慢雾:详解 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 来实现)

慢雾:7月3日至7月7日期间?Web3生态因安全问题损失近1.3亿美元:7月10日消息,慢雾发推称,自7月3日至7月7日,Web3生态因安全问题遭遇攻击损失128,419,000美元,包括Encryption AI、AzukiDao、NFT Trader、MIKE&SID、Bryan Pellegrino、Aptos Foundation、Multichain、CivFund。其中,Multichain被攻击损失1.26亿美元。[2023/7/10 10:12:36]

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

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

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

慢雾:警惕Web3钱包WalletConnect钓鱼风险:金色财经报道,慢雾安全团队发现 Web3 钱包上关于 WalletConnect 使用不当可能存在被钓鱼的安全风险问题。这个问题存在于使用移动端钱包 App 内置的 DApp Browser + WalletConnect 的场景下。

慢雾发现,部分 Web3 钱包在提供 WalletConnect 支持的时候,没有对 WalletConnect 的交易弹窗要在哪个区域弹出进行限制,因此会在钱包的任意界面弹出签名请求。[2023/4/17 14:08:53]

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

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

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

慢雾:Titano Finance被黑因池子被设置成恶意PrizeStrategy合约造成后续利用:据慢雾区情报消息,2月14日,BSC链上的Titano Finance项目遭受攻击,损失约190万美元,最初获利地址为0xad9217e427ed9df8a89e582601a8614fd4f74563,目前被黑资金已被攻击者转移到其他23个钱包。该攻击主要由于owner角色可以任意设置setPrizeStrategy函数,导致了池子被设置成恶意的PrizeStrategy合约造成后续利用。[2022/2/14 9:51:14]

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

细节分析

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

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

动态 | 慢雾:巨鲸被盗2.6亿元资产,或因Blockchain.info安全体系存在缺陷:针对加密巨鲸账户(zhoujianfu)被盗价值2.6亿元的BTC和BCH,慢雾安全团队目前得到的推测如下:该大户私钥自己可以控制,他在Reddit上发了BTC签名,已验证是对的,且猜测是使用了一款很知名的去中心化钱包服务,而且这种去中心化钱包居然还需要SIM卡认证,也就是说有用户系统,可以开启基于SIM卡的短信双因素认证,猜测可能是Blockchain.info,因为它吻合这些特征,且历史上慢雾安全团队就收到几起Blockchain.info用户被盗币的威胁情报,Blockchain.info的安全体系做得并不足够好。目前慢雾正在积极跟进更多细节,包括与该大户直接联系以及尽力提供可能需求的帮助。[2020/2/22]

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

标签:ETHTOKETOKENTOKBAETH币Capdax TokenFOAM TokenIOTF Token

Bitcoin热门资讯
4.29午间行情:多头很强势 上方目标在这

文章系金色财经专栏作者牛七的区块链分析记供稿,发表言论仅代表其个人观点,仅供学习交流!金色盘面不会主动提供任何交易指导,亦不会收取任何费用指导交易,请读者仔细甄别,谨防上当.

1900/1/1 0:00:00
金色前哨丨外媒:央行数字货币DC/EP不会引发通胀

金色财经 区块链4月20日讯  中国人民银行拟发行的央行数字货币DC/EP最近已引起许多人的关注,最近一些相关人士也对“数字人民币”及其运作方式进行了解释.

1900/1/1 0:00:00
金色趋势丨BTC迎来瀑布 后续怎么走?

金色晚报 | 10月18日晚间重要动态一览:12:00-21:00关键词:以太坊桥、天猫、灰度CEO、ProShares、1inch 1. 数据:以太坊桥TVL达到154.3亿美元; 2. 天猫上线元宇宙艺术展.

1900/1/1 0:00:00
金色观察 | 突破9400美元 BTC成2020年表现最好的资产

4月30日14:06,BTC持续上涨,突破9400美元关口,24小时涨幅17.42%。比特币在2020年年内实现了26.33%的上涨,年初至今涨幅已超过黄金.

1900/1/1 0:00:00
视频|区块链服务网络BSN单志广:顶层设计可以用“1基1核6跨7性”来概括

本视频为区块链服务网络BSN发展联盟理事长单志广,在4月25日区块链服务网络BSN商用启动大会上的演讲,大会主办方授权金色财经发布.

1900/1/1 0:00:00
比特币挖矿中心化不再是问题 其他地区将超越中国

在过去的几年中,全世界最大,最活跃的比特币矿工都在中国运营比特币挖矿业务。这也包括比特大陆,神马矿机在内的大型矿机制造商.

1900/1/1 0:00:00