solidity 整数溢出漏洞

Solidity语言中,变量支持的整数类型步长以 8 递增,支持从 uint8 到 uint256,以及 int8 到 int256

存储范围:

  • uint8 : [0, 2^8-1]
  • uint256 : [0, 2^256-1]

在智能合约中出现整数溢出的类型包括三种:

  1. 乘法溢出:(uint256)2 * 2^255 =(uint256) 0
  2. 加法溢出:(uint8)255 + 1 = (uint8)0
  3. 减法溢出:(uint8)0 - 1 =(uint8)255

漏洞场景:

乘法、加法、减法算术运算时,运算数值可控

漏洞防护:

使用 OpenZeppelin 维护的一套智能合约函数库中的SafeMath方法来处理算术逻辑

pragma solidity ^0.4.25;

library SafeMath {
    function mul(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a / b;
        return c;
    }

    function sub(uint256 a, uint256 b) internal constant returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

contract POC{
    using SafeMath for uint256;

    // 加法溢出
    // 如果uint256类型的变量达到了它的最大值(2**256 - 1),如果在加上一个大于0的值便会变成0
    function add_overflow() returns (uint256 _overflow) {
        uint256 max = 2**256 - 1;
        return max.add(1);
    }

    // 减法溢出
    // 如果uint256类型的变量达到了它的最小值(0),如果在减去一个小于0的值便会变成
    // 2**256-1(uin256类型的最大值)
    function sub_underflow() returns (uint256 _underflow) {
        uint256 min = 0;
        return min.sub(1);
    }

        // 乘法溢出
        // 如果uint256类型的变量超过了它的最大值(2**256 - 1),最后它的值就会回绕变成0
        function mul_overflow() returns (uint256 _underflow) {
            uint256 mul = 2**255;
            return mul.mul(2);
    }
}

相关推荐

  1. solidity 整数溢出漏洞

    2023-12-14 17:00:03       59 阅读
  2. Solidity&Foundry 安全审计测试 Delegatecall漏洞

    2023-12-14 17:00:03       24 阅读
  3. Go语言如何处理整数溢出

    2023-12-14 17:00:03       40 阅读
  4. 区块链web3智能合约Solidity学习资源整理

    2023-12-14 17:00:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 17:00:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 17:00:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 17:00:03       82 阅读
  4. Python语言-面向对象

    2023-12-14 17:00:03       91 阅读

热门阅读

  1. LinuxBasicsForHackers笔记 -- 了解和检查无线网络

    2023-12-14 17:00:03       67 阅读
  2. Moonbeam与Subsocial集成,为网络带来社交应用创建

    2023-12-14 17:00:03       53 阅读
  3. maui sqlite开发一个商城加购物车的演示(2)

    2023-12-14 17:00:03       58 阅读
  4. Linux - 内存 - memblock 分配器

    2023-12-14 17:00:03       62 阅读
  5. Linux 创建一个service并设置开机启动

    2023-12-14 17:00:03       68 阅读
  6. Springboot+Libreoffice集成开发

    2023-12-14 17:00:03       67 阅读
  7. springboot_3.2_freemark_基础环境配置

    2023-12-14 17:00:03       51 阅读
  8. Cmake

    2023-12-14 17:00:03       51 阅读
  9. LeetCode-23. 合并 K 个升序链表

    2023-12-14 17:00:03       44 阅读