1. 首页
  2. 区块链英文

Electron-based桌面钱包远程代码执行漏洞分析

Electron-based桌面钱包远程代码执行漏洞分析

CertiK平安团队在Symbol桌面钱包中发现了一个远程执行代码破绽,并将该破绽提交到了Symbol破绽赏金设计。Symbol对CertiK提交的讲述异常重视,马上采取了平安解决措施,并实时更新了代码。现在该问题已在v0.9.11版本中获得修复。

HackerOne讲述现在尚未公然,但在征得了Symbol的允许后,本文将公然于此分享此次事宜。在此,CertiK对Symbol提供的赏金奖励,以及对公然分享破绽发现的允许示意感谢。

Electron-based桌面钱包远程代码执行漏洞分析

Symbol wallet是一个基于Electron的桌面应用程序,此次发现的破绽与Electron设置有关。Electron是不是听起来很耳熟?但它可不是你在物理化学课上学到的谁人电子。在睁开破绽剖析之前,不妨先来看看本文中的Electron是什么,在平安层面有什么值得注重的事项。

Electron是什么

Electron是由GitHub开发和维护的开源软件框架,它允许开发职员使用HTML,CSS和Javascript等网络技术来构建跨平台的桌面应用程序。

Electron通过将Chromium引擎和Node.js组合到一起来实现这一目的。一些着名的Electron应用程序包罗Atom编辑器,VisualStudio Code和Slack等。

使用Electron的优点:

  • Web开发职员可以使用主要的Javascript框架库(包罗Angular,React和Vue)构建能在差别操作系统上运行的跨平台桌面应用程序。此历程无需再破费时间学习新的编程语言。

  • 调试基于Electron的应用程序比调试传统的桌面应用程序容易。Chromium中的DevTools扩展允许开发职员使用和Web应用程序相同的方式调试其基于Electron的应用程序。

Electron的平安性以及Node.js的危险性

基于Electron的应用程序本质上是一个Web应用程序,因此它包罗常见的Web破绽,例如跨站点剧本(XSS)、Sql注入、身份验证和授权破绽。

Electron提供许多辅助桌面应用程序开发的API,此外,它还可以使用Node.js模块。

Node.js允许基于Electron的应用支持比在Web浏览器中运行的Web应用更多的功效。然则,启用Node.js会带来一定的平安风险。若是攻击者可以找到在应用程序中注入JavaScript,就可以在目的的盘算机上执行系统下令。

若是想要检查Electron应用程序是否在启用了Node.js,用户可以在开发控制台中发送模块导入功效“require”。在macOS中,控制台可以通过同时按“option + command + i”打开。

若是Node.js未被启动,控制台将返回错误新闻 “require is not defined”:

Electron-based桌面钱包远程代码执行漏洞分析

若是Node.js被启用,控制台将返回”require”的相关信息:

Electron-based桌面钱包远程代码执行漏洞分析

在开发控制台中发送以下下令,就能在macOS中弹出盘算器:

require(‘child_process’).exec(‘/System/Applications/Calculator.app/Contents/MacOS/Calculator’)

Electron-based桌面钱包远程代码执行漏洞分析

为了减轻由于注入JavaScript而引起的远程代码执行的风险,从版本5.0.0最先,Electron默认禁用了程序对Node.js模块的接见。开发职员可以通过在设置文件中将“nodeIntegration”设置为true来启用对Node.js模块的使用,从平安角度来说并不推荐。

值得注重的是在2018年,Electron被发现有一个严重破绽可被攻击者行使来接见Node.js模块,纵然在设置中已经被克制。参考文献1也对此进行了详细说明,因此在开发时请务必使用最新版本的Electron。

Symbol Wallet远程执行代码破绽演示

在领会了基于Electron的应用程序相关特征之后,现在可以深入探讨在Symbol桌面钱包中发现的破绽。

Symbol桌面钱包是开源的,可以在其Github(参考文献2)中找到该应用的源代码。build.js(参考文献3)是其应用程序的Electron构建设置文件。下面这段Build.js中的代码检查程序是否在“darwin”(macOS)上运行。若是不是,app.on将使用“createWindow”函数建立浏览器窗口。

….code…  

if (process.platform === ‘darwin’) { 

    app.on(‘ready’,createMac) 

  } else { 

    app.on(‘ready’,createWindow) 

 

….code… 

在“createwindow”函数中,函数内部的“ windowOptions”变量包罗浏览器窗口设置选项。注重,红色部门显示的行将“nodeIntegration”变量设置为true,这示意此应用程序启用了Node.js。

…code… 

function createWindow(){      

    const windowOptions = {   

      minWidth: width,   

      minHeight: height,   

      width: width,   

      height: height,   

      title: app.getName(),   

      titleBarStyle: ‘hiddenInset’,   

      webPreferences: {   

        nodeIntegration: true,    

      },   

      resizable: true,   

    }   

….code…   

PayPal或将推动比特币成为主流支付方式

上月传出消息,支付巨头PayPal正在考虑在其平台上支持加密资产。

    mainWindow= newBrowserWindow(windowOptions) 

}   

凭据build.js设置文件,可以领会到若是此应用在Windows操作系统上运行,Node.js将被启用。为了行使启用的Node.js,攻击者需要在应用程序中注入随便的JavaScript。攻击者一样平常可以通过行使XSS(跨站点剧本)破绽或者在当前Electron窗口中加载任何包罗攻击者注入的JavaScript的网站来实现攻击。

Symbol桌面钱包(v9.7版)提供了浏览“新闻”的功效,只要用户点击新闻中的链接,应用程序便会从钱包窗口加载外部网站(图中展示的是Github)。

Electron-based桌面钱包远程代码执行漏洞分析

那么破绽又是若何被行使的呢?

为了演示该破绽行使的流程,技术职员在小我私家网站上托管了以下代码段。在Github上可以很容易的放置指向其网站的URL。当“nodeIntegration”设置为true并启用Node.js,在“child_process”模块的辅助下可以将随便的JavaScript执行升级为远程代码执行。

用户接见包罗payload的页面,并点击页面里的“Close”按钮后,用户的盘算机上将弹出盘算器。在目的系统中弹出盘算器是证实乐成行使代码执行破绽的一种方式。

Proof-of-Concept(视频位于页首):

<!DOCTYPEhtml> 

 

<h1>click me</h1> 

<button type=”button” onClick=”rce_calc()”>Submit</button> 

<script> 

functionrce_calc(){ 

const{ exec } = require(‘child_process’); 

exec(‘calc’); 

}  

</script> 

Symbol在修复中将“nodeIntegration”设置为false,克制了JavaScript对Node.js模块的接见。此更改已经反映在了他们当前的build.js(参考文献4)文件中。他们还更新了“新闻”功效,住手了将远程网站加载到Electron窗口中的行为。

探索基于Electron的加密钱币钱包

做为平安研究员,当在一个程序中发现破绽,我们总会实验去探索此类破绽是否在其余应用中存在。通过互联网搜索,CertiK平安团队发现了另一个基于Electron的加密钱币钱包: MyCrypto。在测试时,技术职员发现MyCrypto将“nodeintegration”设置为true,并启用了Node.js。虽然没有找到攻击此设置的设施。然则我们不应该给攻击者将“self-xss”转化为下令代码执行的机遇。

CertiK旨在为加密社区的平安做出孝敬,并辅助企业珍爱用户资产。技术职员在对方的Github 堆栈中提交了Issue。

MyCrypto十分重视,并回复该破绽将在下一版本中修复。

重点提醒

Electron自己是异常优异的软件框架,但开发职员要注重不要由于设置错误而使程序暴露在危险之中。在产品中使用新技术时要小心,要保持郑重并领会潜在的平安风险。这里CertiK平安团队总结了几个要点来提高基于Electron的应用程序的平安性:

  • 在生产版本中移除对development console的接见。

  • 除非应用程序绝对需要,否则将“nodeintegration”设置为false。

  • 使用“event.preventDefault()来克制应用程序加载外部网页。

  • 使用React,Vue或Angular(2+)等前端框架开发应用程序,以削减应用程序包罗XSS(跨站点剧本)破绽的机遇。

  • 连续使用最新版本的Electron框架,并保持更新。

  • 开发Electron应用程序时,请务必阅读参考官方平安指南(参考文献7)。其中包罗了可以提高Electron的应用的平安性的建议。

无论是由内部平安团队照样第三方公司执行平安审计和渗透测试,对于确保系统的平安性都是至关重要的。专业的平安职员会试图从“恶意黑客”的角度来损坏系统,辅助在真正的黑客行使破绽之前识别和解救破绽。

对于专业平安服务提供商而言,要提高平安测试水平的唯一途径就是不断学习。CertiK的平安工程师自始至终都在通过普遍涉猎差别目的来提高自身的渗透测试技术,从而为客户提供最佳的渗透测试服务

Electron-based桌面钱包远程代码执行漏洞分析

参考文献:

  1. https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/cve-2018-1000136-electron-nodeintegration-bypass/

  2. https://github.com/nemfoundation/symbol-desktop-wallet

  3. https://github.com/nemfoundation/symbol-desktop-wallet/blob/14ddfd44fe9a54b54f8261dfaa68b2f88be211ce/public/build.js

  4. https://github.com/nemfoundation/symbol-desktop-wallet/blob/master/public/build.js#L237

  5. https://github.com/terra-project/station-electron/blob/5a919b87323c9d1d9c76f7c4a7deff5d731d235e/public/electron.js

  6. https://www.electronjs.org/docs/tutorial/security#5-do-not-disable-websecurity

  7. https://www.electronjs.org/docs/tutorial/securit

领会更多

General Information: info@certik.org

Audit & Partnerships: bd@certik.org

Website: certik.org

Twitter: @certik.org

Telegram: t.me/certik.org

Medium:medium.com/certik

币乎:bihu.com/people/1093109

原创文章,作者:区块链游戏,如若转载,请注明出处:http://www.chainyouxi.com/区块链游戏/4892.html