14.CEXISWAP@Incorrect-Access
2023-11-19 14:59:54
# 08.PoC
CEXISWAP@Incorrect-Access
- 时间:2023-09-21 06:56:11 (UTC)
- 损失金额:$30,000 (30,000 USDT)
- twitter:https://twitter.com/DecurityHQ/status/1704759560614126030
交易
- 黑客EOA:0x060C169C4517D52c4BE9a1Dd53e41a3328d16F04
- 黑客用来攻击的合约地址:0x8C425Ee62D18b65Cc975767C27c42dE548D133A1
- 被攻击的合约地址:0xb8a5890d53df78dee6182a6c0968696e827e3305
- 攻击事件hash:0xede72a74d8398875b42d92c550539d72c830d3c3271a7641ee1843dc105de59e
资金流向
攻击过程
攻击详细分析
攻击步骤就两个:调用initialize()
和upgradeToAndCall()
,很明显,initialize()
是用来获取权限,然后upgradeToAndCall()
是用权限来获利。
按道理,初始化函数应该只能调用一次,但是黑客看到了项目方调用了两次,如下图。那么猜测这个初始化函数是有问题的,不符合最佳实践。
那么这样就可以想一下,是否可以多次调用初始化函数呢?是否任何人都可以调用呢?事实上,任何人都可以调用,这个关键函数没做保护,只是没将合约开源而已。
拿到了权限,就可以调用upgradeToAndCall()
进行获利。
复现
1 | // SPDX-License-Identifier: UNLICENSED |
建议
- 未开源 != 安全
- 关键函数一定要做权限校验