侧边栏壁纸
博主头像
Lou1s

想上梁山。

  • 累计撰写 9 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

Electron安全的一些漫谈

Lou1s
2023-02-09 / 0 评论 / 0 点赞 / 2,445 阅读 / 1,921 字
温馨提示:
本文最后更新于 2023-02-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.Electron简介

首先简单的借用Electron官网上的一段话介绍一下Electron

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个JavaScript代码库并创建在Windows,macOS和Linux上运行的跨平台应用。

简而言之,Electron是桌面应用的变革者,它让跨平台桌面应用的开发变得简单了起来。现如今已经有很多桌面应用都是用它开发的了,我们可以看看它官网上列出的一些应用。
image
哇,真多!所以,就会有黑客对它下手咯!

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.安全客

0

评论区