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 ...
随机推荐
- postgresql小计
1. postgresql执行结束后,判断结果是否成功,有几种结果 typedef enum { PGRES_EMPTY_QUERY = 0, /* empty query string was ex ...
- Centos开发小计
1. 生成静态库,linux下库的规则是lib开头 g++ -c code.cpp ar cr libcode.a code.o
- springboot自定义页面拦截
项目结构图 页面拦截代码 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public vo ...
- expect脚本自动获取root权限
Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh.远程复制scp.文件传输sftp等.这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的.为了实现自 ...
- Linux简介和各发行版介绍
一.Linux 简介 Linux 内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix 操作系统,是 ...
- 命名法:骆驼(Camel)、帕斯卡(pascal)、匈牙利(Hungarian)、下划线(_)
首先欢迎大家到来! 常用的命名法:骆驼(Camel).帕斯卡(pascal).匈牙利(Hungarian).下划线(_) 骆驼:是指混合使用大小写字母来构成变量和函数的名字 帕斯卡:与骆驼命名法类似只 ...
- fiddle4 弱网测试
下载:https://www.telerik.com/download/fiddler/fiddler4 参考:https://blog.csdn.net/qq_28905427/article/de ...
- Vue父组件如何调用子组件(弹出框)中的方法的问题
如果子组件是一个弹出框,只有在触发某个点击事件时弹出框才能出现(也就是说在父组件中的子组件使用上用了v-if),那在父组件上如果不点击弹出框是不能获取到$ref的. 原因就是:引用指向的是子组件创建的 ...
- 什么是SQL ?
SQL 1.什么是SQL ? Structured Query Languange:结构化查询语言 其实就是定义了操作所有关系型数据库的规则.每一种数据库操作的方式存在不一样的地方,称为“方言”. 2 ...
- 这台计算机上缺少此项目引用的Nuget程序包,请参考链接 不给出缺什么包的提示。
这台计算机上缺少此项目引用的Nuget程序包,请参考链接 不给出缺什么包的提示. 解决办法: 1.卸载当前解决类库. 2.编辑当前项目类库文件. 3.删除节点 <Target Name=&q ...