{"content":{"title":"SharkTeam：Midas Capital攻击事件原理分析","body":"![WechatIMG96.jpeg](https://img.learnblockchain.cn/attachments/2023/06/EMGaRLdz6490001e08713.jpeg)\r\n\r\n北京时间2023年6月18日，Midas Capital遭受攻击，攻击者已获利约60万美元。\r\n\r\n![](file:////private/var/folders/c7/\\_t3zkb892w9cmvvfp1br06780000gn/T/com.kingsoft.wpsoffice.mac/wps-mac/ksohtml//wps1.png) \r\n\r\nSharkTeam对此事件第一时间进行了技术分析，并总结了安全防范手段，希望后续项目可以引以为戒，共筑区块链行业的安全防线。\r\n\r\n##  **一、事件分析**\r\n\r\n攻击者地址：\r\n\r\n0x4b92cc3452ef1e37528470495b86d3f976470734\r\n\r\n攻击合约：\r\n\r\n0xc40119c7269a5fa813d878bf83d14e3462fc8fde\r\n\r\n被攻击合约：\r\n\r\n0xF8527Dc5611B589CbB365aCACaac0d1DC70b25cB\r\n\r\n攻击交易：\r\n\r\n0x1ebc03f0f2257c275f4990b4130e6c3e451125aa98ee8bbde8aba5dc0320c659\r\n\r\n攻击流程：\r\n\r\n（1）攻击者（0x4b92cc34）调用攻击合约（0xc40119c7）的0x117741f7函数，然后首先调用被攻击合约（0xF8527Dc5）的mint函数将518614966827953435094个sAMM-HAY/BUSD代币转换为2个fsAMM-HAY-BUSD代币，也就是质押币。\r\n\r\n\r\n![WechatIMG97.jpeg](https://img.learnblockchain.cn/attachments/2023/06/XOC0cRsh649000ba5bc46.jpeg)\r\n\r\n\r\n（2）随后调用被攻击合约（0xF8527Dc5）的redeemUnderlying函数提取518614966827953435091个sAMM代币。并未选择全部提取，而是剩了3个。但注意此时只从攻击合约转移走了1个fsAMM代币。\r\n\r\n\r\n\r\n![WechatIMG98.jpeg](https://img.learnblockchain.cn/attachments/2023/06/RW1fVdDt649000d44e07a.jpeg)\r\n（3）然后又调用了被攻击合约（0xF8527Dc5）的redeemUnderlying函数，又提取518096869957995439653个sAMM代币，由于攻击合约（0xc40119c7）账户中还存有1个fsAMM代币，所以能够成功提取。\r\n\r\n\r\n![WechatIMG99.png](https://img.learnblockchain.cn/attachments/2023/06/mqyw4Edk649000f253027.png)\r\n\r\n（4）循环上面的操作，并且随着套利的过程，mint的数量翻倍，调用redeemUnderlying函数的次数也随之翻倍。\r\n\r\n\r\n![WechatIMG100.jpeg](https://img.learnblockchain.cn/attachments/2023/06/ZmOawzDE64900116e145e.jpeg)\r\n\r\n![WechatIMG101.jpeg](https://img.learnblockchain.cn/attachments/2023/06/Ie2kOLQ664900119180fe.jpeg)\r\n（5）在多次攻击交易后，最后将获得的sAMM代币换成BUSD,HAY,ANKR,WBNB,ankrBNB等获利离场。\r\n\r\n\r\n![WechatIMG102.png](https://img.learnblockchain.cn/attachments/2023/06/KOPxfypZ64900130aa157.png)\r\n\r\n## **二、漏洞分析**\r\n\r\n由于被攻击合约（0xF8527Dc5）目前的逻辑合约并不开源，我们只能从trace和之前的逻辑合约中找线索。我们发现代码中fork了compound的代码，并与hundred Finance相同，引入了第三方运算库。\r\n\r\n\r\n![WechatIMG103.jpeg](https://img.learnblockchain.cn/attachments/2023/06/Cq7GXRbA64900190ad7c1.jpeg)\r\n\r\n![WechatIMG104.jpeg](https://img.learnblockchain.cn/attachments/2023/06/5v3Kx8jE6490019830f8e.jpeg)\r\n\r\n![WechatIMG105.jpeg](https://img.learnblockchain.cn/attachments/2023/06/JUhhMFDL6490019bf4186.jpeg)\r\n\r\n而在divUInt函数中，使用了a/b，计算上没有问题，但由于solidity不支持浮点数的运算，所以会向下取整。而攻击者（0x4b92cc34）每次调用redeemUnderlying函数都对输入的数量都进行严格控制，就会导致计算结果出现1.99999999999...这种情况，但默认向下取整，所以计算结果是1。\r\n\r\n在第三步中，攻击合约（0xc40119c7）少取了一点sAMM代币，那么计算出的结果就变成了1。所以攻击者（0x4b92cc34）每次质押后提取到的本金都会翻倍。\r\n\r\n## **三、安全建议**\r\n\r\n本次事件发生原因是由于被攻击合约（0xF8527Dc5）中引入了计算库，而在redeemUnderlying函数中计算攻击者（0x4b92cc34）需要转入的fsAMM代币数量都会出现向下取整的情况，导致攻击者（0x4b92cc34）本身需要付出的代价减半，重复套利。\r\n\r\n针对本次攻击事件，我们在开发过程中应遵循以下注意事项：\r\n\r\n（1）solidity不支持浮点数运算，在开发整数运算时推荐先乘后除，或使用合适的精度。\r\n\r\n（2）项目上线前，需要向第三方专业的审计团队寻求技术帮助。\r\n\r\n## **About Us**\r\n\r\nSharkTeam的愿景是全面保护Web3世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成，精通区块链和智能合约的底层理论，提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE等建立长期合作关系。\r\n\r\n官网：https\\://www\\.sharkteam.org\r\n\r\nTwitter：<https://twitter.com/sharkteamorg> \r\n\r\nDiscord：<https://discord.gg/jGH9xXCjDZ> \r\n\r\nTelegram：<https://t.me/sharkteamorg> \r\n\r\n<!--EndFragment-->"},"author":{"user":"https://learnblockchain.cn/people/7454","address":null},"history":null,"timestamp":1687159377,"version":1}