描述:
低级调用函数call, delegatecall, static call 以及send 出现异常时,交易不会回滚(revert), 而是通过返回值的方式调用点传递状态信息。在这些低级调用发生错误时,如未检查其返回值或错误状态而执行后续关键逻辑,将会产生不可预期的安全问题。
send 2300 gas限制, 执行失败后无法回滚, 不推荐使用;
transfer 2300 gas限制, 执行失败后可回滚, 简单场景;
call 无gas限制, 执行失败后无法回滚, 复杂场景;
漏洞代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract BadLottery{
address public winner;
uint256 public winAmount;
bool public paidOut = false;
function sendToWinner() public {
require(!paidOut);
payable (msg.sender).send(address(this).balance);
}
}
解决方案:
对低级调用的状态进行检查(对send返回值进行检查)
转账使用transfer 而非send

