概述#
Damn Vulnerable DeFi 是學習以太坊 DeFi 智能合約攻擊性安全的 CTF 遊戲。
該遊戲涵蓋了閃電貸、價格預言機、治理、非同質化代幣(NFT)、去中心化交易所(DEX)、借貸池、智能合約錢包、時間鎖等多種 DeFi 場景。
這種類似 CTF 的題目的遊戲非常適合初學者去學習 solidity/ethers.js 的開發。
挑戰描述網站:https://www.damnvulnerabledefi.xyz/
挑戰源碼地址:https://github.com/tinchoabbate/damn-vulnerable-defi
Unstoppable#
題目描述:
有一個令牌化的保險庫,存入了一百萬個 DVT 代幣。在寬限期結束之前,它提供免費的閃電貸款。
通過這個挑戰,讓保險庫停止提供閃電貸款。
你的餘額開始時有 10 個 DVT 代幣。
解析#
由題意得知我們的目標是為了破壞合約讓合約的閃電貸款服務終止。
帶著這樣的目標我們去看看合約是怎麼實現閃電貸款的。
可以觀察到的一點比較奇怪的判斷是這一句:
if (convertToShares(totalSupply) != balanceBefore) revert InvalidBalance(); // enforce ERC4626 requirement
觀察到變數 balanceBefore 是該地址的 ERC20 Token 餘額
並不是 ERC20 標準中由 mint burn 控制的 TotalSupply。
所以攻擊該合約只需要補充一行 transfer token 代碼就可以讓該 totalSupply != balanceBefore 從而讓該閃電貸款停止工作。
題解#
it('Execution', async function () {
await token.connect(player).transfer(vault.address, 1);
});
完整題解地址:https://github.com/fenghaojiang/damn-vulnerable-defi/tree/master/test/unstoppable