首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块链安全研究:以太坊短地址攻击

摘要:针对这个漏洞,以太坊有不可推卸的责任,因为EVM并没有严格校验地址的位数,并且还擅自自动补充消失的位数,使得合约多发送很多代币出来。

作者:隐形人真忙

0x00 基础知识

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

一般ERC-20 TOKEN标准的代币都会实现transfer方法,这个方法在ERC-20标签中的定义为:

functiontransfer(address to, uint tokens)publicreturns (bool success);

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

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

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

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

000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca

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

0000000000000000000000000000000000000000000000000de0b6b3a7640000

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

a9059cbb000000000000000000000000abcabcabcabcabcabcabcabcabcabcabcabcabca0000000000000000000000000000000000000000000000000de0b6b3a7640000

0x01 以太坊短地址

当调用transfer方法提币时,如果允许用户输入了一个短地址,这里通常是交易所这里没有做处理,比如没有校验用户输入的地址长度是否合法。如果一个以太坊地址如下,注意到结尾为0:

0x1234567890123456789012345678901234567800

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

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

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

0x90b98a11

00000000000000000000000062bec9abe373123b9b635b75608f94eb8644163e

0000000000000000000000000000000000000000000000000000000000000002

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

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

0x90b98a11

00000000000000000000000062bec9abe373123b9b635b75608f94eb86441600

00000000000000000000000000000000000000000000000000000000000002

缺失1个字节

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

这样,amount就成了2

0x02 构造短地址攻击

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

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

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

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

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

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

(5)这三个参数会被传入到msg.data中,然后调用合约的transfer方法,此时,amount由于高位的1个字节被吃掉了,因此amount = amount

0x03 总结

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

Reference

https://blog.golemproject.net/how-to-find-10m-by-just-reading-blockchain-6ae9d39fcd95

http://vessenes.com/the-erc20-short-address-attack-explained/

https://ericrafaloff.com/analyzing-the-erc20-short-address-attack

币圈通讯社大号:微博关注@美链社

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180311A0RCAM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券