SC01:2023 - 再入攻撃 (Reentrancy Attacks)
説明:
事例 (DAO ハック):
function splitDAO(uint _proposalID, address _newCurator) noEther onlyTokenholders returns (bool _success) {
...
uint fundsToBeMoved = (balances[msg.sender] * p.splitData[0].splitBalance) / p.splitData[0].totalSupply;
//Since the balance is never updated the attacker can pass this modifier several times
if (p.splitData[0].newDAO.createTokenProxy.value(fundsToBeMoved)(msg.sender) == false) throw;
...
// Burn DAO Tokens
// Funds are transferred before the balance is updated
Transfer(msg.sender, 0, balances[msg.sender]);
withdrawRewardFor(msg.sender); // be nice, and get his rewards
// Only now after the funds are transferred is the balance updated
totalSupply -= balances[msg.sender];
paidOut[msg.sender] = 0;
return true;
}影響:
対策:
再入攻撃の被害を受けたスマートコントラクトの事例:
PreviousOWASP スマートコントラクト Top 10 2023NextSC02:2023 - 整数オーバーフローとアンダーフロー (Integer Overflow and Underflow)
Last updated