Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Microsoft Azure 以太坊节点自动化部署方案漏洞分析

Microsoft Azure 以太坊节点自动化部署方案漏洞分析

作者头像
Seebug漏洞平台
发布于 2018-07-26 03:09:28
发布于 2018-07-26 03:09:28
6080
举报
文章被收录于专栏:Seebug漏洞平台Seebug漏洞平台

作者:sunsama@知道创宇404区块链安全研究团队 时间:2018/07/10

一、背景介绍

为了迎合以太坊区块链[1]发展需求,Microsoft Azure[2]早在2016年9月九推出了以太坊节点走自动部署的模块。部署情况如下:

登陆Microsoft Azure:

部署Ethereum Proof-of-Work Consortium

访问建立的“ADMIN-SITE”可以看到一个“Blockchain Admin”界面:

我们注意到这个管理接口提供了一个“转账”功能并且整个页面缺少鉴权机制任何人都可以访问,这样就导致恶意攻击者可以通过该接口提交钱包地址和转账数量进行转账。

Web3.js 是⼀个兼容了以太坊核心功能的JavaScript库[3],很多以太坊客户端及DApp都是通过调用Web3.js的API接⼝来实现。 以太坊客户端开发库主要是提供了两种类型的API接口:RPC(Remote Procedure Call)及IPC(Inter-process Communications),在以往的攻击事件里很多关注点都在RPC接口上,而很少关注IPC接口,在本文的涉及“Blockchain Admin”的问题就发生在IPC接口上,由此下面做了详细的代码分析

二、代码分析

在分析之前我们先介绍下PRC及IPC接口区别:

IPC与RPC简介

IPC(Inter-process Communications)进程间通信,是指在不同进程之间传播或交换信息,IPC的方式通常有管道、消息队列、信号量、共享存储、Socket、Stream等。对于geth来说IPC的方式更为高效,在安装geth之后 IPC socket不会自动创建,并且他也不是一个永久的资源,只有在启动geth时才会创建一个IPC Socket。

有以下几个参数可以在启动geth时配置IPC相关服务,其他参数可以使用geth —help查看。

--ipcdisable Disable the IPC-RPC server --ipcapi "admin,eth,debug,miner,net,shh,txpool,personal,web3" API's offered over the IPC-RPC interface --ipcpath "geth.ipc" Filename for IPC socket/pipe within the datadir (explicit paths escape it)

在geth启动时使用 --ipcpath来指定一个IPC路径,会有一段信息指明IPC的相关信息。例如

IPC endpoint opened: /Users/username/Library/Ethereum/geth.ipc

Web3.js中提供了使用IPC通信的方法。

// Using the IPC provider in node.js var net = require('net'); var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path // or var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os path // on windows the path is: "\\\\.\\pipe\\geth.ipc" // on linux the path is: "/users/myuser/.ethereum/geth.ipc"

node_modules/web3/lib/web3/ipcprovider.js

var IpcProvider = function (path, net) { var _this = this; this.responseCallbacks = {}; this.path = path; this.connection = net.connect({path: this.path}); ............... };

https://github.com/ethereum/go-ethereum/wiki/Management-APIs 中给出了在命令行使用IPC的例子

RPC(Remote Procedure Call)远程过程调用,指通过网络从远程计算机的程序上请求服务。geth为RPC提供了两种方法,分别是HTTP JSON RPC API(默认8545端口)和WebSocket JSON RPC API(默认8546端口)。

在命令行中可以使用以下参数配置RPC服务。

--rpc 启用HTTP-RPC服务器 --rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”) --rpcport value HTTP-RPC服务器监听端口(默认值:8545) --rpcapi value 基于HTTP-RPC接口提供的API WebSocket --ws 启用WS-RPC服务器 --wsaddr value WS-RPC服务器监听接口地址(默认值:“localhost”) --wsport value WS-RPC服务器监听端口(默认值:8546) --wsapi value 基于WS-RPC的接口提供的API --wsorigins value websockets请求允许的源

同样的在Web3.js中也提供了使用RPC的方法。

Http Api var Web3 = require('web3'); var web3 = new Web3('http://localhost:8545'); // or var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); WebSocket Api // change provider web3.setProvider('ws://localhost:8546'); // or web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546'));

/** * HttpProvider should be used to send rpc calls over http */ var HttpProvider = function (host, timeout) { this.host = host || 'http://localhost:8545'; this.timeout = timeout || 0; };

以太坊黑色情人节事件中,攻击者就是利用了RPC接口进行恶意转账。

流程分析

我们在Blockchain Admin页面的两个输入框中输入转账地址和转账数量并提交。

/home/ethtest/etheradmin/app.js定义了提交后服务器处理的方法。

命令行中的参数 var listenPort = process.argv[2] var gethIPCPath = process.argv[3]; var coinbase = process.argv[4]; var coinbasePw = process.argv[5]; var consortiumId = process.argv[6]; var registrarHostEndpoint = process.argv[7]; var registrarConnectionString = process.argv[8]; var registrarDatatbaseId = process.argv[9]; var registrarCollectionId = process.argv[10]; 定义了使用IPC服务 var web3IPC = new Web3(new Web3.providers.IpcProvider(gethIPCPath, require('net'))); ·············· app.post('/', function(req, res) { var address = req.body.etherAddress;//转账地址 var amount = req.body.amount;//转账数量 if(web3IPC.isAddress(address)) { //如果提交的地址是以太坊地址则解锁账号 web3IPC.personal.unlockAccount(coinbase, coinbasePw, function(err, res) { console.log(res); //通过ipc方法发送一笔交易 web3IPC.eth.sendTransaction({from: coinbase, to: address, value: web3IPC.toWei(amount, 'ether')}, function(err, res){ console.log(address)}); }); req.session.isSent = true; } else { req.session.error = "Not a valid Ethereum address"; } res.redirect('/'); });

使用POST方法提交后,会判断我们输入的地址是否是合法的以太坊地址。默认情况下我们的账号是处于锁定状态的,这里判断地址正确后使用personl.unlockAccount()方法解锁账号。该方法需要的参数coinbase和coinbasePw在启动服务时已经在命令行中作为参数传递过来了,使用ps命令查看该服务的进程。

其中f9cdc590071d9993b198b08694e5edf376979ce6是我们的钱包地址,123qweasdZXC是解锁钱包需要的密码,/home/ethtest/.ethereum/geth.ipc是getIPCPath参数的内容。

personal.js中的unlockAccount方法。

var unlockAccount = new Method({ name: 'unlockAccount', call: 'personal_unlockAccount', params: 3, inputFormatter: [formatters.inputAddressFormatter, null, null] });

IpcProvider.js中对发送方法的定义。

IpcProvider.prototype.send = function (payload) { if(this.connection.writeSync) { var result; // try reconnect, when connection is gone if(!this.connection.writable) this.connection.connect({path: this.path}); var data = this.connection.writeSync(JSON.stringify(payload)); try { result = JSON.parse(data); } catch(e) { throw errors.InvalidResponse(data); } return result; } else { throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.'); } };

ipcprovider会调用JSONRPC.js将unlockAccount方法中的参数格式化为JSON格式。

在node_modules/web3/lib/web3/ipcprovider.js中下断点跟踪一下数据流

然后将数据通过socket写入。

接下来geth通过IPC接收到了请求的方法和参数,然后使用UnlockAccount函数进行账户解锁,解锁账户后使⽤eth.sendTransaction⽅法发送交易。

sendTransaction方法会使用已经解锁后的本地账户的私钥进行签名,并使用SignedTransaction方法进行发送签名后的交易。

我们通过geth日志获取交易hash,在console中查看详细信息。

  • 下面是从提交交易请求到生成交易并发送的流程图。

值得一提的是:在我们分析过程发现通过Microsoft Azure提供的以太坊节点自动化部署方案仍然使用的1.7.3版本的geth ⽽这个版本里UnlockAccount函数:

func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) { const max = uint64(time.Duration(math.MaxInt64) / time.Second) var d time.Duration if duration == nil { d = 300 * time.Second } else if *duration > max { return false, errors.New("unlock duration too large") } else { d = time.Duration(*duration) * time.Second } err := fetchKeystore(s.am).TimedUnlock(accounts.Account{Address: addr}, password, d) return err == nil, err }

wiki中对personal_unlockAccount方法的定义:

从keystore中解锁账户并获得私钥,并把已经解锁的私钥放到内存中。解锁账户的api允许传入超时时间,默认超时为300秒,如果传⼊入的超时时间为0,则是永久不不会超时,账户⼀直处于解锁状态,直到节点进程退出。这也是“以太坊【偷渡】漏洞事件[5]”发生的主要原因。

三、风险评估

在以往的关于以太坊攻击案例里更多的是发生在暴露在互联网的RPC接口上,⽽基于本地进程通讯的IPC接口 被认为是相对安全可靠的,但是如果类似于Microsoft Azure提供的以太坊节点⾃动化部署⽅案里 的“Blockchain Admin”基于IPC调⽤程序,本身没有任何认证直接暴露在互联网上无疑是巨大的安全风险。(注:通过ZoomEye⽹路空间搜索引擎[7]可以看到曾经暴露在互联网上的目标。)

在实际测试分析过程发现使用Microsoft Azure提供的以太坊节点自动化部署方案更多的是联盟链或私有链,部署共有链的情况较少,所以这个安全事件实际可能给共有链的带来的影响相对不大。对于联盟链或私有链的影响需要根据其本身的情况去衡量量评估。

四、报告流程

针对以上问题我们第一时间联系了微软:

  • 2018年5月21日 相关问题描叙报告给MSRC邮件 secure@microsoft.com
  • 2018年5月22日 收到MSRC邮件反馈并按要求补充了相关技术细节
  • 2018年5月24日 收到MSRC Case分配确认邮件
  • 2018年5月31日 收到MSRC关于ZoomEye搜索引擎相关细节询问并反馈
  • 2018年7月6日 邮件MSRC追问相关问题修复进展
  • 2018年7月10日 收到MSRC反馈邮件称:他们认为这个是设计考虑的问题,用户可以选择对管理页面进行限制,另外升级了Geth版本

五、总结

区块链虚拟货币安全事件频发,安全刻不不容。通过这次的案例可以得几点建议:

  • 尽量避免使用这种自动化部署区块链应用的方案,如果必须使用的话,请仔细查看该方案使用的程序是否存在安全缺陷与漏洞。
  • 修改默认端口,关闭对外的高权限接口,如果必须暴露在互联网,请对接口进行鉴权。
  • 关注官方发布的更新日志,及时更新代码。

参 考 链 接

[1] https://baike.baidu.com/item/%E4%BB%A5%E5%A4%AA%E5%9D%8A/20865117?fr=aladdin [2] https://azure.microsoft.com/en-us/ [3] https://github.com/ethereum/web3.js/ [4] https://github.com/ethereum/go-ethereum/wiki/Management-APIs [5] https://paper.seebug.org/547/ [6] https://mp.weixin.qq.com/s/Kk2lsoQ1679Gda56Ec-zJg [7] https://www.zoomeye.org/searchResult?q=%22Blockchain%20Admin%22

往 期 热 门

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Seebug漏洞平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Microsoft Azure 以太坊节点自动化部署方案漏洞分析
为了迎合以太坊区块链1发展需求,Microsoft Azure2早在2016年9月九推出了以太坊节点走自动部署的模块。部署情况如下:
Seebug漏洞平台
2018/07/12
1.1K0
python通过web3py链接以太坊区块链节点的几种方式
通信服务提供接口是web3如何与区块链交互的关键。接口接受JSON-RPC请求并返回响应。这通常通过将请求提交给基于HTTP或IPC套接字的服务器来完成。
笔阁
2018/10/25
2.9K0
区块链与以太坊实战(5):访问以太坊节点的N中方式
本文主要介绍用web3.js访问以太坊节点的几种方式,主要包括HTTP和Web两种访问方式。
蒙娜丽宁
2020/07/15
2.4K0
从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络
使用此博文进行安装配置:https://blog.csdn.net/w88193363/article/details/79402074
墨文
2020/02/28
1.7K0
从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络
​【刘文彬】以太坊RPC机制与API实例
原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/eth-rpc.html
圆方圆学院
2018/12/24
1.9K0
区块链开发(三)以太坊客户端命令行选项汇总
本篇博客的内容可通过以下命令在客户端中进行查看: geth --help 也可以访问github上的wiki文档查看,地址为: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options 具体内容 NAME: geth - go-ethereum命令行接口 USAGE: geth [options] command [command options] [arguments...] VERSION: 1.4.11-s
程序新视界
2022/05/06
4710
以太坊搭建私有链
在以太坊上部署智能合约、发起交易需要花费以太币。而私链和公有链没有关系,不用同步大量的数据,也不用花钱购买以太币,可以很好的满足智能合约的开发和测试要求,而且在私有链上开发的智能合约可以很容易的部署到以太坊的公有链上。
foochane
2019/05/23
1.7K0
探路以太坊
关键字:以太坊,加密货币,crowdsale,geth,console,web3.js 以太坊简介 一句话简介:以太坊是一个基于功能齐全的编程语言构建的众多去中心化区块链应用的平台。 下面来解读一下这句话: 平台:首先以太坊是一个平台,这个平台上面有很多应用。 应用:这些应用是是去中心化的,基于区块链技术。所以这些应用可以实现永不停歇,因为它是分布式的,去中心化的,基于P2P网络的,这些应用被管理在以太坊钱包上面。 钱包:以太坊钱包,本质上以太坊钱包也是其中一个应用,它是一个网关,可以管理所有基
文彬
2018/05/03
1.8K0
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
2010年,Laszlo 使用 10000 个比特币购买了两张价值25美元的披萨被认为是比特币在现实世界中的第一笔交易。
Seebug漏洞平台
2018/08/16
1.2K0
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
以太坊潜伏多年令全球黑客为之疯狂的“偷渡”漏洞引发偷币狂潮
世界上有一群人,互联网对于他们来说就是提款机。 是的,过去是,现在更是,因为电子货币的出现,他们提款的速度变得更疯狂。 在2017年,我们的蜜罐监测到一起针对以太坊的全球大规模攻击事件,我们将其命名为以太坊“偷渡”漏洞。通过该漏洞,黑客可以在没有服务器权限、没有keystore密码权限的情况下,转走钱包中的所有余额。 而如此严重的漏洞,1年前就在reddit.com被曝光有黑客在利用,并且最早可追溯到2016年的2月14号就有黑客通过此漏洞窃取到比特币,近期也有中国的慢雾安全团队揭露了这种攻击手法:查看原文
区块链领域
2018/04/17
1.1K0
以太坊潜伏多年令全球黑客为之疯狂的“偷渡”漏洞引发偷币狂潮
以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。 如果你还不知道geth是什么,请先阅读入门篇:以太坊是什么。 以下开始正文。 命令用法 geth [选项] 命令 [命令选项] [参数…] 版本: 1.7.3-stable 命令: account 管理账户 attach 启动交互式JavaSc
Tiny熊
2018/06/21
2.4K0
以太坊系节点RPC端口开放被攻击的网络安全配置
以太坊支持RPC模式,以太坊账户开启这种模式后,就可以自动化完成某些操作,比如矿池挖出币之后自动向钱包转账。攻击者主要利用RPC开放端口,所以只要限制RPC端口就可以做到防护。
玖柒的小窝
2021/10/25
1.3K0
Solidity开发智能合约
以太坊的实用程序功能集合,如ethereumjs-util和ethereumjs-tx,github:
JavaEdge
2024/07/28
1560
Solidity开发智能合约
以太坊·单机多实例演示
摘要: 这是一篇演示如何使用一台服务器,运行多个以太坊客户端,并且将节点互联,完成两个节点之间的转账操作。
netkiller old
2018/02/22
1.6K1
第十三课 如何在DAPP应用实现自带钱包转账功能?
区块链是一个伟大的发明,它改变了生产关系。很多生态,有了区块链技术,可以由全公司员工的"全员合伙人"变成了全平台的”全体合伙人”了,是真正的共享经济模式。
辉哥
2018/08/10
1.8K0
第十三课 如何在DAPP应用实现自带钱包转账功能?
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
web3.js内部使用JSONRPC与geth通信。它把所有JSON-RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swarm相关的API。
前端修罗场
2023/10/07
1.1K0
搭建以太坊私有链
区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术
Al1ex
2023/09/07
1.5K1
搭建以太坊私有链
以太坊私链入门
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/02/02
5.1K2
以太坊环境搭建
以太坊作为一个开源的区块链平台,已经在区块链领域中占有重要地位,对于想要了解和使用以太坊的人来说搭建一个以太坊开发环境是必不可少的步骤,本文将介绍如何搭建以太坊开发环境帮助读者更好地理解以太坊的工作原理和开发流程
Al1ex
2023/08/10
5190
以太坊环境搭建
2019-03-14 通过rpc发布和调用以太坊合约
参考2018-11-22 Debug以太坊go-ethereum实战 启动geth,并attach一个geth执行创建账户的命令:
oracle3
2022/05/13
4460
推荐阅读
相关推荐
Microsoft Azure 以太坊节点自动化部署方案漏洞分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档