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 ...
随机推荐
- 11java基础继承
一. 继承相关 18.实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hry.test; public class Instrument { ...
- c语言描述的顺序表实现
//顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #defi ...
- LeetCode4.寻找两个有序数组的中位数 JavaScript
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- sqlServer2014安装说明(windows7 64位)
SqlServer2014安装说明(windows7 64位) 地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=42299 1, ...
- React Native 中组件的生命周期(转)
概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...
- flask笔记(一)
1.第一个flask项目 # 首先你要安装flask这个模块 pip install flask # 安装好了之后,直接新建一个py文件,开始写最简单的flask项目了 from flask impo ...
- ABAP术语-Logical Lock
Logical Lock 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/03/1088323.html Program logic that ...
- 一个BUG?Visual Studio 2017 C++编写交换两个整数
想用一句话搞定交换: int a = 2, b = 5; cout << "a = " << a << ", b = " & ...
- Co. - Apple - Apple ID
有些应用或游戏,在国内 App Store 没上架或者被下架了,但是其他国家或地区(如美国.香港和台湾等)的 App Store 却提供下载,这时我们需要登陆一个相应地区的 Apple ID 才可以下 ...
- 【shell脚本学习-2】
#!/bin/bash - #echo do you have exetuate this project \n printf "please input your passwd" ...