专栏首页Gcow安全团队智能合约安全审计之路-整数溢出漏洞

智能合约安全审计之路-整数溢出漏洞

描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错

核心问题:非预期的整数溢出将导致智能合约运行出错,影响合约的可靠性和安全性

基础知识

整数溢出的分类

整数上溢

整数下溢

整数的分类

有符号数(int)

无符号数(uint)

Solidity中的整数类型

int8/int16/int24/…/int256(int8表示-127~127)

uint8/uint16/uint24/…/uint256(uint8表示0~255)

漏洞合约分析

pragma solidity ^0.4.24;
 
contract IntOverflow{
 
    function addNumber(uint a, uint b) public constant returns (uint){
        uint c;
        c = a+b;
        return c;
    }
 
}

漏洞点:由于这里a、b的数值类型为uint256,a、b的最大值为2^256-1,当超过这个最大值即回到起点0从新开始,所以输出c值存在整数溢出

BTCR下溢增持漏洞分析

function distributeBTR(address[] address) onlyOwner {
    for (uint i = 0; i < addresses.length; i++){
        balances[owner] -= 2000 * 10**8;
        balances[address[i]] += 2000 * 10**8;
        Transfer(owner, addresses[i], 2000 * 10**8);
    }
}

漏洞点:通过在distributeBTR函数中调用onlyOwner管理员向指定的用户列表地址进行批量打款,这里就存在一个减法下溢漏洞,当balances[owner]小于2000 * 10**8的时候,这个时候balances[owner]就为负数,但是在uint数的表示范围之内,balances[owner]值就是一个超级大的数,管理员可以通过这个漏洞对自己的balances进行增持。

整数溢出分析

  • 可能产生溢出的操作:加(+)、减(-)、乘(x)
  • 操作数由攻击者可控(函数参数)
  • 上下文末对高危操作数进行有效校验
  • ERC20重点关注balanceOf[]、 allownce[]、 toitalBalance、 totalSupply
  • 溢出成功不代表一定有危害

漏洞预防

  • 有效的上下文校验

require()/assert()/revert()

  • 使用SafeMath

直接调用SafeMath函数

using safeMath for uint256

SafeMath库

pragma solidity ^0.4.24;
 
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
 
    uint256 c = a * b;
    require(c / a == b);
 
    return c;
  }
 
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); 
    uint256 c = a / b;
 
    return c;
  }
 
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;
 
    return c;
  }
 
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);
 
    return c;
  }
 
 
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

本文分享自微信公众号 - Gcow安全团队(Gcow666)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HW在即——红队活动之Lnk样本载荷篇

    注意: 1.本篇文章由Gcow安全团队绝影小组原创(主要研究于红蓝对抗领域) 2.本篇文章一共2700多字,44张图,预计用时8分钟 3.希望各位看官如果在看到...

    Gcow安全团队
  • 代码审计之DTCMS V5.0后台漏洞两枚

    Gcow安全团队
  • 浅谈

    首先信息收集,是渗透测试中的一项重中之重!如果服务器是一个保险柜,那么你想要打开这个保险柜,首先你得了解它是什么做的,怎么样的架构,才能去考虑怎么动手。

    Gcow安全团队
  • 智能合约安全审计之路-整数溢出漏洞

    描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错

    字节脉搏实验室
  • MySQL技巧系列(4)随机手机号

    title: MySQL技巧系列(4)随机手机号 date: 2019-01-24 15:00:00 +0800 update: 2019-01-24 15...

    suveng
  • 看完这篇Linux基本的操作就会了

    Java3y
  • mvcc原理

    index_read有一个分支会调用row_search_no_mvcc,但这个只在表是intrinsic时才调用。intrinsic表示mysql的一个内部用...

    平凡的学生族
  • Linux-看完这篇Linux基本的操作就会了

    二十三年蝉
  • c/c++基础零散补充

    一、C语言的指针与数组、结构体里的成员数组和指针、传入传出参数、回调函数、头文件包含 指针的本质都只是一个内存地址,如果是多字节变量,则是其内存首地址(低地址...

    s1mba
  • 有赞iOS精准测试实践

    近几年有赞零售业务快速发展,为了满足日益增多的业务需求,2019年起零售客户端发版改成了每周一次,在质量保障方面,技术团队要面对更大的挑战。故此我们团队做了很多...

    有赞coder

扫码关注云+社区

领取腾讯云代金券