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 ...
随机推荐
- java web开发入门三(Hibernate)基于intellig idea
Hibernate 1.开发流程 项目配置好后的结构: 1.下载源码: 版本:hibernate-distribution-3.6.0.Final 2.引入hibernate需要的开发包(3.6版本) ...
- Docker方式安装SonarQube
获取镜像 docker pull postgres: docker pull sonarqube:-community 启动镜像 docker run -d -p : -e POSTGRES_PASS ...
- .NET 微服务 学习目录
概述 微服务在Java端已经有很成熟的框架可以使用,之前.NET一直没有比较成熟的网关,最近发现 Ocelot 这个.NET开源的微服务网关功能越来越强大,正好照着微软的官方文档学些一下.NET的微服 ...
- Springboot Actuator之十:actuator中的audit包
前言这篇文章我们来分析一下org.springframework.boot.actuate.security,org.springframework.boot.actuate.audit中的代码,这2 ...
- RuntimeError: Model class myapp.models.Test doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
没有添加子应用在settings里面!
- sitecore-多变量测试与A / B测试概念论述
sitecore-多变量检验和A / B检验的区别 A / B测试和多变量测试有什么区别?让我们来看看这些测试方法的方法,常见用途,优点和局限性. sitecore中A / B测试 A / B测试(您 ...
- Sitecore安全性第1部分:自定义角色和权限
安全性是任何Sitecore构建的重要组成部分.它可确保您的内容作者具有适当级别的访问权限,以管理他们拥有的内容,并授予他们访问不同Sitecore功能的权限. Sitecore附带了许多提供功能访问 ...
- @Valid参数验证 BindingResult result 的使用
1.首先导入依赖包bean-validator.jar2.在实体类上面写一些相关的验证信息:可以搜索更多的一些验证方式,这只是一部分 可以参考:点击打开链接http://blog.csdn.net/c ...
- CentOS 6.x安装php 5.6和redis扩展的全过程
安装PHP 5.6 #yum clean all #yum update 整体升级一下yum包 #yum install -y epel-release #yum list installed | g ...
- servlet规范--Servlet 规范其实就是对 HTTP 协议做面向对象的封装
Servlet规范 一个最基本的 Java Web 项目所需的 jar 包只需要一个 servlet-api.jar ,这个 jar 包中的类大部分都是接口,还有一些工具类,共有 2 个包,分别是 j ...