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

CertiK 安全团队在 Symbol 桌面钱包中发现了一个远程执行代码漏洞,并将该漏洞提交到了 Symbol 漏洞赏金计划。Symbol 对 CertiK 提交的报告非常重视,即刻采取了安全解决措施,并及时更新了代码。目前该问题已在 v0.9.11 版本中得到修复。

HackerOne 报告目前尚未公开,但在征得了 Symbol 的允许后,本文将公开于此分享此次事件。在此,CertiK 对 Symbol 提供的赏金奖励,以及对公开分享漏洞发现的许可表示感谢。

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

Symbol wallet 是一个基于 Electron 的桌面应用程序,此次发现的漏洞与 Electron 配置有关。Electron 是不是听起来很耳熟?但它可不是你在物理化学课上学到的那个电子。在展开漏洞分析之前,不妨先来看看本文中的 Electron 是什么,在安全层面有什么值得注意的事项。

Electron 是什么

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

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-based 桌面钱包远程代码执行漏洞分析

基于 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-based 桌面钱包远程代码执行漏洞分析

在了解了基于 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(){

constwindowOptions = {

  minWidth: width,

  minHeight: height,

  width: width,

  height: height,

  title: app.getName(),

  titleBarStyle: 'hiddenInset',

  webPreferences: {

   **nodeIntegration: true,**

  },

  resizable:**true**,

}

....code...

mainWindow=**new**BrowserWindow(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”按钮后,用户的计算机上将弹出计算器。在目标系统中弹出计算器是证明成功利用代码执行漏洞的一种方法。

PoC 视频

Proof-of-Concept:

**

click me

**

type="button" onClick="rce_calc()">Submit

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

探索基于 Electron 的

加密货币钱包

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

做为安全研究员,当在一个程序中发现漏洞,我们总会尝试去探索此类漏洞是否在别的应用中存在。通过互联网搜索,CertiK 安全团队发现了另一个基于 Electron 的加密货币钱包 : MyCrypto。在测试时,技术人员发现 MyCrypto 将“nodeintegration”设置为 true,并启用了 Node.js。虽然没有找到攻击此配置的办法。但是我们不应该给攻击者将“self-xss”转化为命令代码执行的机会。

CertiK 旨在为加密社区的安全做出贡献,并帮助企业保护用户资产。技术人员在对方的 Github 仓库中提交了 Issue。

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

重点提示

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

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

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

了解更多

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

往期回顾

漏洞分析 | 一千种死法之 智能合约函数调用错误

漏洞分析 | CORS-anywhere :第三方软件配置错误的危险

CertiK Chain 大使和志愿者招募计划

以太坊 3700 万元天价手续费的背后,令你想破脑袋的原因可能不止这些

一分钟了解 DeFi (系列二)| DeFi,真的是「黑客提款机」吗?

CertiK Chain 钱包和漏洞赏金计划

请点击“阅读原文”访问 CertiK 官方网站

来源链接:mp.weixin.qq.com