1.Electron简介
首先简单的借用Electron官网上的一段话介绍一下Electron:
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个JavaScript代码库并创建在Windows,macOS和Linux上运行的跨平台应用。
简而言之,Electron是桌面应用的变革者,它让跨平台桌面应用的开发变得简单了起来。现如今已经有很多桌面应用都是用它开发的了,我们可以看看它官网上列出的一些应用。
哇,真多!所以,就会有黑客对它下手咯!
2.Electron安全问题
传统的浏览器页面应用都是跑在浏览器的沙箱里的,因此用户的一般操作是无法访问并操作本地操作系统的资源的,除非你沙箱逃逸。而Electron由于是桌面应用,难免需要操作和访问本地资源,因此它引入nodejs来实现这个能力。这样一来就引入了安全问题了,我们查看一下discord的配置:
const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};
在这里我们关注两个值:nodeIntegration和contextIsolation(注:在electron@v12.0.0以前这个值默认为false,在之后electron官方注意到其对安全性的影响后将其改成了true)。如果nodeIntegration被设置为true,一个web页面的js可以通过调用require()轻松使用Node.js的特性。举个例子,通过下面的代码来弹出计算器:
<img src=x onerror="require('child_process').exec('calc.exe')">
contextIsolation是个Electron原生功能,它允许开发人员在特定的 JavaScript 上下文中的预加载脚本和 Electron API 中运行代码。这也就意味着诸如Array.prototype.pushor之类的全局对象JSON.parse不能被渲染器进程中运行的脚本修改。它在 Electron 的本地JavaScript 代码和 Web 应用程序的 JavaScript 代码之间引入了分离的上下文,因此应用程序的 JavaScript 代码的执行不会影响本机代码。但是如果contextIsolation禁用,Web 应用程序的 JavaScript 代码可能会影响 Electron 原生 JavaScript 代码在渲染器和预加载脚本上的执行。这种行为很危险,因为如果Electron 允许 Web 应用程序的 JavaScript 代码使用 Node.js 功能,这样用户就可以通过控制输入来实现RCE,在有些特定情况下如果contextIsolation禁用并且nodeIntegration值也设置为了false,也是有RCE的可能的,因此如果想要绝对的安全就不要设置contextIsolation的值为Fasle。
3.Electron的代码审计:
在通常情况下,直接访问electron应用的resource目录就可以查看相关代码了,但是有的时候开发者会对代码进行加密打包,一般情况下使用的是asar,对于这个我们直接解包就行了。
1.如若没有npm,就安装npm,这个安装方法自行百度。
2.npm install asar -g #安装asar
3.找到项目的asar文件:asar e app.asar app
4.在asar文件目录下的app文件夹里查看代码。
参考链接:
1.Electron安全指南
2.安全客
评论区