欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

AMR智能合约漏洞分析

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本。Ammbr打算创建具有人工智能和智能合约功能的高通量区块链平台,在为无线宽带用户清除障碍的同时,确保无数接入基础架构所有者公平参与。自2017年9月1日起发售AMMBR代币。
0×01 漏洞详情
合约地址:
0x96c833e43488c986676e9f6b3b8781812629bbb5
合约代码地址:
https://etherscan.io/address/0x96c833e43488c986676e9f6b3b8781812629bbb5#code
合约类型:ERC20(https://github.com/ethereum/EIPs/issues/20)
漏洞函数:multiTransfer
漏洞类型:整数溢出
漏洞危害:可导致增发任意数额的AMR代币至任意以太坊账户。
0×02 细节分析

代码201行在处理输入参数tokens数组累加的时候,没有使用SafeMath,使得攻击者有机会构造一次整数溢出,导致后续计算totalTokensToTransfer时值可以被攻击者篡改,最终导致绕过204行余额检查,转出巨额资产。
整数溢出的原理非常简单,原理如图所示,如果两个8位变量A和B按位相乘,结果超出8位,超出位将被丢弃,只保留后8位长度。该漏洞中的产生溢出的变量名为totalTokensToTransfer,该变量类型为uint,在Solidity中,uint长度为256位,所以只要累加超过2^256-1大小的数,将会导致整数溢出。

0×03 调试与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处,可以我们参数中的三个账户被充入了指定数额的资产。

0×04修复建议
将201行使用SafeMath改为:
totalTokensToTransfer =totalTokensToTransfer.add(tokens[i]);
 

Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本。Ammbr打算创建具有人工智能和智能合约功能的高通量区块链平台,在为无线宽带用户清除障碍的同时,确保无数接入基础架构所有者公平参与。自2017年9月1日起发售AMMBR代币。
0×01 漏洞详情
合约地址:
0x96c833e43488c986676e9f6b3b8781812629bbb5
合约代码地址:
https://etherscan.io/address/0x96c833e43488c986676e9f6b3b8781812629bbb5#code
合约类型:ERC20(https://github.com/ethereum/EIPs/issues/20)
漏洞函数:multiTransfer
漏洞类型:整数溢出
漏洞危害:可导致增发任意数额的AMR代币至任意以太坊账户。
0×02 细节分析

代码201行在处理输入参数tokens数组累加的时候,没有使用SafeMath,使得攻击者有机会构造一次整数溢出,导致后续计算totalTokensToTransfer时值可以被攻击者篡改,最终导致绕过204行余额检查,转出巨额资产。

www.wnhack.com


整数溢出的原理非常简单,原理如图所示,如果两个8位变量A和B按位相乘,结果超出8位,超出位将被丢弃,只保留后8位长度。该漏洞中的产生溢出的变量名为totalTokensToTransfer,该变量类型为uint,在Solidity中,uint长度为256位,所以只要累加超过2^256-1大小的数,将会导致整数溢出。

0×03 调试与POC
我们使用Remix调试代码,首先调用mint函数为自己的账户增加一点Token余额,这个函数必须合约创建者才能调用,为自己增加余额后。我们直接调用multiTransfer来触发漏洞。
POC如下:
["0xda12391a57b16510ac82384640a44ecbd43243db","0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"],["38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546646"] www.wnhack.com
参数1我们随意创建了三个地址,该地址用来接收被黑资产。tokens参数使用的值38597363079105398474523661669562635951089994888546854679819194669304376546645,为2^256/3计算得出,由于不能整除,我们在最后一个参数加一,使得最终totalTokensToTransfer累加可等于2^256。由于uint256最大可容纳值为2^256-1,累加等于2^256使得totalTokensToTransfer被溢出超出1位,导致该数被攻击者置零。
点底部的Debug可以看到漏洞细节。我们可以看到走到这里totalTokensToTransfer变量由于整数溢出已经被冲成零。


然后继续往下走,走至return处,可以我们参数中的三个账户被充入了指定数额的资产。
www.wnhack.com

0×04修复建议
将201行使用SafeMath改为:
totalTokensToTransfer =totalTokensToTransfer.add(tokens[i]);
  无奈人生安全网

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。