找出错误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合约,针对合约中的函数在执行前调用外部合约来检测本次调用是否有危险操作。