文档章节

区块链安全 - 以太坊短地址攻击

HiBlock
 HiBlock
发布于 2018/12/10 22:47
字数 987
阅读 10
收藏 0

image

1

基础知识

EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档:

https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI

一般ERC-20 TOKEN标准的代币都会实现transfer方法,这个方法在ERC-20标签中的定义为:function transfer(address to, uint tokens) public returns (bool success);

第一参数是发送代币的目的地址,第二个参数是发送token的数量。

当我们调用transfer函数向某个地址发送N个ERC-20代币的时候,交易的input数据分为3个部分:

4 字节,是方法名的哈希:a9059cbb

32字节,放以太坊地址,目前以太坊地址是20个字节,高危补0 000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca

32字节,是需要传输的代币数量,这里是1*10^18 GNT 0000000000000000000000000000000000000000000000000de0b6b3a7640000

所有这些加在一起就是交易数据:

a9059cbb000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca0000000000000000000000000000000000000000000000000de0b6b3a7640000

2

以太坊短地址

当调用transfer方法提币时,如果允许用户输入了一个短地址,这里通常是交易所这里没有做处理,比如没有校验用户输入的地址长度是否合法。

如果一个以太坊地址如下,注意到结尾为0:

0x1234567890123456789012345678901234567800

当我们将后面的00省略时,EVM会从下一个参数的高位拿到00来补充,这就会导致一些问题了。

这时,token数量参数其实就会少了1个字节,即token数量左移了一个字节,使得合约多发送很多代币出来。我们看个例子:

image

这里调用sendCoin方法时,传入的参数如下:

0x90b98a11 00000000000000000000000062bec9abe373123b9b635b75608f94eb8644163e 0000000000000000000000000000000000000000000000000000000000000002

这里的0x90b98a11是method的hash值,第二个是地址,第三个是amount参数。

如果我们调用sendCoin方法的时候,传入地址0x62bec9abe373123b9b635b75608f94eb8644163e,把这个地址的“3e”丢掉,即扔掉末尾的一个字节,参数就变成了:

0x90b98a11 00000000000000000000000062bec9abe373123b9b635b75608f94eb86441600 00000000000000000000000000000000000000000000000000000000000002                                                                                                                              ^^                                                             缺失1个字节

这里EVM把amount的高位的一个字节的0填充到了address部分,这样使得amount向左移位了1个字节,即向左移位8。

这样,amount就成了2 << 8 = 512。

3

构造短地址攻击

(1)首先生成一个ETH的靓号,这个账号末尾为2个0

使用一些跑号工具就可以做到,比如MyLinkToken工具,可以很轻易跑出末尾两个0的。

image

(2)找一个交易所钱包,该钱包里token数量为256000

(3)往这个钱包发送1000个币

(4)然后再从这个钱包中提出1000个币,当然这时候写地址的时候把最后两个0去掉

如果交易所并没有校验用户填入的以太坊地址,则EVM会把所有函数的参数一起打包,会把amount参数的高位1个字节吃掉。

(5)这三个参数会被传入到msg.data中,然后调用合约的transfer方法,此时,amount由于高位的1个字节被吃掉了,因此amount = amount << 8,即扩大了256倍,这样就把25600个币全部提出来了。

4

总结

针对这个漏洞,说实话以太坊有不可推卸的责任,因为EVM并没有严格校验地址的位数,并且还擅自自动补充消失的位数。此外,交易所在提币的时候,需要严格校验用户输入的地址,这样可以尽早在前端就禁止掉恶意的短地址。

Reference

内容来源:知道创宇

作者:隐形人真忙

image

本文转载自:https://mp.weixin.qq.com/s?__biz=MzA5NDAxNzIzNg==&mid=2450006844&idx=1&sn=d30920474040304c91ead72...

共有 人打赏支持
HiBlock
粉丝 14
博文 360
码字总数 481361
作品 0
私信 提问
暂停交易?ERC20合约整数溢出安全漏洞案例技术分析(一)

区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:吴寿鹤,《区块链开发实战——以太坊关键技术与案例分析》的第一作者,《区块链开发实战——Hyperledger Fab...

-区块链兄弟-
2018/04/27
0
0
这些数字精灵住在以太坊网络上,但是他们在Zilliqa网络上战斗

在我唯一的“精灵”升级到第四级之前,我的以太坊就用完了。 这就是我第一次玩Etheremon这个游戏的体验。这是一款建立在世界第二大区块链网络以太坊上的仿效Pokemon的游戏。我当时正好有相当...

Zilliqa爱好者中文社区
2018/09/25
0
0
【火线视点3】从ERC20漏洞事件看区块链安全生态建设

本报告由火币区块链研究院出品,报告发布时间2018年5月4日,作者:袁煜明、李慧 2018年4月23日BEC(美链)爆出ERC20协议安全漏洞,攻击者利用整数溢出BUG,可无限生成代币,直接导致BEC币值跳...

火币区块链研究院
2018/08/26
0
0
游戏skr而止,漏洞周而复始——游戏合约漏洞全面汇总

区块链游戏江山如画, 安全防护未规划, 一片残阳西挂。 区块链行业日新月异,发展迅猛,各个公链及项目方奇思妙想层出不穷。俗话说,玩是人的天性,将数字货币与游戏结合,运用游戏的机制吸...

HiBlock
2018/08/26
0
0
区块链精进手册 | 016 | 分叉是区块链进化的方式

1. 一种通证:ETC ETC 是以太坊原链/以太坊经典(Ethereum Classic)的通证,发行总量恒定,不会超过2.1亿枚,目前流通数量1亿余枚,市值超过17亿美元,排行第15。 从ETC(Ethereum Classic,...

马烈_Bodhi
2018/09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
今天
1
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
3
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部