警惕由隐蔽的 Rug Pull 合约存储引起的跑路盘。

警惕 Rug Pull 合约存储引起的跑路盘。

背景

从 DeFi 之夏到现在,在各种漏洞、后门、跑路等手段的洗礼下,我们终于学会了在 DEX 上参与新项目前应该先检查代币合约的权限、代币的持有分布以及合约的代码,以保护自己的资产安全。但是,与此同时,坏人们的作恶手段也变得更加高明和隐蔽。最近,慢雾安全团队收到来自 LianGuaincakeSwap 社区用户的求助。该用户在参与项目时观察到,尽管项目代币没有任何增发记录,但恶意用户仍然通过未记录的大量增发代币的方式,将资金从池子中卷走。慢雾安全团队跟进分析了这一事件,并分享了以下结果。

攻击细节

恶意代币 IEGT 在 BSC 上的部署地址是 0x8D07f605926837Ea0F9E1e24DbA0Fb348cb3E97D。通过观察它的 Holders,我们发现尽管 dead 地址和 LianGuaiir 地址持有大量 IEGT 代币,合约记录的 totalSupply 仍然为 5,000,000。

通过进一步查看这些代币的来源,我们发现它们只有从 0x00002b9b0748d575CB21De3caE868Ed19a7B5B56 转出的记录,没有转入的记录。

我们都知道,EIP20 标准规定了在代币转移时必须实现 Transfer 事件。包括在代币铸造时,从 0x0 地址进行转移也必须进行事件记录。区块浏览器依赖这些标准的事件记录来进行数据统计。因此,当发现区块浏览器中代币总数与实际数量不一致时,说明代币在增发时没有进行事件记录,导致区块浏览器只统计了转账后相关地址的余额变化,而没有任何代币增发记录。基于此,我们可以确定代币合约中必然存在恶意增发的代码。

这个代币合约是开源的,这可能是项目方为了增加项目的可信度。接下来我们对它的源代码进行分析。通常情况下,进行代币增发最简单的方式就是实现一个直接增加指定地址余额的方法。在当前合约中,通过定义一个 _balances 映射来记录用户的代币余额。但是,在检查的过程中,我们没有发现直接增加余额的代码。

既然没有找到直接增加余额的代码,那么项目方是如何进行增发的呢?让我们回顾一下智能合约的基础知识,可以知道用户代币余额的变化本质上是修改了合约在链上存储的数据状态。因此,只需修改特定地址的 _balances 在合约中对应存储的插槽数据,就可以修改它的代币余额。

我们首先简单回顾一下 EVM 中计算合约数据存储位置的基础知识。对于映射类型 _balances 来说,它会根据键值 k 与所占据位置 p 进行 keccak256 后得到偏移量,作为它的存储插槽位置,即 keccak256(k,p)。通过分析 IEGT 合约的数据存储位置,我们发现 _balances 参数所在位置为 slot0,这意味着用户的余额存储位置就是 keccak256(address,0)。

带入恶意地址进行计算,我们可以得到它的余额存储位置为 0x9d1f25384689385576b577f0f3bf1fa04b6829457a3e65965ad8e59bd165a716。然后查找此插槽数据的变化,我们可以发现在合约部署时,它已经被修改成了一个巨大的值。

因此,我们可以确定在 IEGT 合约初始化时,项目方通过内联汇编修改了指定地址的余额,悄悄地增发了大量未被其他用户发现的代币,导致用户在参与项目时被 Rug。

追踪分析

通过 MistTrack 分析,我们发现此次事件的获利地址为 BSC 链上的 0x000000481F40f88742399A627Cbc2Afb6Ec34FeD 和 0x00002b9b0748d575CB21De3caE868Ed19a7B5B56。这两个地址共计获利 114 万 USDT。而获利地址转移 USDT 的手续费来源是从 Binance 交易所提款。

目前资金转移情况如下图所示:

graph LR
A[0x000000481F40f88742399A627Cbc2Afb6Ec34FeD] --> B(0x00002b9b0748d575CB21De3caE868Ed19a7B5B56)
C(0x00002b9b0748d575CB21De3caE868Ed19a7B5B56) --> D((其他地址))

此外,恶意合约创建者的手续费地址 0xb795ad917DAF9A1c98eE18E03E81FBBfb6D54355 同样存在大量痕迹。

graph LR
A[0xb795ad917DAF9A1c98eE18E03E81FBBfb6D54355] --> B(其他地址)

总结

在这起事件中,项目方开源了合约代码以增加用户的信任度,并通过未格式化的代码降低了代码的可读性。他们使用内联汇编编写了直接修改用户余额存储插槽数据的代码,从而提高了代码分析的门槛。这些手段使得作恶痕迹变得难以发现,最终导致整个池子被清空。可以发现,在用户安全意识不断提高的情况下,作恶者的手段也变得更加隐蔽和高明。根据 SlowMist Hacked 统计,截至目前,由于 Rug Pull 导致的损失金额接近 5 亿美元。因此,在参与新项目时,用户应重点分析合约中是否存在可疑的代码,尽量不参与合约未开源且未经过审计的项目。MistTrack 团队也将持续跟进并监控此事件。

参考链接: – [1] https://bscscan.com/address/0x8d07f605926837ea0f9e1e24dba0fb348cb3e97d – [2] https://eips.ethereum.org/EIPS/eip-20 – [3] https://misttrack.io/ – [4] https://hacked.slowmist.io/