找出错误CryptoVault合约
错误,并防止它被耗尽token。
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF
$ forge test -C src/Ethernaut/DoubleEntryPoint -vvvvv
题目说CryptoVault
合约中有bug。经查:定位到CryptoVault
合约将DoubleEntryPointToken
代币设置为underlying
不可sweep。但如果使用LegacyToken
代币进行sweep
时,LegacyToken
代币的transfer
会调用DoubleEntryPoint
代币的delegateTransfer
方法进行转移。那么在CryptoVault
合约将DoubleEntryPointToken
代币设置为underlying
就无效了。
bug找到,如何避免。
Forta
提供了一种预防方法。在DoubleEntryPointToken
代币进行delegateTransfer
时,会进行fortaNotify
检测。notify
函数中对外部函数调取了try-catch
操作,所以在notify
中进行revert
等终止操作,是没有效果的。
但fortaNotify
中会检测botRaisedAlerts
是否进行了增加。所以可以通过增加botRaisedAlerts
,达到结束交易的工作。
所以,当我们检测到转移CryptoVault
合约中的DoubleEntryPoint代币
时,增加botRaisedAlerts
,结束交易。
function handleTransaction(address user, bytes calldata msgData) public override {
(address to, uint256 value, address origSender) = abi.decode(msgData[4:], (address, uint256, address));
if (origSender == cryptoVault) {
forta.raiseAlert(user);
}
}
该题目给我们展示了一种处理合约bug的模式,除了使用代理模式实现合约可升级来处理合约中的bug。也可以在合约中实现类似Forta合约,针对合约中的函数在执行前调用外部合约来检测本次调用是否有危险操作。