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]);

转载于:https://www.cnblogs.com/xiaocongcong888/p/9428050.html

AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程相关推荐

  1. android web3j 代币查询_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账

    wallet-eth-android wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账(bip39.bip32.bip44.web3j) 生成钱包地址 // 生成钱包地址 W ...

  2. BEC合约出现重大漏洞可无限生成代币,币安在寻求新一轮融资的消息为假 | 区块链日报

     [深圳发布首个区块链创投基金,首期规模5亿人民币] 深圳市首个区块链创投基金宣布正式启动.该基金是首支深圳天使母基金战略投资的区块链专项基金,基金首期规模为5亿人民币,其中深圳市天使投资引导基金 ...

  3. EOS绑定以太坊地址

    最近接EOS代币后有人告诉我说要先注册EOS地址,不然一年后会变成废币,网上搜了下教程不清楚.我用的私钥文件绑定,写一下: EOS的变态规定:eos众筹一年,这一年时间内 eos使用的是 ETH 上面 ...

  4. 以太坊地址算法php,以太坊ETH源码分析(1):地址生成过程

    一.生成一个以太坊钱包地址 通过以太坊命令行客户端geth可以很简单的获得一个以太坊地址,如下: ~/go/src/github.com/ethereum/go-ethereum/build/bin$ ...

  5. 以太坊地址和公钥_以太坊的私钥、公钥、地址、账户

    私钥.公钥.地址 以太坊的私钥.公钥.地址之间的关系是,随机生成私钥.根据私钥计算出公钥.根据公钥计算出地址. 私钥是256bit,相当于32字节:用16进制表示的话,就是64个字符. 私钥的生成,本 ...

  6. 以太坊地址和公钥_以太坊地址是什么

    以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化. 以太坊使用Secp256k1椭圆曲线得到私钥.公钥,比特币使用的也是 ...

  7. 《我学区块链》—— 十九、以太坊安全之 以太坊浏览器Mist漏洞

    十九.以太坊安全之 以太坊浏览器Mist漏洞 2017年12月15日,以太坊基金会发布消息显示,以太坊浏览器 Mist 有可能导致私钥被盗的风险,这一漏洞被定义为非常严重,所有版本的 Mist 都会受 ...

  8. 币图网以太坊开发实例_去中心化概念模型与架构设计

    IM 去中心化概念模型与架构设计 今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而 ...

  9. 以太坊地址和公钥_以太坊交易签名解析源码解读

    上篇文章<以太坊交易签名过程源码解析[1]>从源码角度分析了一个合约调用的的签名过程,签名后的交易发送到以太坊节点后,节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址),进而将交 ...

最新文章

  1. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:
  2. java 回收策略_Java堆回收策略
  3. maven学习(中)- 私服nexus搭建
  4. PHP redis秒杀返回结果,php结合redis实现高并发下的抢购、秒杀功能
  5. 解决Mac上VSCdoe断点失效问题
  6. 通过CSS修改checkbox样式(利用label的for属性进行焦点传递)
  7. F - 娜娜梦游仙境系列——多民族王国
  8. 使用Kubespray部署生产可用的Kubernetes集群(1.11.2)
  9. opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)
  10. 从云服务器上拷贝文件,从云服务器上拷贝文件
  11. Kubernetes控制器--副本集ReplicaSet
  12. 速修复!NSA 报告四个严重和高危 Exchange Server RCE 漏洞
  13. java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
  14. minitab怎么算西格玛水平_计算西格玛水平.ppt
  15. Verilog写一个对数计算模块Log2(x)
  16. ThinkPad X230 后没有了Break 以及 Pause键,网工们囧了?
  17. 极光短信验证码服务器,极光推送的短信验证使用
  18. Sencha Cmd包
  19. openwrt php 编译环境,openwrt基础编译教程
  20. 骁龙855+4800万像素+五大配件,魅族16s开售

热门文章

  1. bcc挖矿用什么_BCC对BTC挖矿有何影响?
  2. Swagger自动接口文档生成框架————springboot整合swagger总结
  3. stm32 I2C架构
  4. c语言使用指针在被调函数中改变主调函数的变量 地址运算符 间接运算符
  5. mysql java文件导入导出_MySQL文件导出和导入
  6. 华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...
  7. 根据工序画出aoe网_这些金刚网纱窗竟然含“毒”!选错就得病
  8. 1t硬盘怎么分区最好_win7系统硬盘怎么分区 win7系统硬盘分区步骤【介绍】
  9. 无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang
  10. 安卓 php环境 app,安卓系统lighttpd-php-mysql本地环境