Re-entrancy
A state variable is changed after a contract uses call.value. The attacker uses
a fallback function—which is automatically executed after
Ether is transferred from the targeted contract—to execute the vulnerable function again, before the
state variable is changed.
Attack Scenarios
- A contract that holds a map of account balances allows users to call a
withdrawfunction. However,withdrawcallssendwhich transfers control to the calling contract, but doesn't decrease their balance until aftersendhas finished executing. The attacker can then repeatedly withdraw money that they do not have.
Mitigations
- Avoid use of
call.value - Update all bookkeeping state variables before transferring execution to an external contract.
Examples
- The DAO hack
- The SpankChain hack