区块链安全

Titano Rugpull 分析

根据 PeckShield 的推文,titano.finance 经历了 rugpull,然后耗尽了了大约 4,828 BNB(约 190 万美元)。资金最初存放在这个钱包 0xad9217e427ed9df8a89e582601a8614fd4f74563 中,然后分成 24 个地址。

在我看来,我确认这不是一个黑客,而是一个 rugpull。从黑客地址开始:0xad9217e427ed9df8a89e582601a8614fd4f74563

快速浏览一下它总共 48 笔交易,我注意到了这笔交易:

https://bscscan.com/tx/0x848280d0e054b0f1a04356bdf29cff390d9a982a6f709ae5df45a6f32f5bce6c

这是铸造代币的典型动作。所以这就是攻击发生的地方。

现在进入合约 https://bscscan.com/address/0x49d078d25b08f2731cbf5af8e8cdf1ea3e0a2046 看看 _awardTickets 方法是如何工作的:

由于该合约是由合约https://bscscan.com/address/0x940151f5bbbcda5b1b482592d816e96f80d6073a#code 创建的,而合约https://bscscan.com/address/0x940151f5bbbcda5b1b482592d816e96f80d6073a#code 是由 Titano PLAY Exploiter 创建的,Titano PLAY Exploiter 创建的攻击合约。

现在我们可以从交易中获取 PrizePool 合约的地址,它是https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442

现在进入合约 https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442 看看 award 方法是如何工作的:

从第 411 行的第 2 点,我们可以看到资金是如何到达地址 0xAd9217e427ed9df8A89E582601a8614FD4F74563(Titano PLAY Exploiter)的。

至于第 1 点,我们可以看到修饰符 onlyPrizeStrategy:

它要求合约0x49d078d25b08f2731cbf5af8e8cdf1ea3e0a2046是 PrizeStrategy 地址?

但正如我所提到的,合约0x49d078d25b08f2731cbf5af8e8cdf1ea3e0a204是 Titano PLAY Exploiter 创建的攻击合约之一。所以它是 prizeStrategy 地址吗?

从 prizepool 奖池合同 https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442,我们可以看到它的创造者EOA地址 0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8,我们可以看到地址0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8 作为 dev 地址或 titano.finance 项目地址。所以我只是检查了它的历史记录:

https://bscscan.com/address/0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8

有两个 setPrizeStrategy 方法调用:

从之前的https://bscscan.com/tx/0x2b9bf401963ef9c5f7011cdbdc097e48ee114f31882369027c4e19f98f54ef87开发团队将prizeStrategy更改为 0x49D078d25b08f2731cBf5AF8e8CDF1eA3E0a2046 。正是攻击合约地址。

但很快它通过交易 https://bscscan.com/tx/0x93560d63b66f4769c355c2af44beb2a9f863c35b488f51f15ecd89c54f1cb37将 PrizeStrategy 更改为0x5739f9F8C9Fc9854a5B6f3667a6fB14144DC40A7

我们在 prizePool 合约 https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442 中找到 setPrizeStrategy 方法:

我们可以注意到这个方法要求满足 onlyStrategy 修饰符:

此修饰符需要 msg.sender 即https://bscscan.com/tx/0x2b9bf401963ef9c5f7011cdbdc097e48ee114f31882369027c4e19f98f54ef87在这种情况下等于 PrizeStrategyListener 地址。

PrizeStrategyListener 地址是一个 private 变量,被初始化为 tx.origin 也就是是 dev 地址。

通过这个合约的创建交易 https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442 我们可以看到 initialize 函数被调用: https ://versatile.blocksecteam.com/tx/bsc/0xeb9f724dc1cc444ec7d164dd1d0c08c40aed375e7978c7d36eed375e7978

除此之外,在合约https://bscscan.com/address/0x4d7f0a96967dce1e36dd2fbb131625bbd9106442中,没有更多函数可以改变 prizeStrategyListener 的值。

所以 dev 地址 0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8 可以调用 setPrizeStrategy 方法赋予攻击合约 prizeStrategy 角色。然后攻击合约可以调用 prizepool 奖池合约 的 award 方法来铸造代币。

为什么我认为这个项目是一个 rugpull?

让我们看看开发团队地址的更多交易:

https://bscscan.com/address/0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8

看来开发地址已经转移了所有权并设置了 token listener,这让用户认为这个项目远离了 rugpull。但实际上开发地址保留了 PrizeStrategyListener 角色。开发团队将 prizeStrategyListener 变量设置为 private,并给出了一个让人「顾名思义」的伪造的方法来改变它,这很耐人寻味。

总结:

本项目通过多家审计公司的审计,但仍发生了 rugpull。所以启发我们的是我们应该更多地关注与权限或角色相关的 private 变量。

相关地址:

0xAd9217e427ed9df8A89E582601a8614FD4F74563Titano PLAY Exploiter
0x940151F5BbbCDA5B1b482592D816e96f80d6073a攻击合约1
0x1866207c355d4c6e0B03B4dC0Bf9c658f4D13F8a攻击合约2
0x4d7F0A96967dcE1E36Dd2fBb131625BbD9106442受害池/易受攻击的合约
0xC8ABdb16Fd6040c76Dfd9b5186aBfdc3b96df4B8开发团队地址

致谢:

感谢 @Rivaill 和 @r4v3n 大佬指点讨论~~