赞
踩
溢出攻击事件
2018年4月22日, 黑客对BEC智能合约发起攻击,凭空取出57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968
个BEC代币并在市场上进行抛售,BEC随即急剧贬值,价值几乎为0,该市场瞬间土崩瓦解。
2018年4月25日,SMT项目方发现其交易存在异常,黑客利用其函数漏洞创造了
65,133,050,195,990,400,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + 50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000
的SMT币,火币Pro随即暂停了所有币种的充值提取业务。
2018年12月27日,以太坊智能合约Fountain(FNT)出现整数溢出漏洞,黑客利用其函数漏洞创造了
2 + 115792089237316195423570985008687907853269984665640564039457584007913129639935
的SMT币。
让我们一起以沉痛的心情缅怀以上一夜归零的代币。
整数溢出简介
整数溢出原理
通常来说,在编程语言里由算数问题导致的整数溢出漏洞屡见不鲜,在区块链的世界里,智能合约的Solidity语言中也存在整数溢出问题,整数溢出一般分为又分为上溢和下溢,在智能合约中出现整数溢出的类型包括三种:
乘法溢出
加法溢出
减法溢出
在Solidity语言中,变量支持的整数类型步长以8递增,支持从uint8到uint256,以及int8到int256。例如,一个 uint8类型 ,只能存储在范围 0到2^8-1,也就是[0,255] 的数字,一个 uint256类型 ,只能存储在范围 0到2^256-1的数字。
在以太坊虚拟机(EVM)中为整数指定固定大小的数据类型,而且是无符号的,这意味着在以太坊虚拟机中一个整型变量只能有一定范围的数字表示,不能超过这个制定的范围。
如果试图存储 256这个数字 到一个 uint8类型中,这个256数字最终将变成 0,所以整数溢出的原理其实很简单,为了说明整数溢出原理,这里以 8 (uint8)位无符整型为例,8 位整型可表示的范围为 [0, 255],255 在内存中存储按位存储的形式为下图所示:
- pragma solidity ^0.4.25;contract POC{
- //加法溢出 //如果uint256 类型的变量达到了它的最大值(2**256 - 1),如果在加上一个大于0的值便会变成0 function add_overflow() returns (uint256 _overflow) {
- uint256 max = 2**256 - 1; return max + 1; } //减法溢出 //如果uint256 类型的变量达到了它的最小值(0),如果在减去一个小于0的值便会变成2**256-1(uin256类型的最大值) function sub_underflow() returns (uint256 _underflow) {
- uint256 min = 0; return min - 1; } //乘法溢出 //如果uint256 类型的变量超过了它的最大值(2**256 - 1),最后它的值就会回绕变成0 function mul_overflow() returns (uint256 _underflow) {
- uint256 mul
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。