本文分析了Damn Vulnerable Defi V4挑战中的Unstoppable Vault漏洞。
让我们看一下挑战声明:
所以,总结一下:
话不多说... 让我们开始破解吧😀!!
这个闪电贷系统有两个主要合约,UnstoppableVault.sol 和 UnstoppableMonitor.sol。
UnstoppableVault.sol 是系统的核心。这是持有资产并执行闪电贷逻辑的 vault。它继承自一些合约:
另一个合约是 UnstoppableMonitor.sol,是一个负责监控 UnstoppableVault.sol 行为的合约。它继承自 IERC3156FlashBorrower,这意味着它可以接收闪电贷。因此,它有一个 "onFlashLoan" 函数和一个 "checkFlashLoan" 函数,看起来非常诱人🧃
这个 "checkFlashLoan" 函数有一个 try/catch 块。它尝试从 UnstoppableVault.sol 合约请求闪电贷。如果它工作正常,它会发出一个事件,表明一切正常。但是,如果闪电贷交易由于任何原因失败,则执行 catch 块。在这个 catch 块中,我们调用 UnstoppableVault.sol 的 pause 函数,停止闪电贷功能!!
因此,如果我们找到一种方法使闪电贷失败,这个 catch 块将被执行,我们将实现我们的目标。
在 UnstoppableVault.sol 合约中 -> 在 "flashLoan" 函数中,我们在函数的开头有一系列条件:
if (amount == 0) revert InvalidAmount(0); // 尽早失败
if (address(asset) != _token) revert UnsupportedCurrency(); // 强制执行 ERC3156 要求
uint256 balanceBefore = totalAssets();
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance(); // 强制执行 ERC4626 要求
让我们关注最后一个:
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance();
这里我们有两个重要的术语:assets
和 shares
。
DVT
,用户存入和从 vault 中提取的代币,也就是 vault 持有的加密货币)。为了计算 shares,合约使用的是 ERC-4626 的 "convertToShares" 函数,该函数根据输入中传递的资产数量返回相应的 shares。
因此,这个条件所做的是评估底层代币的数量必须与 share 代币的数量相同。
如果我们直接将 DVT transfer 到 vault,而不是通过调用 "deposit" 函数来做,我们会增加合约的底层金额,而不会铸造新的 share 代币。这将使条件 (convertToShares(totalSupply) != balanceBefore)
为真,并随后执行条件内的 revert 行。
因此,当 monitor 尝试进行闪电贷时,交易将 revert,触发 check 函数上的 catch 块并停止 vault。
因此,只需一行代码,我们就可以利用该系统:
就是这样。
感谢阅读,祝你黑客愉快,我的朋友!!
- 原文链接: blog.blockmagnates.com/u...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!