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

编者按:本文来自慢雾科技,Odaily星球日报授权转载。

前言

据链闻消息,4月18日,Tokenlon宣布暂停imBTC转账,因其发现有攻击者通过ERC777在Uniswap流动性合约中的重入漏洞,对ETH-imBTC池循环套利。此次的攻击手法是一个存在于Uniswapv1上的已知漏洞,该漏洞最早由Consensys于2019年4月发现,当时Consensys只是发现了该风险,还没有发现可以利用这种手法进行攻击的token。随后,在imBTC上线Uniswap后,由于imBTC是基于ERC777实现的,通过组合ERC777的特性及Uniswap代码上的问题,使攻击者可以通过重入漏洞实现套利。下面,我们将来分析此次套利中的攻击手法和具体的细节。知识准备

ERC777协议是以太坊上的代币标准协议,该协议是以太坊上ERC20协议的改进版,主要的改进点如下:1、使用和发送以太相同的理念发送token,方法为:send(dest,value,data)2、合约和普通地址都可以通过注册tokensToSendhook函数来控制和拒绝发送哪些token3、合约和普通地址都可以通过注册tokensReceivedhook函数来控制和拒绝接受哪些token4、tokensReceived可以通过hook函数可以做到在一个交易里完成发送代币和通知合约接受代币,而不像ERC20必须通过两次调用来完成5、持有者可以"授权"和"撤销"操作员这些操作员通常是交易所、支票处理机或自动支付系统6、每个代币交易都包含data和operatorData字段,可以分别传递来自持有者和操作员的数据7、可以通过部署实现tokensReceived的代理合约来兼容没有实现tokensReceived函数的地址在这里,我们需要特别关注的点是第二点,即ERC777标准中的tokenToSend函数,根据ERC777协议的定义,遵循该标准的token代币在每一次发生代币转账的时候都会去尝试调用代币发送者tokensToSend函数,而代币持有者可以通过在ERC1820注册合约注册自己的合约并通过在这个hook函数中定义一些操作来处理代币转账的过程中的某些流程,如拒绝代币发送或其他操作。了解这些关键点,有助于我们理解这次攻击的具体攻击手法。现在开始,我们可以稍微加速,看看对于Uniswap而言,这次到底发生了什么?细节分析

慢雾:Grafana存在账户被接管和认证绕过漏洞:金色财经报道,据慢雾消息,Grafana发布严重安全提醒,其存在账户被接管和认证绕过漏洞(CVE-2023-3128),目前PoC在互联网上公开,已出现攻击案例。Grafana是一个跨平台、开源的数据可视化网络应用程序平台,用户配置连接的数据源之后,Grafana可以在网络浏览器里显示数据图表和警告。Grafana根据电子邮件的要求来验证Azure Active Directory账户。在Azure AD上,配置文件的电子邮件字段在Azure AD租户之间是不唯一的。当Azure AD OAuth与多租户Azure AD OAuth应用配置在一起时,这可能会使Grafana账户被接管和认证绕过。其中,Grafana>=6.7.0受到影响。加密货币行业有大量平台采用此方案用来监控服务器性能情况,请注意风险,并将Grafana升级到最新版本。[2023/6/25 21:58:31]

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

慢雾:BXH 第一次被盗资金再次转移,BTC 网络余额超 2700 BTC:金色财经报道,10月8日凌晨(UTC+8),慢雾监控到 BXH 第一次被盗资金再次出现异动,经慢雾 MistTrack 分析,异动详情如下:

黑客地址 0x48c9...7d79 将部分资金(213.77 BTCB,5 BNB 和 1 ETH)转移至新地址 0xc01f...2aef,接着将资金兑换为 renBTC 跨链到 BTC 网络,跨链后地址为 1JwQ...u9oU。1JwQ...u9oU 在此次转移中接收到的总资金为 204.12 BTC。截止目前,BXH 第一次被盗事件在 BTC 网络共有 4 个黑客地址,总计余额为 2701.3 BTC,暂未进一步转移。慢雾 MistTrack 将持续监控被盗资金的转移。[2022/10/8 12:49:28]

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

慢雾:Moonbirds的Nesting Contract相关漏洞在特定场景下才能产生危害:据慢雾区情报反馈,Moonbirds 发布安全公告,Nesting Contract 存在安全问题。当用户在 OpenSea 或者 LooksRare等NFT交易市场进行挂单售卖时。卖家不能仅通过执行 nesting(筑巢) 来禁止NFT售卖,而是要在交易市场中下架相关的 NFT 售卖订单。否则在某个特定场景下买家将会绕过 Moonbirds 在nesting(筑巢)时不能交易的限制。慢雾安全团队经过研究发现该漏洞需要在特定场景才能产生危害属于低风险。建议 Moonbirds 用户自行排查已 nesting(筑巢)的 NFT 是否还在 NTF 市场中上架,如果已上架要及时进行下架。更多的漏洞细节请等待 Moonbirds 官方的披露。[2022/5/30 3:50:23]

通过查询交易的细节,我们发现,攻击者首先是通过ethToTokenSwapInput函数向Uniswap兑换了一些imBTC,然后再通过tokenToEthSwapInput函数开始第一次用imBTC换取ETH,然后Uniswap先将ETH转给了攻击者,再调用imBTC的transferFrom函数,由于imBTC实现了ERC777标准,所以在调用imBTC的trasferFrom函数的时候,imBTC会对攻击者的tokensToSend函数进行调用。随后,在攻击者的tokensToSend函数中,攻击者会进行第二次用imBTC换取ETH,然后流程结束。从交易细节上看,这里似乎还是没有什么问题,我们继续跟踪UniSwap的代码。

慢雾:跨链互操作协议Poly Network遭受攻击并非由于网传的keeper私钥泄漏:对于跨链互操作协议Poly Network遭受攻击事件,慢雾安全团队分析指出:本次攻击主要在于EthCrossChainData合约的keeper可由EthCrossChainManager合约进行修改,而EthCrossChainManager合约的verifyHeaderAndExecuteTx函数又可以通过_executeCrossChainTx函数执行用户传入的数据。因此攻击者通过此函数传入精心构造的数据修改了EthCrossChainData合约的keeper为攻击者指定的地址,并非网传的是由于keeper私钥泄漏导致这一事件的发生。[2021/8/11 1:47:48]

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

慢雾:攻击者系通过“supply()”函数重入Lendf.Me合约 实现重入攻击:慢雾安全团队发文跟进“DeFi平台Lendf.Me被黑”一事的具体原因及防御建议。文章分析称,通过将交易放在bloxy.info上查看完整交易流程,可发现攻击者对Lendf.Me进行了两次“supply()”函数的调用,但是这两次调用都是独立的,并不是在前一笔“supply()”函数中再次调用“supply()”函数。紧接着,在第二次“supply()”函数的调用过程中,攻击者在他自己的合约中对Lendf.Me的“withdraw()”函数发起调用,最终提现。慢雾安全团队表示,不难分析出,攻击者的“withdraw()”调用是发生在transferFrom函数中,也就是在Lendf.Me通过transferFrom调用用户的“tokensToSend()”钩子函数的时候调用的。很明显,攻击者通过“supply()”函数重入了Lendf.Me合约,造成了重入攻击。[2020/4/19]

通过分析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做事商的损失。防御方法

在Uniswap的tokenToEthSwapInput函数中加入OpenZeppelin的ReentrancyGuard函数,防止重入问题。在进行代币交换的时候,先扣除用户的代币,再将ETH发送给用户。同时,针对本次攻击事件慢雾安全团队建议:在关键的业务操作方法中加入锁机制,如:OpenZeppelin的ReentrancyGuard开发合约的时候采用先更改本合约的变量,再进行外部调用的编写风格项目上线前请优秀的第三方安全团队进行全面的安全审计,尽可能的发现潜在的安全问题多个合约进行对接的时候也需要对多方合约进行代码安全和业务安全的把关,全面考虑各种业务场景相结合下的安全问题合约尽可能的设置暂停开关,在出现“黑天鹅”事件的时候能够及时发现并止损安全是动态的,各个项目方也需要及时捕获可能与自身项目相关的威胁情报,及时排查潜在的安全风险最后的思考

这两天的DeFi世界被闹得沸沸扬扬,imBTC作为ERC777代币首当其冲,ERC777协议也饱受诟病,但是看完分析,造成此次的攻击事件原因,真的是imBTC或者是ERC777协议的问题吗?如果Uniswap做好了ERC777的兼容,使用ReentrancyGuard,并在代币交换的时候先扣除用户的代币,再将ETH发送给用户,这样的问题是不是就不会发生?imBTC作为以太坊上token化的比特币代币协议,其安全性在自身单独运行的时候并不存在问题,第三方DeFi平台在接入的时候,应需要充分考虑平台本身的业务逻辑与接入代币之间的兼容性,才能避免因兼容性发生不必要的安全问题。而不是简单的将问题归咎于协议和代币提供方。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

ETHLEND:从Lendf.Me黑客事件我们看到了什么?

编者按:本文来自链闻ChainNews,撰文:LeftOfCenter,星球日报经授权发布。作者特别感谢慢雾科技创始人余弦对本文的帮助。对于DeFi投资者来说,这是一个不平静的周末.

[0:15ms0-1:599ms