概要#
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 トークンの残高です。
これは、mint や burn によって制御される ERC20 標準の TotalSupply ではありません。
したがって、このコントラクトを攻撃するには、トークンの転送コードを追加するだけで十分であり、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