By: Flush & Kong
据慢雾区情报,2022 年 10 月 27 号,BNB Chain 项目 UvToken 遭受黑客攻击,黑客通过其矿池合约漏洞获利超 5,000 BNB。慢雾安全团队现简要复盘分析如下:
相关信息
攻击交易
0x54121ed538f27ffee2dbb232f9d9be33e39fdaf34adf993e5e019c00f6afd499
攻击者合约地址
0x99d4311f0d613c4d0cd0011709fbd7ec1bf87be9
攻击者 EOA 地址
0xF3E3ae9A40ac4Ae7B17B3465F15ecF228eF4F760
被攻击合约
vault 合约:0x36F277165C8b1b80cC3418719BADB1864e2687bc
staking 逻辑合约:0x5ecfda78754ec616ed03241b4ae64a54d6705a1a
攻击核心点
UvToken 的 vault 合约用于取款的有关函数未严格判断用户输入的合法性,导致攻击者可以传入恶意合约地址来利用恶意合约返回取款数量的代币掏空池子相关资金。
攻击细节分析
首先,攻击者用 0.5 个 BNB 在 PancakeSwap 上按照 WBNB -> BUSD -> UVT 的兑换路径兑换了 313 个 UVT 代币,并将其转入到 UvTokenWallet Eco Staking 合约后此矿池的 vault 合约就转出了 100,449,018 个 UVT 代币给到攻击者合约,从这里可以判断合约一定是受到黑客攻击。
在交易细节中我们可以看到一个多亿的 UVT 代币恰好是此矿池 vault 合约中的 UVT 代币总量。在此之前,攻击合约还通过 UvToken 合约对其 staking 逻辑合约 0x5ecf 授权 UVT 代币,并调用 transferFrom 函数将 313 个 UVT 代币转入到 vault 合约中。紧接着,通过调用授权合约的 0xc81daf6e 函数,并在传参时将两个参数构造为攻击者自己创建的攻击合约地址 0x99d4,随即攻击者便收到了大量的 UVT 代币。那为什么只是简单的调用 0xc81daf6e 即可收到大量 UVT 代币呢?
我们通过反编译 0x5ecf 合约跟进查看,0xc81daf6e 函数并未对用户传入的参数的合法性进行检查,且当 msg.sender 与 varg0 一致的情况下也将绕过 owner 检查。可以看到在 632 行调用了用户传入的 varg1 地址的 0x95b81c68 函数,返回值记为 v4,随后在 645 行调用 0x36f277 合约的 0x7e39d2f8 函数并传入用户传入的 varg0,以及从 0x95b81c68 返回的 v4。
继续跟进 0x7e39d2f8 可以看到其对合约中可用 UVT 代币是否足够支付所要提取的 varg1 进行检查后直接将 UVT 代币转移给了用户传入的 varg0 地址。
由此发现,因为 vault 合约只判断了代币的转移金额是否充足,而并未检查用户传入的参数的合法性。所以攻击者只需要在攻击合约中构造 0x95b81c68 函数即可返回可控的提币数额,随后将恶意合约地址作为 0xc81daf6e 函数参数传入即可窃取金库的资金。
那么现在问题来了,被攻击合约并未开源,攻击者是如何知道 0x95b81c68 所对应的具体函数呢?
我们都知道函数签名是对函数名及其参数进行 keccak256 哈希后取前4个字节获得的,因此我们可以直接进行哈希碰撞就可以很容易得到前4个字节相同的函数签名了。我们经过实际测试发现不到三分钟就可以碰撞出 0x95b81c68 函数了。
但哈希碰撞未免效率太低,我们还可以使用更为简单快捷的方式:函数签名替换,即在构造攻击合约时不必考虑函数签名是什么只需要保证函数参数类型一致,随后在合约部署时将字节码中此函数签名替换为我们所需的 0x95b81c68 即可。
至此,我们可以知道 0xc81daf6e 函数并未对用户传入的参数的合法性进行检查,导致攻击者可以传入恶意构造的攻击合约返回所需提取的代币数量即可将 vault 中的 UVT 代币席卷一空。
MistTrack
通过慢雾 MistTrack 对资金进行追踪分析,截止目前黑客已将获利资金共计 5,011 BNB 转移到 Tornado.Cash。此外,攻击的手续费来源同样为 Tornado.Cash。
总结
慢雾安全团队提醒在使用外部调用合约时应注意被调用合约的地址不能是可控的,最好使用白名单来限制外部调用合约地址以及外部调用目标函数,或者对用户传入参数的合法性进行检查。
往期回顾
慢雾导航
慢雾科技官网
https://www.slowmist.com/
慢雾区官网
https://slowmist.io/
慢雾 GitHub
https://github.com/slowmist
Telegram
https://t.me/slowmistteam
https://twitter.com/@slowmist_team
Medium
https://medium.com/@slowmist
知识星球
https://t.zsxq.com/Q3zNvvF
原文始发于微信公众号(慢雾科技):复盘 | UvToken 项目被黑分析