风险提示:理性看待区块链,提高风险意识!
SMT/BEC合约整数溢出解析—Solidity合约中的整数安全问题
首页 > 币界资讯 > 区块链知识 2018-04-25 17:01
摘要
1 整数安全回顾1.1 整数安全简介​ 在传统的桌面windows攻防对抗领域,伴随着微软和合作伙伴对软件开发流程推行SDL规范,同时对安全投入的逐步加大,单一的封包超长和文件特定字段内容超长导致的溢出漏洞在一些大型软件里几乎绝迹。剩余漏洞除了浏览器中的UAF(有隔离堆和延迟释放对关键类进行利用缓解 。
币界网报道:

1 整数安全回顾

1.1 整数安全简介

​ 在传统的桌面windows攻防对抗领域,伴随着微软和合作伙伴对软件开发流程推行SDL规范,同时对安全投入的逐步加大,单一的封包超长和文件特定字段内容超长导致的溢出漏洞在一些大型软件里几乎绝迹。剩余漏洞除了浏览器中的UAF(有隔离堆和延迟释放对关键类进行利用缓解),弱类型语言存在的类型混淆,还零星剩下了一些整数类的漏洞。整数类漏洞,最近的如去年的nginx cve-2017-7529。

区块链方向,比较早的整数溢出类漏洞可追溯到2010年的比特币大整数溢出,CVE-2010-5139 ,黑客通过整数溢出构造了大概92233720368.54277039 个比特币,最近的SMT/BEC的整数安全场景与之前比特币的场景类似。

​ 传统安全领域中,整数安全与数据模型和整数运算支持的运算符相关,其中数据模型又跟处理器架构体系和操作系统平台相关。如下图。

1

图1

C中容易引发整数安全问题的运算符简要罗列如下。

2

图2

Solidity合约中的整数安全场景与之类似。

 1.2 Solidity中的整数安全场景

SMT和BEC都是以太坊代币生态下的一个普通的ERC-20代币。转账流通都是通过以太坊的solidity合约进行实现。

区块链1.0的比特币也有脚本语言,但是为了安全阉割掉了循环和递归等图灵完备性语言才有的功能。以太坊Solidity设计之初就被定位为图灵完备性语言。Solidity的图灵完备性也为后续的合约漏洞陆续埋下了伏笔,如The Dao漏洞事件直接导致以太坊硬分叉成了eth和旧链etc。

Solidity语言暂不支持类似于C中的float double等浮点型数据类型。支持int/uint变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8uint256,以及int8int256。需要注意的是,uintint默认代表的是uint256int256uint8的数值范围与C中的uchar相同,即取值范围是0到2^8-1,uint256支持的取值范围是0到2^256-1,余下数据类型以此类推。

Solidity语言中对于运算符的支持如下。

  • 比较:<=<==!=>=>,返回值为bool类型。
  • 位运算符:&|,(^异或),(~非)。
  • 数学运算:+-,一元运算+*/,(%求余),(**平方)。

Solidity合约代码的逻辑都相对简单,运算符的使用中加法 减法和乘法居多。

以太坊提供有一个Solidity语言的在线编译测试工具。 我们以加法和减法运算作为举例,简单说明下整数溢出在Solidity语言中的常规情况。

编写如下solidity测试代码。

pragma solidity ^0.4.0;
contract C {
// (2**256 - 1) + 1 = 0
function overflow() returns (uint256 _overflow) {
    uint256 max = 2**256 - 1;
    return max + 1;
    }
​
// 0 - 1 = 2**256 - 1
function underflow() returns (uint256 _underflow) {
    uint256 min = 0;
    return min - 1;
    }
}

在线测试工具中编译运行结果如下。

3

图3

4

图4

可以看到uint256当取最大整数值,上溢之后直接回绕返回值为0,uint256当取0下溢之后直接回绕,返回值为2^256-1。这是solidity中整数溢出场景的常规情况。

  1.3 Solidity中的整数溢出缓解和SafeMath库

为了减少solidity合约开发中产生的安全问题,以太坊的官方开发博客陆续发布了一些与solidity开发安全相关的博文。在2017年8月6日单独发过一篇使用SafeMath库进行整数安全操作的文章<< SafeMath to protect from overflows >>。详见链接

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
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) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    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;
  }
}
可以看到相关的可能产生溢出的操作都单独封装成函数,加入assert断言做判断避免溢出。调用SafeMath库的方法如下。
51

图5

2. SMT合约中的整数安全问题简析

与大型软件或者操作系统动辄十万行甚至千万行代码不同,智能合约的代码行数通常不多,功能也不是很复杂。一起来看下SMT合约的相关代码。

SMT的合约地址是

问题存在于transferProxy()函数 代码如下

61

图6

在进行加法操作的时候没有采用Safemath库进行约束。_feeSmt参数和_value参数均可以被外界进行控制, _feeSmt和value均是uint256无符号整数,相加后最高位舍掉,结果为0。

7 (2)

图7

直接溢出绕过代码检查导致可以构造巨大数量的smt代币并进行转账。

8

图8

攻击者的恶意转账记录可以从如下链接进行看到。

9

图9

3. BEC合约中的整数安全问题简析

BEC的合约地址是0xC5d105E63711398aF9bbff092d4B6769C82F793D,合约代码可以访问etherscan的如下网址进行查看https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d#code。代码一共是299行。

问题函数如下图。

10

图10

可以看到batchTransfer函数中,语句balances[msg.sender] = balances[msg.sender].sub(amount)和balances[_receivers[i]] = balances[_receivers[i]].add(_value)中,调用Safemath库中的安全函数来完成加减操作,但是在第三行代码,  uint256 amount = uint256(cnt) * _value却直接使用乘法运算符。

其中变量cnt为转账的地址数量,可以通过外界的用户输入_receivers进行控制,_value为单地址转账数额,也可以直接进行控制。乘法运算溢出,产生了非预期amount数值,并且外界可以通过调整_receivers和_value的数值进行操控。紧接着下面有一句对amount进行条件检查的代码 require(_value > 0 && balances[msg.sender] >= amount);其中balances[msg.sender]代表当前用户的余额。amount代表要转的总币数。代码意思为确保当前用户拥有的代币余额大于等于转账的总币数才进行后续转账操作。因为通过调大单地址转账数额_value的数值,amount溢出后可以为一个很小的数字或者0,很容易绕过balances[msg.sender] >= amount的检查代码。从而产生巨大_value数额的恶意转账。

攻击者的恶意转账记录,可以从如下链接看到

11

图11

可以从代码totalSupply进行看到,bec代币总量共计才7 000 000 000枚。

12

图12

但是攻击者通过溢出amount绕过后续require中的判定条件分别向两个地址恶意转账了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968枚bec代币。

4. 合约整数漏洞事件总结

单纯从技术上来说,smt和bec的本次合约的漏洞成因和利用都不复杂,均是通过构造恶意的整数溢出绕过条件检查。相信以太坊生态下的其他数千种代币的合约也不同程度的存在类似的整数漏洞安全隐患,由于solidity合约是直接跟钱打交道,合约的安全开发和审计值得ico项目方和solidity开发人员投入更多时间和精力,确保合约的安全性。

参考链接:

发表评论
发表评论
暂无评论
    相关阅读
    未来一年可以说是最难以预测的一年。地缘政治错综复杂、美国监管政策不确定。尽管美国股市似乎无法停止上涨,利率也只能下降,但我们知道,这两件事都不是板上钉钉的事。
    区块链
    2025-01-08 11:31:18
    周一,比特币和以太坊 ETF 共计流入 11 亿美元,在现货基金年初出现 3.2 亿美元流入后,形成了积极的势头。
    比特币
    2025-01-08 10:31:17
    Ripple宣布已集成Chainlink,为用户提供实时RLUSD定价数据,增强了稳定币在DeFi上的实用性和访问权限。DeFi开发人员还可以将RLUSD支持集成到他们的应用程序中,用于贷款和交易等多种用例。
    区块链
    2025-01-08 10:03:08
    莱特币在看涨突破后一周内上涨12%——282美元的目标现在就在眼前!
    区块链
    2025-01-08 09:41:19
    除了 Twitter 之外,还有其他地方可以追踪 AI 代理。
    区块链
    2025-01-08 09:31:18
    推荐专栏
    热门币种
    更多
    币种
    美元价格
    24H涨跌幅
    BTC比特币
    60,963.61 USDT
    ¥435,103.38
    -2.72%
    ETH以太坊
    3,368.69 USDT
    ¥24,042.67
    -0.3%
    BNB币安币
    570.68 USDT
    ¥4,073.00
    -0.28%
    USDT泰达币
    1.02 USDT
    ¥7.25
    -0.19%
    SOL
    135.96 USDT
    ¥970.36
    +7.66%
    USDC
    1.00 USDT
    ¥7.15
    -0.01%
    TON
    7.59 USDT
    ¥54.14
    +4.55%
    XRP瑞波币
    0.47720 USDT
    ¥3.41
    +0.48%
    DOGE狗狗币
    0.12210 USDT
    ¥0.87140
    +2.43%
    ADA艾达币
    0.39050 USDT
    ¥2.79
    +3.88%
    热搜币种
    更多
    币种
    美元价格
    24H涨跌幅
    狗狗币
    0.3541 USDT
    ¥2.59
    -9.65%
    Filecoin
    5.3381 USDT
    ¥39.11
    -10.48%
    比特币
    96512.03 USDT
    ¥707,090.56
    -5.13%
    Gatechain Token
    17.9689 USDT
    ¥131.65
    -2.85%
    Horizen
    23.2652 USDT
    ¥170.45
    -17.39%
    dYdX
    1.4038 USDT
    ¥10.28
    -13.8%
    Solana
    198.71 USDT
    ¥1,455.84
    -8.68%
    柚子
    0.814 USDT
    ¥5.96
    -10.6%
    Shiba Inu
    2.174E-5 USDT
    ¥0.00
    -9.45%
    艾达币
    0.998 USDT
    ¥7.31
    -8.29%
    FTX Token
    2.9131 USDT
    ¥21.34
    -13.97%
    火币积分
    0.9291 USDT
    ¥6.81
    -29.01%
    最新快讯
    更多
    美国现货比特币ETF昨日净流入5346万美元
    2025-01-08 12:00:02
    昨日美国比特币现货ETF净流入5348万美元
    2025-01-08 11:59:02
    CertiKAlert:7天前部署的IPC代币存在漏洞,黑客通过闪电贷保护机制盗取约59万美元
    2025-01-08 11:58:42
    IREN:2024全年比特币挖矿产出达3984枚BTC
    2025-01-08 11:57:41
    昨日贝莱德IBIT净流入5.9718亿美元,交易量达31亿美元
    2025-01-08 11:54:57
    IPC代币疑遭攻击,损失约59万美元
    2025-01-08 11:53:10
    NOWPayments:比特币达到10万美元里程碑后,商家加密支付激增8%
    2025-01-08 11:53:03