Cover photo

为检查的返回值

描述:

低级调用函数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