AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
0x00 项目简述
Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本。Ammbr打算创建具有人工智能和智能合约功能的高通量区块链平台,在为无线宽带用户清除障碍的同时,确保无数接入基础架构所有者公平参与。自2017年9月1日起发售AMMBR代币。
0x01 漏洞详情
合约地址:
0x96c833e43488c986676e9f6b3b8781812629bbb5
合约代码地址:
https://etherscan.io/address/0x96c833e43488c986676e9f6b3b8781812629bbb5#code
合约类型:
ERC20(https://github.com/ethereum/EIPs/issues/20)
漏洞函数:multiTransfer
漏洞类型:整数溢出
漏洞危害:可导致增发任意数额的AMR代币至任意以太坊账户。
0x02 细节分析
代码201行在处理输入参数tokens数组累加的时候,没有使用SafeMath,使得攻击者有机会构造一次整数溢出,导致后续计算totalTokensToTransfer时值可以被攻击者篡改,最终导致绕过204行余额检查,转出巨额资产。
整数溢出的原理非常简单,原理如图所示,如果两个8位变量A和B按位相乘,结果超出8位,超出位将被丢弃,只保留后8位长度。该漏洞中的产生溢出的变量名为totalTokensToTransfer,该变量类型为uint,在Solidity中,uint长度为256位,所以只要累加超过2^256-1大小的数,将会导致整数溢出。
0x03 调试与POC
我们使用Remix调试代码,首先调用mint函数为自己的账户增加一点Token余额,这个函数必须合约创建者才能调用,为自己增加余额后。我们直接调用multiTransfer来触发漏洞。
POC如下:
["0xda12391a57b16510ac82384640a44ecbd43243db","0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"],["38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546646"]
参数1我们随意创建了三个地址,该地址用来接收被黑资产。
tokens参数使用的值:
38597363079105398474523661669562635951089994888546854679819194669304376546645
该值为2^256/3计算得出,由于不能整除,我们在最后一个参数加一,使得最终totalTokensToTransfer累加可等于2^256。由于uint256最大可容纳值为2^256-1,累加等于2^256使得totalTokensToTransfer被溢出超出1位,导致该数被攻击者置零。
点底部的Debug可以看到漏洞细节。我们可以看到走到这里totalTokensToTransfer变量由于整数溢出已经被冲成零。
然后继续往下走,走至return处,可以我们参数中的三个账户被充入了指定数额的资产。
0x04 修复建议
将201行使用SafeMath改为:
totalTokensToTransfer = totalTokensToTransfer.add(tokens[i]);
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程的更多相关文章
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- 科普贴 | 以太坊代币钱包MyEtherWallet使用教程,一步步教你玩转MEW
MyEtherWallet 是一个以太坊的网页钱包,使用非常简单,打开网页就可以使用,源代码开源,不会在服务器上存储用户的钱包信息如私钥和密码.支持 Ledger Wallet.TREZOR 等硬件钱 ...
- 一步步教你创建自己的数字货币(代币)进行ICO
本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...
- 如何创建和部署自己的EOS代币
本文我们将弄清楚什么是EOS代币以及如何自己创建和部署EOS代币. 与以太坊相反,EOS带有即插即用的代币智能合约.以太坊拥有ERC20智能合约,EOS拥有eosio.token智能合约.Eosio. ...
- 如何通过以太坊智能合约来进行众筹(ICO)
前面我们有两遍文章写了如何发行代币,今天我们讲一下如何使用代币来公开募资,即编写一个募资合约. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还 ...
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末
事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例
目录 目录 1.什么是 Mist 2.Mist 在哪里下载? 3.Mist 有哪些依赖? 4.如何安装 Mist? 4.1.安装 Mist 依赖工具包 4.2.安装 Mist 4.3.启动 Mist, ...
- 区块链入门到实战(19)之以太坊(Ethereum) – 以太币
以太币的作用:防范以太坊网络被滥用和激励矿工. 与比特币网络有比特币类似,以太坊(Ethereum)也有自己的虚拟币 — 以太币. 以太币的主要作用有2个: 应用程序执行任何操作都需要支付以太币,防范 ...
- 从比特币、以太坊、libra的不同特点认识move语言
关于比特币.以太坊.libra,我们知道他们是不同的区块链应用,那么他们的根本差别在哪里呢. 其实,单从白皮书的标题,就可以大概看出三个项目在设计目标上的差异. 比特币的目标是 -- 可编程货币(Pr ...
随机推荐
- ZLG zigbee 虚拟串口配置
一.设置网关工作模式: 在ZNetCom Utility工具中,将设置网关工作模式为 Real COM 模式 启动 ZNetCom Utility 搜索设备 获得设备信息 修改工作模式为:real c ...
- 阿里云服务器redis启动绑定ip 开放端口仍无法访问问题
今天使用云服务器其redis 始终无法访问.redis.conf 这个配置文件也是改了又改.最后发现 执行redis启动命令时没有带上配置文件.仍然使用默认配置. src/redis-server ...
- mix-blend-mode 混合模式 background-blend-mode 背景混合模式 isolation:isolate 隔离
css3 mix-blend-mode 混合模式 该属性不仅可以作用于HTML,还可以作用于SVG 兼容性: IE 8~11 Edge 12~14 Firefox 41~47 chrome 45~51 ...
- Java的内存--存储
0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制 Java 把内存划分成两种:一种是栈内 ...
- vue和react总结
一.总结一下Vue和React的区别 相同点: 1.都支持服务器端渲染 2.都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent ...
- JS中对象继承方式
JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...
- dcm4che 的依赖无法下载
遇到问题时我在Gradle这样引入 maven { url "http://www.dcm4che.org/maven2"} 这样使用可以解决问题 maven { url &quo ...
- Percona-Toolkit工具包之pt-archiver
Preface There's a common case that we neet to archive amount of records in some tables to a ...
- Graylog2日志服务安装配置
软件版本: mongodb-org-3.2.10 jdk-1.8.0 (推荐rpm包,不然要修改Graylog启动脚本定义的JAVA命令路径) elasticsearch-2.4.1 (Graylog ...
- 解决WordPress设置错误的url网站不能访问的问题
通过WordPress后台首选项更改了网站url地址之后,网站就会出现访问不了的情况,一般来说,网站后台也登陆不上去了,我从网上寻找到了四种方法,这四种方法前三种都是需要登陆到后台的,但实际上出错后, ...