资讯专栏INFORMATION COLUMN

美链BEC合约漏洞技术分析

harriszh / 2146人阅读

摘要:本文首发于深入浅出区块链社区原文链接美链合约漏洞技术分析原文已更新,请读者前往原文阅读这两天币圈链圈被美链智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈。

本文首发于深入浅出区块链社区
原文链接:美链BEC合约漏洞技术分析原文已更新,请读者前往原文阅读

这两天币圈链圈被美链BEC智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈。这篇文章就来分析下BEC智能合约的漏洞

漏洞攻击交易

我们先来还原下攻击交易,这个交易可以在这个链接查询到。
我截图给大家看一下:

攻击者向两个账号转移57896044618...000.792003956564819968个BEC,相当于BEC凭空进行了一个巨大的增发,几乎导致BEC价格瞬间归零。
下面我们来分析下这个攻击过程。

合约漏洞分析

我们先来看看BEC智能合约的代码,
BEC在合约中加入一个批量转账的函数,它的实现如下:

function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) {
    uint cnt = _receivers.length;
    uint256 amount = uint256(cnt) * _value;
    require(cnt > 0 && cnt <= 20);
    require(_value > 0 && balances[msg.sender] >= amount);

    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;

这个函数的作用是,调用者传入若干个地址和转账金额,在经过一些条件检查之后,对msg.sender的余额进行减操作,对每一个对每一个传入的地址进行加操作,以实现BEC的转移。
问题出在 uint256 amount = uint256(cnt) * _value; 这句代码,当传入值_value过大时(接近uint256的取值范围的最大值),uint256 amount = uint256(cnt) * _value计算时会发生溢出,导致amount实际的值是一个非常小的数(此时amount不再是cnt * _value的实际值),amount很小,也使得后面对调用者余额校验可正常通过(即require(_value > 0 && balances[msg.sender] >= amount)语句通过)。

我们来结合实际攻击交易使用的参数来分析一下:

batchTransfer的参数_value值为16进制的800000000000000000000...,参数_receivers数组的大小为2,相乘之后刚好可超过uint256所能表示的整数大小上限,引发溢出问题amount实际的值为0,后面的转账操作实际上msg.sender的余额减0, 而对两个账号进行了加16进制的800000000000000000000...,最终的结果是相当于增发了2 * 16进制的800000000000000000000...

实际上对于这种整数溢出漏洞,最简单的方法是采用 SafeMath 数学计算库来避免。有趣的是BEC智能合约代码中,其实其他的都使用了SafeMath, 而关键的uint256 amount = uint256(cnt) * _value却没有使用。
心痛程序员,也心痛韭菜。这句代码改为uint256 amount = _value.mul(uint256(cnt));就可以防止溢出问题

所以在做加减乘除的时候请记得一定使用:SafeMath,代码在这里

溢出补充说明

溢出补充说明为小专栏订阅用户福利,小专栏的文章内介绍了什么时候会发生上溢,什么时候会发生下溢,并且给出了代码事例。
大家可请前往我的小专栏阅读。

☛ 深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

☛ 我的知识星球为各位解答区块链技术问题,欢迎加入讨论。

☛ 关注公众号“深入浅出区块链技术”第一时间获取区块链技术信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24094.html

相关文章

  • 区块链技术学习指引

    摘要:引言给迷失在如何学习区块链技术的同学一个指引,区块链技术是随比特币诞生,因此要搞明白区块链技术,应该先了解下比特币。但区块链技术不单应用于比特币,还有非常多的现实应用场景,想做区块链应用开发,可进一步阅读以太坊系列。 本文始发于深入浅出区块链社区, 原文:区块链技术学习指引 原文已更新,请读者前往原文阅读 本章的文章越来越多,本文是一个索引帖,方便找到自己感兴趣的文章,你也可以使用左侧...

    Cristic 评论0 收藏0
  • 区块链2018年度盘点

    摘要:加密数字货币价格巅峰,区块链成二线企业股价春药年月日,是区块链行业的高光时刻,整个加密数字货币市值亿美元,人民币近万亿元。直接原因是,当日,中网载线刚刚宣布与井通网络科技有限公司合作开展区块链产业。 加密数字货币价格巅峰,区块链成二线企业股价春药 2018 年 1 月 8 日,是区块链行业的高光时刻,整个加密数字货币市值 8139 亿美元,人民币近 6 万亿元。在 10 天之前,12 ...

    changfeng1050 评论0 收藏0
  • 一行代码蒸发了¥6,447,277,680 人民币!

    一行代码蒸发了¥6,447,277,680 人民币! 现在进入你还是先行者,最后观望者进场才是韭菜。 美图董事长蔡文胜曾在三点钟群,高调的说出了这句话,随即被大众疯传。 在他发表完言论没多久,2月美链(BEC)上交易所会暴涨4000%,后又暴跌。尽管他多次否认,聪明的网友早已扒出,他与BEC千丝万缕的关系。 showImg(https://segmentfault.com/img/remote/1...

    booster 评论0 收藏0
  • 使用php部署以太坊智能合约开发DAPP

    摘要:说明最近在做以太坊智能合约的开发,在使用做接口的时候遇到很多问题,记录下来当做参考。简单说下拍卖智能合约思路用户注册新用户自动注册一个账户地址发起拍卖最高者存在智能合约里拍卖结束获取合约中的最高者关闭合约 说明 最近在做以太坊智能合约DAPP的开发,在使用PHP做接口的时候遇到很多问题,记录下来当做参考。本文的操作环境为Mac,已经安装好truffle/ganache等开发需要的相关工...

    A Loity 评论0 收藏0
  • 2018先知白帽大会 | 议题解读

    摘要:摘要今年的先知白帽大会,与会者将能够亲身感受到非常多有趣的技术议题,如在国际赛事中屡夺佳绩的团队,其队长将亲临现场,分享穿针引线般的漏洞利用艺术。从数据视角探索安全威胁阿里云安全工程师议题解读本议题讨论了数据为安全人员思维方式带来的变化。 摘要: 今年的先知白帽大会,与会者将能够亲身感受到非常多有趣的技术议题,如HITCON在国际赛事中屡夺佳绩的CTF团队,其队长Orange将亲临现场...

    Hydrogen 评论0 收藏0

发表评论

0条评论

harriszh

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<