Solidity合约中的整数溢出漏洞事件
事件
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合约中的整数溢出漏洞事件的更多相关文章
- BEC合约整数溢出漏洞还原与分析
一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...
- Linux Kernel 整数溢出漏洞
漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级: 漏洞类型: ...
- Nginx整数溢出漏洞 Writeup
Nginx整数溢出漏洞 CVE-2017-7529 题目URL:http://www.whalwl.site:8040/ 漏洞描述 在 Nginx 的 range filter 中存在整数溢出漏洞,可 ...
- CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
- CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析
0x01 2013 Pwn2Own 黑客大赛 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题 ...
- gdk-pixbuf tiff_image_parse函数整数溢出漏洞
受影响系统:gdk-pixbuf gdk-pixbuf 2.36.6描述:CVE(CAN) ID: CVE-2017-2870 gdk-pixbuf是一个用于以各种格式加载图像和像素缓冲处理的库. 使 ...
- Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞
漏洞名称: Samba ‘dcerpc_read_ncacn_packet_done’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201312-169 发布时间: 2013-12-12 更新时间 ...
- Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-423 发布时间: 2013-11-29 更新时间: 201 ...
随机推荐
- fping 命令说明
参数: -a 表示只在输出报告⾥列出当前存活的IP -d 解析主机名 -f 参数表示读⼊这个文件 -s 显示汇总信息 -g 指定⽹网段
- readfile,read,createReadStream函数
这三个函数使用前都需要引入fs模块(var fs= require(“fs”) ) readfile:读取文件内容的异步函数,readFile方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取 ...
- bat 文件追加
@echo off set str1=disable_modules:set str2= - mine echo %str1% >> c:\minionecho %str2% >&g ...
- [经验分享]ThinkPad笔记本无法进入PE环境
首先参考:https://jingyan.baidu.com/article/72ee561a564358e16138df14.html 可以设置Secure Boot然后重启电脑,按F1重新进入BI ...
- Python 3.X 练习集100题 03
一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? import math for i in range(10000): n1 = math.sqrt( ...
- Python3第三方组件最新版本追踪实现
一.说明 在安全基线中有一项要求就是注意软件版本是否是最新版本,检查是否是最新版本有两方面的工作一是查看当前使用的软件版本二是当前使用软件的最新版本.在之前的“安全基线自动化扫描.生成报告.加固的实现 ...
- 029 ElasticSearch----全文检索技术04---基础知识详解02-查询
1.查询 (1)基本查询 基本语法: GET /索引库名/_search { "query":{ "查询类型":{ "查询条件":" ...
- Java的常用API之Object类简介
Object类 1.toString方法在我们直接使用输出语句输出对象的时候,其实通过该对象调用了其toString()方法. 2.equals方法方法摘要:类默认继承了Object类,所以可以使用O ...
- C# 单向链表 逆序(递归)
static void Main(string[] args) { while (true) { LinkedList L = new LinkedList(); L.Add(new Node(&qu ...
- - Gradle 翻译 Analyzer APK文件分析 MD
目录 目录 APK文件分析 使用 APK 分析器分析您的编译版本 查看文件和大小信息 查看 AndroidManifest.xml 查看 DEX 文件 过滤DEX文件树视图 加载 Proguard 映 ...