事件

2018年4月23日 BEC 一夜被偷64亿

2018年4月25日 SMT 再爆类似漏洞,火币Pro和OKEx相继暂停了SMT交易

2018年4月25日 BEC、SMT现重大漏洞,这8个智能合约也可能凉凉(MESH、UGToken、SMT、SMART、MTC、FirstCoin、GG Token、CNY Token、CNYTokenPlus)

原因

Solidity合约中的整数溢出漏洞

分析

BEC

合约代码地址:https://etherscan.io/address/0xc5d105e63711398af9bbff092d4b6769c82f793d#code

可以看到batchTransfer函数中
, 261 行语句 balances[msg.sender] = balances[msg.sender].sub(amount)和
263行语句 balances[_receivers[i]] = balances[_receivers[i]].add(_value)
中,调用 Safemath库中的安全函数来完成加减操作,但是在第257行代码, 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数额的恶意转账。

SMT

合约代码地址:https://etherscan.io/address/0x55f93985431fc9304077687a35a1ba103dc1e081#code

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

在第 206 行代码 if(balances[_from] < _feeSmt + _value) revert(); 直接使用加法来完成被外界可控的参数进行操作。后面也没有使用Safemath库中的安全函数来完成运算操作。

解决

为了解决整数溢出的问题,以太坊官方在 2017年 8月 6日 单独发过一篇使用SafeMath 库进行整数安全操作的文章(见文后链接) 。Solidity中的SafeMath库定义如下:

下面显示了使用示例:

总结

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

参考

一行代码蒸发了¥6,447,277,680 人民币!

https://zhuanlan.zhihu.com/p/35989258

Solidity合约中的整数安全问题——SMT BEC合约整数溢出解析

http://www.freebuf.com/vuls/169741.html

BEC、SMT现重大漏洞,这8个智能合约也可能凉凉

http://36kr.com/p/5131152.html

SafeMath to protect from overflows

https://ethereumdev.io/safemath-protect-overflows/

Solidity合约中的整数溢出漏洞事件的更多相关文章

  1. BEC合约整数溢出漏洞还原与分析

    一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...

  2. Linux Kernel 整数溢出漏洞

    漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级:    漏洞类型: ...

  3. Nginx整数溢出漏洞 Writeup

    Nginx整数溢出漏洞 CVE-2017-7529 题目URL:http://www.whalwl.site:8040/ 漏洞描述 在 Nginx 的 range filter 中存在整数溢出漏洞,可 ...

  4. CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天

    CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天

  5. CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析

    0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...

  6. CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析

    0x01 2013 Pwn2Own 黑客大赛 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题 ...

  7. gdk-pixbuf tiff_image_parse函数整数溢出漏洞

    受影响系统:gdk-pixbuf gdk-pixbuf 2.36.6描述:CVE(CAN) ID: CVE-2017-2870 gdk-pixbuf是一个用于以各种格式加载图像和像素缓冲处理的库. 使 ...

  8. Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞

    漏洞名称: Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201312-169 发布时间: 2013-12-12 更新时间 ...

  9. Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞

    漏洞名称: Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-423 发布时间: 2013-11-29 更新时间: 201 ...

随机推荐

  1. [Usaco2012 Feb] Cow Coupons

    [Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...

  2. js 判断字符串是否为空或是否全为空格

      判断字符串是否为空 if (str == "") { } 判断字符串是否为空且不能全为空格 if (str.match(/^[ ]*$/)) { } 第二种方式不仅可以校验空格 ...

  3. 【ASP.NET Core分布式项目实战】(四)使用mysql/mysql-server安装mysql

    Docker安装Mysql 拉取镜像 docker pull mysql/mysql-server 运行mysql docker run -d -p : --name mysql01 mysql/my ...

  4. c语言之函数指针应用

    c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

  5. CentOS7 CPU 降频问题

    CentOS7 系统默认的 CPUPOWER 策略是 powersave 节能模式,Google 了非常多的资料,一直没有找到解决办法,现在分享一下. 执行: tuned-adm profile th ...

  6. python入门之名称空间的查找顺序

    名称空间的查找顺序: 局部:局部 > 全局 > 内置 全局:全局 > 内置 # 内置再找不到就报错 # 函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关 x = 111 ...

  7. MySQL查询指定表的字段名称

    1,查询表中所有字段(横排):SELECT GROUP_CONCAT( COLUMN_NAME SEPARATOR "," ) FROM information_schema.CO ...

  8. js推箱子

    <head> <meta charset="utf-8" /> <title></title> <script> //创 ...

  9. .Net Core3.0使用gRPC 和IdentityServer4

    gRPC是什么gRPC是可以在任何环境中运行的现代开源高性能RPC框架.它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证.它也适用于分布式计 ...

  10. python turtle画花

    turtle是一个功能强调大的绘图的库,可以用来绘制各种所需要的图案,但是在使用时需要计算好角度等一系列的问题. 代码(源自<Python语言程序设计>)如下: 运行结果: