Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >智能合约:整型溢出漏洞

智能合约:整型溢出漏洞

作者头像
yichen
发布于 2020-05-04 06:56:15
发布于 2020-05-04 06:56:15
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

用书上的例子来介绍一下:

一个小朋友,他可以数着手指运算十以内的运算,比如 1+1=2,他可以用两个手指算出来,但是如果你问他 5+6 等于多少,他数完十个手指之后发现手指不够用了,就会把手指扳回来,说:结果为 1,对于小朋友来说,这个问题就超纲“溢出”了

在 solidity 中,当一个整型变量高于或者低于他所能承受的范围时,就会发生溢出,导致一些不可预期的情况出现。例如,当用户转账金额超过系统预设的最大值时,只要用户金额大于零,用户就可以直接将巨额的代币转走

代码片段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool){  uint cnt = _receivers.length;  uint 256 amount = uint256(cnt) * _value;  //出现了成发运算,且amount缺少溢出判断,因此存在溢出的可能  require(cnt > 0 && cnt <=20);  require(_value >0 && balances[msg.sender] >= amount);  //存在通过将amount溢出为0或极小值来绕过余额判断的可能  balances[msg.sender] = balances[msg.sender].sub(amount);  for(uint i = 0; i < cnt; i++){    balances[_receivers[i]] = balances[_receivers[i]].add(_value);    Transfer(msg.sender, _receivers[i], _value);  }  return true;}

这个函数的作用是:让用户同时向多个人转账。第一个参数 _receivers 为 Address 数组类型,代表接收者地址,也就是可以向一整个数组的人转账。第二个参数 _value 为转账金额。

这个函数的逻辑是:

获得数组的成员数(cnt),计算一共转多少钱(amount)

成员数要大于 0 且小于 20 ,然后转账的数值要大于 0 且要小于拥有的金额数才能继续

漏洞分析

uint 256 amount = uint256(cnt) * _value;

在上下文中,没有对 amount 进行溢出判断,如果攻击者将 amount 溢出为 0 或者其他很小的值就能绕过用于对账户余额的判断

require(_value >0 && balances[msg.sender] >= amount);

在代码中可以看到 转账的金额能够被 cnt 和 _value 所控制,所以我们可以操纵这俩数值,来达到目的

具体步骤如下:

  1. 创建两个地址,用于接收溢出转账
  2. 调用 batchTransfer() 函数,将 _receivers 设置为 uint256 的最大值 / 2 + 1
  3. 这样,当计算 amount = uint256 的最大值 + 1,就超过了 uint256 的最大范围,成功溢出为 0

奇数 115792089237316195423570985008687907853269984665640564039457584007913129639935 是 uint256 的最大值,如果把他除以二(刚好需要向下取整)然后加一,把这个作为 _value 的值,这样,再乘以一个 cnt 的值,得到的就刚好溢出

  1. 代码执行后,两个地址都会得到 _value 个 Token,也就是这两个账号会凭空增加 57896044618658097711785492504343953926634992332820282019728792003956564819968 个 Token(也就是 _value 值)

代码调试

去这里看一下:

https://cn.etherscan.com/address/0xc5d105e63711398af9bbff092d4b6769c82f793d

代码复制出来,然后拿到 remix IDE 里面去编译一下

然后在 Run 里面,选择 Environment 为 JavaScript VM,然后选择 BecToken 合约 点击 Deplay 进行部署

记录一下账户的地址:

1:0xca35b7d915458ef540ade6068dfe2f44e8fa733c(主账户)

2:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

3:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_receivers:["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"]_value:57896044618658097711785492504343953926634992332820282019728792003956564819968

然后点击 batchTransfer 的 transact

再用 balanceOf 看一下账户余额是不是变化了

一开始主账户的金额:

其他账户(以第二个为例)

转账之后第二个帐户的金额

再来看看第一个账户的金额,还是这样,这就说明我们复现成功了

规避整型溢出:SafeMath库

目前 solidity 还没有解决此问题,所以只能由各个合约自行完成整型溢出的判断

在任何时候,都不要在代码中直接使用 +、-、*、/ 来进行数学运算,而应使用 SafeMath 库

在 SafeMath 库中每个函数开头都用 语句进行了判断,对所有函数都进行了防溢出判断,可以有效地杜绝整型溢出问题

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
智能合约中常见的漏洞总结复现#技术创作101训练营#
一个小朋友,他可以数着手指运算十以内的运算,比如 1+1=2,他可以用两个手指算出来,但是如果你问他 5+6 等于多少,他数完十个手指之后发现手指不够用了,就会把手指扳回来,说:结果为 1,对于小朋友来说,这个问题就超纲“溢出”了
yichen
2020/09/23
2.9K0
浅析AMR智能合约批量转账溢出漏洞
日前,互联网爆出AMR合约存在高危安全风险的交易,该合约存在批量转账溢出漏洞,当合约实现批量转账功能时,容易在计算通证增加量时发生溢出漏洞,BUGX.IO安全团队经过研究分析发现,同类漏洞仍在以太坊里面部分存在。
FB客服
2018/07/31
6970
浅析AMR智能合约批量转账溢出漏洞
整形溢出概述
计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零,此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如tcp序号等),甚至是故意引入的(例如用作hash运算等)。
Al1ex
2021/03/21
1.4K0
整形溢出概述
第二十课 【ERC1155实践】欧阳询书法复制品从确权设计到买卖测试
【本文目标】 通过本文学习,了解以太坊ERC1155标准规范和ERC1155Mintable可增发智能合约函数功能,并通过一个有趣的故事完成功能测试。
辉哥
2018/08/22
1.3K1
第二十课 【ERC1155实践】欧阳询书法复制品从确权设计到买卖测试
整形溢出概述
计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零,此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如tcp序号等),甚至是故意引入的(例如用作hash运算等)。
Al1ex
2021/07/21
1.3K0
整形溢出概述
第二十二课 无多签硬件钱包,如何实现以太坊通证的多签合约?
【本文目标】 1) 了解目前辉哥调研的多签硬件钱包的现状; 2) 提供一个智能合约多签钱包的实现方案和测试结果;
辉哥
2018/09/26
1.5K0
一行代码蒸发了¥6,447,277,680 人民币!
在他发表完言论没多久,2月美链(BEC)上交易所会暴涨4000%,后又暴跌。尽管他多次否认,聪明的网友早已扒出,他与BEC千丝万缕的关系。
爬虫
2018/07/25
3390
一行代码蒸发了¥6,447,277,680 人民币!
美链BEC合约漏洞技术分析
这两天币圈链圈被美链BEC智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈。这篇文章就来分析下BEC智能合约的漏洞
Tiny熊
2018/07/23
4710
美链BEC合约漏洞技术分析
第十九课 代币锁仓后逐步释放的ERC20智能合约实践
【本文目标】 通过本文学习,可以实现区块链私募,基金会员工期权(代币)激励时锁仓一定时间,逐步释放的方法。
辉哥
2018/08/10
3.2K0
第十九课 代币锁仓后逐步释放的ERC20智能合约实践
【区块链安全】技术小白如何做到让一行代码值64亿元?
2018年4月24日,又一件突发性事件引爆了币圈!刚刚发行了才两个月的“美链 Beauty Chain” (简称BEC)在受到黑客的攻击的影响下直接归零了!黑客使用的是以太坊ERC-20智能合约BatchOverFlow数据溢出的漏洞,向两个地址转出了数量巨大的BEC代币!黑客先是试探性地往Okex中转100万的BEC,发现成功转入卖出后,又分两次转入了一千万的BEC。发现两次都成功,黑客变得更加大胆,便转入了一亿枚BEC。但这1亿枚 BEC转入后,OKEx已经发现问题并停止了BEC的交易。按照转入记录,预计黑客已经卖出了最少 1100万枚BEC,折合昨日售价约一千八百多万人民币。
辉哥
2018/08/10
9330
【区块链安全】技术小白如何做到让一行代码值64亿元?
浅谈以太坊智能合约的安全漏洞
智能合约的安全是区块链安全中的热议话题,但其实 89% 的智能合约都存在漏洞,本文将浅谈以太坊智能合约出现过的一些安全漏洞。
信安之路
2018/08/08
1.1K0
浅谈以太坊智能合约的安全漏洞
大话 美链 BEC 合约溢出漏洞
市值一度突破280亿美金“全球第一个基于区块链技术打造的美容生态链平台”BEC(Beauty Chain)在2018年4月22日遭到攻击者0x09a34e***ed5fe93c利用溢出漏洞缺陷。
星辉
2019/10/22
8690
大话 美链 BEC 合约溢出漏洞
智能合约:访问控制缺陷
访问控制缺陷是因为编写 solidity 智能合约的时候,对于某些判断的定义不严谨或者笔误,导致的某些敏感功能的访问验证被绕过问题。攻击者可以恶意使用某些敏感功能
yichen
2020/05/18
5190
以太坊智能合约审计 CheckList
在以太坊合约审计checkList中,我将以太坊合约审计中遇到的问题分为5大种,包括编码规范问题、设计缺陷问题、编码安全问题、编码设计问题、编码问题隐患。其中涵盖了超过29种会出现以太坊智能合约审计过程中遇到的问题。帮助智能合约的开发者和安全工作者快速入门智能合约安全。
Seebug漏洞平台
2018/12/13
1K0
以太坊蜜罐智能合约分析
作者:dawu&0x7F@知道创宇404区块链安全研究团队 时间:2018/06/26
Seebug漏洞平台
2018/07/26
1.4K0
以太坊蜜罐智能合约分析
以太坊蜜罐智能合约分析
在学习区块链相关知识的过程中,拜读过一篇很好的文章《The phenomenon of smart contract honeypots》,作者详细分析了他遇到的三种蜜罐智能合约,并将相关智能合约整理收集到Github项目smart-contract-honeypots。
Seebug漏洞平台
2018/07/12
1.2K0
使用Remix编译和部署以太坊智能合约
Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于编写智能合约。
笔阁
2018/09/04
1.6K0
使用Remix编译和部署以太坊智能合约
智能合约开发中13种最常见的漏洞
在智能合约开发过程中,确实存在多种类型的漏洞,这些漏洞可能导致资金损失、合约功能失效或被恶意利用。以下是智能合约开发中常见的漏洞类型:
终有链响
2024/07/29
6960
智能合约:Ethernaut题解(四)
题目声明了 Building 接口中的那个 isLastFloor 函数,我们可以自己编写
yichen
2020/05/24
9000
以太坊智能合约 Owner 相关 CVE 漏洞分析
最近学习了下以太坊的智能合约,而且也看到挺多厂家pr智能合约相关的漏洞,其中《ERC20智能合约整数溢出系列漏洞披露》文章中披露了6个CVE编号的漏洞,而这些漏洞都属于整型溢出漏洞范畴,其中5个漏洞均需要合约Owner才能触发利用。本文正是针对这些漏洞从合约代码及触发逻辑上做了详细分析,并提出了一些关于owner相关漏洞的思考。
Seebug漏洞平台
2018/07/12
7960
相关推荐
智能合约中常见的漏洞总结复现#技术创作101训练营#
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验