以太坊潜伏多年令全球黑客为之疯狂的“偷渡”漏洞引发偷币狂潮

世界上有一群人,互联网对于他们来说就是提款机。

是的,过去是,现在更是,因为电子货币的出现,他们提款的速度变得更疯狂。

在2017年,我们的蜜罐监测到一起针对以太坊的全球大规模攻击事件,我们将其命名为以太坊“偷渡”漏洞。通过该漏洞,黑客可以在没有服务器权限、没有keystore密码权限的情况下,转走钱包中的所有余额。

而如此严重的漏洞,1年前就在reddit.com被曝光有黑客在利用,并且最早可追溯到2016年的2月14号就有黑客通过此漏洞窃取到比特币,近期也有中国的慢雾安全团队揭露了这种攻击手法:查看原文链接

在长达2年的时间里,并没有多少用户关注到,以太坊也没有进行针对性的防护措施,直到今日,以太坊的最新代码中依然没有能够抵御这种攻击。

因此我们决定将我们所掌握的详细数据公布给所有人,希望能促使以太坊的开发者承认并修复该漏洞。

漏洞成因

(以下的代码分析基于https://github.com/ethereum/go-ethereum的当前最新提交:commit b1917ac9a3cf4716460bd53a11db40384103e5e2)

以太坊目前最流行的节点程序(Geth/Parity )都提供了RPC API,用于对接矿池、钱包等其他第三方程序。

默认情况下,节点的RPC服务是无需密码就可以进行接口调用,官方实现的RPC API也并未提供设置RPC连接密码的功能,因此,一旦将RPC端口暴露在互联网,将会非常危险。

而我们所捕获的以太坊“偷渡”漏洞,正是利用了以太坊默认对RPC不做鉴权的设计。

被攻击的用户,需要具备以下条件:

1、节点的RPC端口对外开放 2、节点的RPC端口可直接调用API,未做额外的鉴权保护(如通过nginx等方式进行鉴权保护) 3、节点的区块高度已经同步到网络的最新高度,因为需要在该节点进行转账,如果未达到最高度,无法进行转账

当用户对自己的钱包进行了解锁(unlockAccount函数),在解锁超时期间,无需再输入密码,便可调用RPC API的eth_sendTransaction进行转账操作。

漏洞的关键组成,由未鉴权的RPC API服务及解锁账户后有一定的免密码时间相结合,以下是解锁账户的unlockAccount函数:

代码路径:go-ethereum/internal/jsre/deps/api.go

通过函数的实现代码可见,解锁账户的api允许传入超时时间,默认超时为300秒,

真正进行解锁的函数TimedUnlock实现如下:

代码路径:go-ethereum/accounts/keystore/keystore.go

当传入的超时大于0时,会发起一个协程进行超时处理,如果传入的超时时间为0,则是永久不会超时,账户一直处于解锁状态,直到节点进程退出。

攻击手法揭秘

1.寻找对外开放以太坊RPC端口的服务器,确认节点已经达到以太坊网络的最高区块高度

黑客通过全球的端口服务扫描,发现RPC服务为以太坊的RPC接口时,调用eth_getBlockByNumber(‘last’, false),获取最新的区块高度。

但是由于有些以太节点是以太坊的分叉币,高度与以太坊的不一样,因此黑客即使发现节点高度与以太坊的高度不一样,也不会放弃攻击。

2.调用eth_accounts,获取该节点上的所有账户。

eth_accounts的请求将返回一个账户地址列表:[0x1834axxxxxxxxxxxxxxxxxxxxxxxxxxx, 0xa13jkcxxxxxxxxxxxxxxxxxxxxxxxxxxx,…… ]

3.调用eth_getBalance,查询地址余额。

这个过程黑客可在自己的服务器完成以太坊的余额查询,因为以太坊的区块链账本数据库是随意公开获取的。

有部分黑客没有搭建以太坊的全节点,没有自行查询余额,因此也会在被攻击服务器进行eth_getBalance操作。

4.持续调用转账操作,直到刚好用户用密码解锁了钱包,完成非法转账操作的“偷渡”

黑客会构造eth_sendTransaction的转账操作,并填写余额、固定的手续费:

{“jsonrpc”:”2.0″,”id”:2,”method”:”eth_sendTransaction”,”params”:[{“from”:”受害者钱包地址1″,”gas”:”0x55f0″,”to”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”value”:”0x112345fc212345000″}]}

{“jsonrpc”:”2.0″,”id”:2,”method”:”eth_sendTransaction”,”params”:[{“from”:”受害者钱包地址2″,”gas”:”0x55f0″,”to”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”value”:”0x112345fc212345000″}]}

{“jsonrpc”:”2.0″,”id”:2,”method”:”eth_sendTransaction”,”params”:[{“from”:”受害者钱包地址3″,”gas”:”0x55f0″,”to”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”value”:”0x112345fc212345000″}]}

其中的value的单位是以太的最小单位:wei,计算为以太的话需要除10的18次方:

>>> 0x112345fc212345000

19758522752314920960L

>>> 19758522752314920960L/1000000000000000000

19L

用户使用钱包,输入密码解锁了钱包,此时钱包余额会立即被转走。

快速漏洞测试

安装python的web3库,然后连接RPC端口,发起请求,如果获取到返回结果,便可能存在该漏洞。

参考:http://web3py.readthedocs.io/en/stable/quickstart.html

from web3 import Web3, HTTPProvider, IPCProvider

web3 = Web3(HTTPProvider(‘http://ip:port’))

web3.eth.blockNumber

黑客解密及IOCs情报

黑客钱包

目前我们掌握了3个黑客的钱包收款地址,未转走的账户余额为2220万美金:

https://etherscan.io/address/0x957cD4Ff9b3894FC78b5134A8DC72b032fFbC464,余额为38,076 ETH(未统计erc20 token),最早进账为2016-2-14,最新进账为2018-3-21(当前还在持续入账)

https://etherscan.io/address/0x96a5296eb1d8f8098d35f300659c95f7d6362d15,余额为321 ETH(未统计erc20 token),最早进账为2016-8-10,最新进账为2017-11-28。

https://etherscan.io/address/0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6,余额为330 ETH(未统计erc20 token),最早进账为2018-2-06,最新进账为2018-3-20。

黑客攻击源IP
146.0.249.87(德国黑森州法兰克福) 162.251.61.133(加拿大) 190.2.133.114(库拉索) 85.14.240.84(德国北莱茵)

目前大部分的黑客使用https://github.com/regcostajr/go-web3进行频繁API请求,如果有看到大量user-agent为“Go-http-client/1.1”的POST请求时,请记录下请求内容,确认是否为恶意行为。

紧急响应及修复建议

1,、关闭对外暴露的RPC端口,如果必须暴露在互联网,请使用鉴权:https://tokenmarket.net/blog/protecting-ethereum-json-rpc-api-with-password/ 2、借助防火墙等网络防护软件,封堵黑客攻击源IP 3、检查RPC日志、web接口日志,是否有异常大量的频繁请求,检查请求内容是否为eth_sendTransaction 4、等待以太坊更新最新代码,使用修复了该漏洞的节点程序

作者:Hydra@BLOCKCHAIN SECURITY LAB

原文发布于微信公众号 - 区块链领域(Blockchain-Field)

原文发表时间:2018-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

RChain的跨分片交易算法

19720
来自专栏区块链大本营

10岁小表妹也能“吃透”Geth 客户端 !360秒,快速部署 ICO Token

接下来,你可以输入 geth –help 来检查 Geth 是否已安装成功。如果此时显示出一些帮助信息,你就可以进行下一步,创建一个新账户。

9930
来自专栏网站漏洞修补

网站漏洞修补针对区块链网站安全分析

目前移动互联网中,区块链的网站越来越多,在区块链安全上,很多都存在着网站漏洞,区块链的充值以及提现,会员账号的存储性XSS窃取漏洞,账号安全,等等关于这些区块链...

11140
来自专栏区块链领域

OneLedger最简可行产品(MVP)公告

本文中,我们会展示OneLedger MVP的演示视频。在视频中,我们展示了如何设置和初始化OneLedger本地测试网,注册身份并在我们的区块链上发布交易。

12030
来自专栏CDA数据分析师

你的第一个智能合约「Hello World」,好像也不是很智能

在看过 我花了 99 个以太坊(Ethereum)来学智能合约开发(http://davidfnck.com/blockchain/ethereum-smart...

15320
来自专栏申龙斌的程序人生

Bitcoin Core钱包常用的命令行参数

对于踏入币圈的朋友,我一直强烈建议要学习Bitcoin Core钱包软件,因为BitcoinCore这款全节点钱包是中本聪(比特币的发明人)最早实现的,虽然下载...

25520
来自专栏区块链技术指北

区块链钱包开发

文/温国兵 本文由币乎社区(bihu.com)内容支持计划奖励。 这是「区块链技术指北」的第 21 篇文章。 如果对我感兴趣,想和我交流,我的微信号:Wenta...

1K80
来自专栏Netkiller

以太坊·Rinkeby 测试网络

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

66990
来自专栏FreeBuf

SSH僵尸主机挖矿木马预警

XMR(门罗币)是目前比特币等电子货币的一种,以其匿名性,支持CPU挖矿,以及不菲的价格等特点,得到了“黑产”的青睐。瀚思科技挖掘出黑产利用互联网服务器进行挖矿...

31690
来自专栏区块链大本营

千万别惹牛人!小哥被盗22元后,整出了这篇以太坊钱包安全攻略,黑客看完得哭了...

对于区块链动辄几十万行的代码量,安全漏洞时不时就冒出来。敏锐的黑客们,虎视眈眈地盯着漏洞的闸门,一旦看见开闸,便以迅雷不及掩耳的速度展开偷袭。

12920

扫码关注云+社区

领取腾讯云代金券