声明:该文章仅供区块链安全学习和技术分享,请勿将该文章和文章中提到的技术用于违法活动上,切勿参与区块链相关违法项目,如产生任何后果皆由读者本人承担,与余生安全团队无关!
如有侵权,请联系后台进行删除。转载请注明出处,感谢!
Creat Future 攻击事件
1. 前言
北京时间 2022 年 4 月 11 日, CF 代币合约被发现存在未验证发送者权限的漏洞,它允许任何人转移他人的 CF 余额。到目前为止,损失约为 190 万美元,而 pancakeswap 上 CF/USDT 交易对已经受到影响。
2. 分析
攻击事件如下图所示:
2.1 基础信息
合约所有者地址:0xcd87248c74915e85f80293f10dcf300a73bc6581
攻击者地址(其中一个):0xee0221d76504aec40f63ad7e36855eebf5ea5edd
交易 hash(其中一个):0xc7647406542f8f2473a06fea142d223022370aa5722c044c2b7ea030b8965dd0
漏洞合约:0x8B7218CF6Ac641382D7C723dE8aA173e98a80196
2.2 流程
管理员将 useWhiteListSwith
设置为false
。
直接调用 _transfer()
函数转走任意账户代币。
2.3 细节
首先看到合约 CFTokenSinglePool_merge.sol
的 _transfer()
函数,其函数可见性为 public
,而 _transfer()
函数本来应该是直接转账 transfer()
函数和授权转账 transferFrom()
函数的内部调用实现,因此这里的 _transfer()
函数可以被任何人直接调用,而 transferFrom()
函数的检查授权额度功能也失效了。
在区块高度 16841993 时合约所有者将 useWhiteListSwith
变量设置为了 false
。
合约 CFTokenSinglePool_merge.sol
第 570 行的 if 判断中,需要检查 useWhiteListSwith
变量的值,如果其为 false
则不需要进行权限判断,也就是不会去校验 msg.sender
、from
和 to
地址是否在白名单内,这样就绕过了权限检查。
由于任何人都可以调用 _transfer()
函数加上没有了白名单的权限检测判断,导致了任何人都可以调用该函数转走其他地址的代币。
2.4 后续处理
在该次攻击事件出现后合约所有者将 useWhiteListSwith
变量又设置为了 true
。
3. 总结
该次攻击事件的主要原因是由函数本身可见性设置错误,且合约所有者将 useWhiteListSwith
设置为 false
关闭了白名单的检测判断,这两者同时导致了此次问题的出现。
对于智能合约函数,我们一定要注意其可见性的正确设置,最好保证最小权限。
关注我们,微信公众号:余生安全团队。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...