编者按:本文来自慢雾科技,Odaily星球日报授权转载。
据慢雾区情报,以太坊DeFi平台Lendf.Me遭受重入漏洞攻击。慢雾安全团队在收到情报后随即对此次攻击事件展开分析,并快速定位了问题所在。据慢雾科技反(AML)系统初步统计分析,Lendf.Me被攻击累计的损失约24,696,616美元,具体盗取的币种及数额为:WETH:55159.02134,WBTC:9.01152,CHAI:77930.93433,HBTC:320.27714,HUSD:432162.90569,BUSD:480787.88767,PAX:587014.60367,TUSD:459794.38763,USDC:698916.40348,USDT:7180525.08156,USDx:510868.16067,imBTC:291.3471之后攻击者不断通过1inch.exchange、ParaSwap、Tokenlon等DEX平台将盗取的币兑换成ETH及其他代币。以下是详细分析过程:
慢雾:Apple Store恶意钓鱼程序可模仿正常应用程序,盗取账号密码以绕过2FA:7月25日消息,慢雾首席信息安全官23pds发推提醒用户注意Apple ID出现的最新攻击案例,其中Apple Store出现恶意钓鱼程序,通过模仿正常应用程序盗取用户账号和密码,然后攻击者把自己的号码加入双重认证的信任号码,控制账号权限,用来绕过苹果的2FA。“加密货币用户务必注意,因为目前有不少用户、钱包的备份方案是iCloud备份,一旦被攻击,可能造成资产损失”。[2023/7/25 15:56:56]
攻击细节
本次对Lendf.Me实施攻击的攻击者地址为0xa9bf70a420d364e923c74448d9d817d3f2a77822,攻击者通过部署合约0x538359785a8d5ab1a741a0ba94f26a800759d91d对Lendf.Me进行攻击。通过在Etherscan上查看攻击者的其中一笔交易:https://etherscan.io/tx/0xae7d664bdfcc54220df4f18d339005c6faf6e62c9ca79c56387bc0389274363b
慢雾:Gate官方Twitter账户被盗用,谨慎互动:10月22日消息,安全团队慢雾发文称:加密平台Gate官方Twitter账户被盗用,谨慎互动。半小时前,攻击者利用该账户发文,诱导用户进入虚假网站连接钱包。此外,慢雾科技创始人余弦在社交媒体上发文表示:注意下,Gate官方推特应该是被黑了,发送了钓鱼信息,这个网址 g?te[.]com 是假的(之前谈过的 Punycode 字符有关的钓鱼域名),如果你去Claim会出现eth_sign这种签名钓鱼,可能导致ETH等相关资产被盗。[2022/10/22 16:35:14]
我们发现,攻击者首先是存入了0.00021593枚imBTC,但是却从Lendf.Me中成功提现了0.00043188枚imBTC,提现的数量几乎是存入数量的翻倍。那么攻击者是如何从短短的一笔交易中拿到翻倍的余额的呢?这需要我们深入分析交易中的每一个动作,看看究竟发生了什么。通过把该笔交易放到bloxy.info上查看,我们能知道完整的交易流程
慢雾:疑似Gemini相关地址在过去5小时内共转出逾20万枚ETH:金色财经消息,慢雾监测显示,疑似加密交易所Gemini相关地址(0xea3ec2a08fee18ff4798c2d4725ded433d94151d)已在过去5小时内归集并转出逾20万枚ETH(超3亿美元)。[2022/7/19 2:22:08]
通过分析交易流程,我们不难发现攻击者对Lendf.Me进行了两次supply()函数的调用,但是这两次调用都是独立的,并不是在前一笔supply()函数中再次调用supply()函数。紧接着,在第二次supply()函数的调用过程中,攻击者在他自己的合约中对Lendf.Me的withdraw()函数发起调用,最终提现。
慢雾:有用户遭钓鱼攻击,在OpenSea上架的NFT以极低匹配价格售出:据慢雾消息,有用户在 OpenSea 挂单售卖的 NFT 被恶意的以远低于挂单价匹配买。经慢雾安全团队分析,此是由于该受害用户遭受钓鱼攻击,错误的对攻击者精心构造的恶意订单进行签名,恶意订单中指定了极低的出售价格、买方地址为攻击者以及出售 NFT 为受害用户在 OpenSea 上架的待出售 NFT。攻击者使用受害用户已签名的出售订单以及攻击者自己的购买订单在 OpenSea 中进行匹配,并以攻击者指定的极低价格成交,导致受害用户的 NFT 以非预期的价格售出。[2021/12/11 7:31:47]
在这里,我们不难分析出,攻击者的withdraw()调用是发生在transferFrom函数中,也就是在Lendf.Me通过transferFrom调用用户的tokensToSend()钩子函数的时候调用的。很明显,攻击者通过supply()函数重入了Lendf.Me合约,造成了重入攻击,那么具体的攻击细节是怎样的呢?我们接下来跟进Lendf.Me的合约代码。代码分析
慢雾:BSC链上项目BXH遭受攻击分析:10月30日消息,据慢雾区情报,2021年10月30日,币安智能链上(BSC)去中心化交易协议BXH项目遭受攻击,被盗约1.3亿美金。经慢雾安全团队分析,黑客于27日13时(UTC)部署了攻击合约0x8877,接着在29日08时(UTC)BXH项目管理钱包地址0x5614通过grantRole赋予攻击合约0x8877管理权限。30日03时(UTC)攻击者通过攻击合约0x8877的权限从BXH策略池资金库中将其管理的资产转出。30日04时(UTC)0x5614暂停了资金库。因此BXH本次被盗是由于其管理权限被恶意的修改,导致攻击者利用此权限转移了项目资产。[2021/10/30 6:22:02]
Lendf.Me的supply()函数在进行了一系列的处理后,会调用一个doTransferIn函数,用于把用户提供的币存进合约,然后接下来会对market变量的一些信息进行赋值。回顾刚才说的攻击流程,攻击者是在第二次supply()函数中通过重入的方式调用了withdraw()函数提现,也就是说在第二次的supply()函数中,1590行后的操作在withdraw()之前并不会执行,在withdraw()执行完之后,1590行后的代码才会继续执行。这里的操作导致了攻击者可提现余额变多。我们深入分析下supply()函数:
根据上图,可以看到,在supply()函数的末尾,会对market和用户的余额进行更新,在这之前,用户的余额会在函数的开头预先获取好并保存在localResults.userSupplyCurrent,如下:
通过赋值给localResults变量的方式,用户的转入信息会先暂时保存在这个变量内,然后此时攻击者执行withdraw()函数,我们看下withdraw()函数的代码:
这里有两个关键的地方:1、在函数的开头,合约首先获取了storage的market及supplyBalance变量。2、在withdraw()函数的末尾,存在同样的逻辑对market用户的余额信息(supplyBalance)进行了更新,更新值为扣除用户的提现金额后的余额。按正常的提现逻辑而言,在withdraw()单独执行的时候,用户的余额会被扣除并正常更新,但是由于攻击者将withdraw()嵌入在supply()中,在withdraw()函数更新了用户余额(supplyBalance)后,接下来在supply()函数要执行的代码,也就是1590行之后,用户的余额会再被更新一次,而用于更新的值会是先前supply()函数开头的保存在localResults中的用户原先的存款加上攻击者第一次调用supply()函数存款的值。在这样的操作下,用户的余额虽然在提现后虽然已经扣除了,但是接下来的supply()函数的逻辑会再次将用户未扣除提现金额时的值覆盖回去,导致攻击者虽然执行了提现操作,但是余额不但没有扣除,反而导致余额增加了。通过这样的方式,攻击者能以指数级别的数量提现,直至把Lendf.Me提空。防御建议
针对本次攻击事件慢雾安全团队建议:在关键的业务操作方法中加入锁机制,如:OpenZeppelin的ReentrancyGuard开发合约的时候采用先更改本合约的变量,再进行外部调用的编写风格项目上线前请优秀的第三方安全团队进行全面的安全审计,尽可能的发现潜在的安全问题多个合约进行对接的时候也需要对多方合约进行代码安全和业务安全的把关,全面考虑各种业务场景相结合下的安全问题合约尽可能的设置暂停开关,在出现“黑天鹅”事件的时候能够及时发现并止损安全是动态的,各个项目方也需要及时捕获可能与自身项目相关的威胁情报,及时排查潜在的安全风险附:OpenZeppelinReentrancyGuard
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。