Re-entrancy

reentrancy attack

Description

The goal of this level is for you to steal all the funds from the contract.

Things that might help:

  • Untrusted contracts can execute code where you least expect it.

  • Fallback methods

  • Throw/revert bubbling

  • Sometimes the best way to attack a contract is with another contract.

  • See the Help page above, section "Beyond the console"

Background Knowledge

Lecture

Reentrancy - Smart Contract Programmer

Ethereum Book

reentrancy - Mastering Ethereum

Code Audit

This contract fails to follow the Checks Effects Interactionsarrow-up-rightpattern. In the withdraw() function:

handles the call() (interaction) too early in the implementation. This call() (interaction) is supposed to happen after balances[msg.sender] -= _amount (effect):

When calling withdraw it invokes our contract again before resetting the balance, allowing us to enter the contract again with another withdraw action. This is the classic re-entrancy attack.

Solution

Enumerate how many ether is stored in the target contract:

The target contract has 0.001 ether, which is 1000000000000000 wei.

Write an attack contract in Remix IDE:

Call donateAndWithdraw() with msg.value == 1000000000000000.

Summary

In order to prevent re-entrancy attacks when moving funds out of your contract, use the Checks-Effects-Interactions patternarrow-up-right being aware that call will only return false without interrupting the execution flow. Solutions such as ReentrancyGuardarrow-up-right or PullPaymentarrow-up-right can also be used.

transfer and send are no longer recommended solutions as they can potentially break contracts after the Istanbul hard fork Source 1arrow-up-right Source 2arrow-up-right.

Always assume that the receiver of the funds you are sending can be another contract, not just a regular address. Hence, it can execute code in its payable fallback method and re-enter your contract, possibly messing up your state/logic.

Re-entrancy is a common attack. You should always be prepared for it!

The DAO Hack

The famous DAO hack used reentrancy to extract a huge amount of ether from the victim contract. See 15 lines of code that could have prevented TheDAO Hackarrow-up-right.

Last updated