Poolz 因算数溢出问题遭受攻击,损失约 665K 美元!

Numen Cyber Labs2023-03-15 14:34

背景 

根据 Numen 链上监控显示,Mar-15-2023 03:16:02 AM +UTC,Ethereum、Binance、Polygon 链上 Poolz 遭到攻击,共损失 2,805,805 枚 MEE,525,134 枚 ESNC,774,997 枚 DON,2,007,504,238 枚 ASW,6,510,689 枚 KMON,2,521,065 枚 POOLZ,35,976,107 枚 DCD,760,845 枚 PORTX,252,153,413 枚 ECIO,35,975,489 枚 WOD,29,032,394 枚 SIP,61,856,885 枚 MNZ,465,116 枚 EBA,157,696 枚 GEMG,202,442 枚 WANA,223,500 枚 KXA,82,067 枚 MSTR,1,717,102 枚 CHRP,822,631 枚 CVZ,37,053 枚 CHIM,8,577,867 枚 QZA,总价值约 665000 美元。攻击者已将部分 Token 兑换为 BNB,目前资金暂未转出。

攻击者地址:0x190Cd736F5825ff0Ae0141B5C9cb7Fcd042cef2a

攻击者合约:0x058bae36467a9fc5e1045dbdffc2fd65b91c2203

其中一笔攻击交易:

0x39718b03ae346dfe0210b1057cf9f0c378d9ab943512264f06249ae14030c5d5

攻击流程
1. 攻击者先通过 pancakeswap 兑换了一下 mnz 代币。
2. 攻击者调用 CreateMassPools,主要问题就存在于这个函数。
正常功能是用户可以批量创建池子,然后提供初始流动性。再通过 CreatePool 把池子创建出来,并用一个 mapping 记录池子属性,如下图所示。

问题出在 getArraySum 函数。TransferInToken 给池子建立流动性,amount 通过 getArraySum 控制。

通过传入的_StartAmount 数组遍历,然后进行累加。然后通过调用栈看到[115792089237316195423570985008687907853269984665640502182660492372007802789937,61856797091635905326850000]。数组累加超过 uint256,即返回 1。但是 CreatePool 中做的记录是通过_StartAmount 来实现的。所以攻击者转入了 1 个 token,但_StartAmount 是个大数。

3.黑客调用 withdraw 提币,完成攻击。

总结

此次事件,攻击者获利的根本原因是算数溢出。为了防止此类问题,Numen 建议使用 Solidity 的高版本进行编译,以便在编译过程中自动添加溢出检查。另外,您也可以在低版本 Solidity 中使用 OpenZeppelin 的 SafeMath 库来解决整数溢出问题。

Numen 官网
https://numencyber.com/ 
GitHub
https://github.com/NumenCyber
Twitter
https://twitter.com/@numencyber
Medium
https://medium.com/@numencyberlabs
LinkedIn
https://www.linkedin.com/company/numencyber/

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

来源链接

相关Wiki

相关标签