复盘 | UvToken 项目被黑分析

慢雾科技
企业专栏
热度: 4606

慢雾安全团队提醒在使用外部调用合约时应注意被调用合约的地址不能是可控的,最好使用白名单来限制外部调用合约地址以及外部调用目标函数,或者对用户传入参数的合法性进行检查。

By: Flush & Kong

据慢雾区情报,2022 年 10 月 27 号,BNB Chain 项目 UvToken 遭受黑客攻击,黑客通过其矿池合约漏洞获利超 5,000 BNB。慢雾安全团队现简要复盘分析如下:


复盘 | UvToken 项目被黑分析

相关信息

攻击交易

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 代币给到攻击者合约,从这里可以判断合约一定是受到黑客攻击。

复盘 | UvToken 项目被黑分析

在交易细节中我们可以看到一个多亿的 UVT 代币恰好是此矿池 vault 合约中的 UVT 代币总量。在此之前,攻击合约还通过 UvToken 合约对其 staking 逻辑合约 0x5ecf 授权 UVT 代币,并调用 transferFrom 函数将 313 个 UVT 代币转入到 vault 合约中。紧接着,通过调用授权合约的 0xc81daf6e 函数,并在传参时将两个参数构造为攻击者自己创建的攻击合约地址 0x99d4,随即攻击者便收到了大量的 UVT 代币。那为什么只是简单的调用 0xc81daf6e 即可收到大量 UVT 代币呢?

复盘 | UvToken 项目被黑分析

我们通过反编译 0x5ecf 合约跟进查看,0xc81daf6e 函数并未对用户传入的参数的合法性进行检查,且当 msg.sender 与 varg0 一致的情况下也将绕过 owner 检查。可以看到在 632 行调用了用户传入的 varg1 地址的 0x95b81c68 函数,返回值记为 v4,随后在 645 行调用 0x36f277 合约的 0x7e39d2f8 函数并传入用户传入的 varg0,以及从 0x95b81c68 返回的 v4。

复盘 | UvToken 项目被黑分析

继续跟进 0x7e39d2f8 可以看到其对合约中可用 UVT 代币是否足够支付所要提取的 varg1 进行检查后直接将 UVT 代币转移给了用户传入的 varg0 地址。

复盘 | UvToken 项目被黑分析

复盘 | UvToken 项目被黑分析

由此发现,因为 vault 合约只判断了代币的转移金额是否充足,而并未检查用户传入的参数的合法性。所以攻击者只需要在攻击合约中构造 0x95b81c68 函数即可返回可控的提币数额,随后将恶意合约地址作为 0xc81daf6e 函数参数传入即可窃取金库的资金。

复盘 | UvToken 项目被黑分析

那么现在问题来了,被攻击合约并未开源,攻击者是如何知道 0x95b81c68 所对应的具体函数呢?

我们都知道函数签名是对函数名及其参数进行 keccak256 哈希后取前4个字节获得的,因此我们可以直接进行哈希碰撞就可以很容易得到前4个字节相同的函数签名了。我们经过实际测试发现不到三分钟就可以碰撞出 0x95b81c68 函数了。

复盘 | UvToken 项目被黑分析

但哈希碰撞未免效率太低,我们还可以使用更为简单快捷的方式:函数签名替换,即在构造攻击合约时不必考虑函数签名是什么只需要保证函数参数类型一致,随后在合约部署时将字节码中此函数签名替换为我们所需的 0x95b81c68 即可。

至此,我们可以知道 0xc81daf6e 函数并未对用户传入的参数的合法性进行检查,导致攻击者可以传入恶意构造的攻击合约返回所需提取的代币数量即可将 vault 中的 UVT 代币席卷一空。

MistTrack

通过慢雾 MistTrack 对资金进行追踪分析,截止目前黑客已将获利资金共计 5,011 BNB 转移到 Tornado.Cash。此外,攻击的手续费来源同样为 Tornado.Cash。

复盘 | UvToken 项目被黑分析

复盘 | UvToken 项目被黑分析

总结

慢雾安全团队提醒在使用外部调用合约时应注意被调用合约的地址不能是可控的,最好使用白名单来限制外部调用合约地址以及外部调用目标函数,或者对用户传入参数的合法性进行检查。

声明:本文为入驻“火星财经 专栏”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
本内容旨在传递行业动态,不构成投资建议或承诺。