SafeMoon漏洞解析

  • zellic
  • 发布于 2023-03-30 10:38
  • 阅读 21

2023年3月29日,SafeMoon的流动性池遭到攻击,损失890万美元。从交易记录和合约更新中可以看出,合约的修改导致了漏洞,使得任何人都可以调用mint函数并转移tokens。攻击者利用这一漏洞通过闪电贷进行了一系列操作,最终导致资金损失。

在2023年3月29日的早晨,SafeMoon的流动性池遭到攻击,价值890万美元的代币被提取。通过查看交易记录和近期的合约变更,我们可以告诉你发生了什么:

概述

BSC交易 0xcb8573807b1db40215840f690eeba6af6ec8fcc5a98eb5d545d40f7f775b0d1b↗中,SafeMoon代币被更新以包含4个新功能:

function setBridgeBurnAddress(address _burn) public onlyOwner {
    bridgeBurnAddress = _burn;
}

function setWhitelistBurn(address _wl) public onlyOwner {
    whitelistMint[_wl] = true;
}

function mint(address user, uint256 amount) public onlyWhitelistMint {
    _tokenTransfer(bridgeBurnAddress, user, amount, 0, false);
}

function burn(uint256 amount) public {
    _tokenTransfer(msg.sender, bridgeBurnAddress, amount, @, false);
}

随后在交易 0x3307500ebaf50fb72c82a62829c8a0b20d8a076e9beae1ff97d87ba32843e219↗ 中再次更新,以允许从任何人而不是发送者那里燃烧代币。

接着又在交易 0x71273e731752457892f73d2ad8b89060bd4f0bf131ed403d5dfc149319c1c01d↗ 中更新,以反转onlyWhitelistMint修饰符。

结果

因此,在超过一天的时间里,任何人都可以调用mint函数,并从桥接燃烧地址(即SafeMoon部署者)转移任意数量的代币。

一旦mint函数被修复,剩下的只是公共燃烧函数,该函数随后被利用:

攻击相当简单:

  1. 闪电贷1000 WBNB
  2. 用1000 WBNB兑换SFM
  3. 从Uniswap交易对中燃烧几乎所有SFM
  4. 从SafeMoon合约中燃烧所有代币(以确保不调用collectBNB)
  5. 在Uniswap交易对上调用sync以更新储备
  6. 将SFM兑换回WBNB,以极高的通胀率
  7. 还款闪电贷

结论

幸运的是,似乎有人愿意归还资金,抢跑了该漏洞:
交易 0xf98a8b7e3ffee676f06f0c037141483ec2c9cf8753a57fbcdbd718590e4d77ff↗

请查看完整的POC在
github/Zellic/poc-hacks/SafeMoon/test/Safemoon.t.sol↗

关于我们

Zellic专注于保障新兴技术的安全。我们的安全研究人员已经发现了在最有价值的目标中的漏洞,从财富500强到DeFi巨头。

开发者、创始人和投资者信任我们的安全评估,以快速、自信并且没有关键漏洞地发布产品。凭借我们在现实世界攻防安全研究中的背景,我们发现了其他人忽视的东西。

联系我们↗以获取更优质的审核。真实审核,而非走过场。

  • 原文链接: zellic.io/blog/safemoon-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zellic
zellic
Security reviews and research that keep winners winning. https://www.zellic.io/