Translated ['src/network-services-pentesting/pentesting-web/electron-des

This commit is contained in:
Translator 2025-01-07 18:44:00 +00:00
parent 14d621535a
commit 09d886e466

View File

@ -6,7 +6,7 @@
Electron结合了本地后端使用**NodeJS**)和前端(**Chromium**),尽管它缺乏现代浏览器的一些安全机制。
通常,您可能会在`.asar`应用程序中找到electron应用程序代码,获取代码需要提取它:
通常,您可能会在`.asar`应用程序中找到electron应用代码获取代码需要提取它
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
@ -37,7 +37,7 @@ win.loadURL(`file://path/to/index.html`)
Electron 应用程序 **可以通过 Node apis 访问设备**,尽管可以配置以防止它:
- **`nodeIntegration`** - 默认情况下为 `off`。如果开启,允许从 renderer process 访问 node 特性。
- **`contextIsolation`** - 默认情况下为 `on`。如果关闭,主进程和渲染进程不隔离。
- **`contextIsolation`** - 默认情况下为 `on`。如果关闭,主进程和渲染进程不隔离。
- **`preload`** - 默认情况下为空。
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - 默认情况下为 off。它将限制 NodeJS 可以执行的操作。
- Node Integration in Workers
@ -111,7 +111,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
## RCE: XSS + nodeIntegration
如果 **nodeIntegration** 设置为 **on**,网页的 JavaScript 可以通过调用 `require()` 轻松使用 Node.js 功能。例如,在 Windows 上执行 calc 应用程序的方法是:
如果 **nodeIntegration** 设置为 **on**,网页的 JavaScript 可以通过调用 `require()` 轻松使用 Node.js 功能。例如,在 Windows 上执行计算器应用程序的方法是:
```html
<script>
require("child_process").exec("calc")
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
## RCE: preload
在此设置中指示的脚本是**在渲染器中加载其他脚本之前**,因此它具有**对 Node API 的无限访问权限**
在此设置中指示的脚本是在渲染器中**加载其他脚本之前**,因此它具有**对 Node API 的无限访问权限**
```javascript
new BrowserWindow{
webPreferences: {
@ -148,7 +148,7 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **如果 `contextIsolation` 开启,这将不起作用**
> [!NOTE] > **如果 `contextIsolation` 开启,这将无法工作**
## RCE: XSS + contextIsolation
@ -157,11 +157,11 @@ _**contextIsolation**_ 引入了 **网页脚本与 JavaScript Electron 内部代
如果上下文没有被隔离,攻击者可以:
1. 在渲染器中执行 **任意 JavaScript**XSS 或导航到外部网站)
2. **覆盖内置方法**,该方法用于预加载或 Electron 内部代码,变为自己的函数
2. **覆盖内置方法**,该方法在预加载或 Electron 内部代码中被使用,替换为自己的函数
3. **触发** 使用 **被覆盖的函数**
4. RCE
内置方法可以在两个地方被覆盖:在预加载代码中或在 Electron 内部代码中:
内置方法可以被覆盖的地方有两个:在预加载代码中或在 Electron 内部代码中:
{{#ref}}
electron-contextisolation-rce-via-preload-code.md
@ -187,7 +187,7 @@ window.addEventListener('click', (e) => {
在部署 Electron 桌面应用程序时,确保 `nodeIntegration``contextIsolation` 的正确设置至关重要。已确定,**客户端远程代码执行 (RCE)** 针对预加载脚本或 Electron 的主进程本地代码在这些设置到位时有效防止。
当用户与链接互或打开新窗口时,会触发特定的事件监听器,这对应用程序的安全性和功能至关重要:
当用户与链接互或打开新窗口时,会触发特定的事件监听器,这对应用程序的安全性和功能至关重要:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
@ -200,7 +200,7 @@ webContents.on("will-navigate", function (event, url) {}
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>)
Electron JS安全最佳实践建议不要使用`openExternal`函数接受不受信任的内容因为这可能通过各种协议导致RCE。操作系统支持不同的协议这些协议可能触发RCE。有关此主题的详细示例和进一步解释可以参考[资源](https://positive.security/blog/url-open-rce#windows-10-19042)其中包括能够利用此漏洞的Windows协议示例。
Electron JS安全最佳实践建议不要使用`openExternal`函数接受不受信任的内容因为这可能通过各种协议导致RCE。操作系统支持不同的协议这些协议可能触发RCE。有关此主题的详细示例和进一步解释可以参考[这个资源](https://positive.security/blog/url-open-rce#windows-10-19042)其中包括能够利用此漏洞的Windows协议示例。
在macos中`openExternal`函数可以被利用来执行任意命令,例如`shell.openExternal('file:///System/Applications/Calculator.app')`
@ -226,11 +226,11 @@ window.open(
```
## 读取内部文件XSS + contextIsolation
**禁用 `contextIsolation` 使得可以使用 `<webview>` 标签**,类似于 `<iframe>`,用于读取和外泄本地文件。提供的示例演示了如何利用此漏洞读取内部文件的内容:
**禁用 `contextIsolation` 使得可以使用 `<webview>` 标签**,类似于 `<iframe>`,用于读取和提取本地文件。提供的示例演示了如何利用此漏洞读取内部文件的内容:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
此外,还分享了另一种 **读取内部文件** 的方法,突出了 Electron 桌面应用中的一个关键本地文件读取漏洞。这涉及注入脚本以利用该应用并外泄数据:
此外,还分享了另一种 **读取内部文件** 的方法,突出了 Electron 桌面应用中的一个关键本地文件读取漏洞。这涉及注入脚本以利用该应用并提取数据:
```html
<br /><br /><br /><br />
<h1>
@ -262,7 +262,7 @@ webContents.on("will-navigate", function (event, url) {} // o
```
对**`openInternally`**的调用将决定**链接**是作为平台的链接在**桌面窗口**中**打开**,还是作为**第三方资源**在**浏览器**中打开。
如果该函数使用的**正则表达式****易受绕过攻击**(例如**未对子域的点进行转义**),攻击者可能会利用XSS**打开一个新窗口**,该窗口位于攻击者的基础设施中,**向用户请求凭据**
如果该函数使用的**regex**对绕过**漏洞**(例如**未转义子域的点**)是**脆弱的**,攻击者可以利用XSS**打开一个新窗口**,该窗口位于攻击者的基础设施中,**向用户请求凭据**
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
@ -295,22 +295,22 @@ remoteMain.enable(mainWindow.webContents)
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
该**[博客文章](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**指出了远程模块中对象**`app`**暴露的一些有趣的**函数**
**[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** 指出了一些由远程模块的对象 **`app`** 暴露的有趣 **函数**
- **`app.relaunch([options])`**
- **重新启动**应用程序,通过**退出**当前实例并**启动**一个新实例。对于**应用更新**或重大**状态变化**非常有用。
- **重新启动** 应用程序,通过 **退出** 当前实例并 **启动** 新实例。对于 **应用更新** 或重大 **状态变化**有用。
- **`app.setAppLogsPath([path])`**
- **定义**或**创建**一个目录以存储**应用日志**。可以使用**`app.getPath()`**或**`app.setPath(pathName, newPath)`**来**检索**或**修改**日志。
- **定义****创建** 一个目录来存储 **应用日志**。可以使用 **`app.getPath()`** 或 **`app.setPath(pathName, newPath)`** 来 **检索****修改** 日志。
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **注册** 当前可执行文件作为指定 **协议****默认处理程序**。如有需要,可以提供 **自定义路径****参数**
- **`app.setUserTasks(tasks)`**
- **添加**任务到**任务类别**中在Windows上)。每个任务可以控制应用程序如何**启动**或传递什么**参数**。
- **添加** 任务到 **任务类别****跳转列表**(在 Windows 上)。每个任务可以控制应用程序如何 **启动** 或传递什么 **参数**。
- **`app.importCertificate(options, callback)`**
- **将**一个**PKCS#12证书**导入系统的**证书存储**仅限Linux。可以使用**回调**来处理结果。
- **导入** 一个 **PKCS#12 证书** 到系统的 **证书存储**(仅限 Linux。可以使用 **回调** 来处理结果。
- **`app.moveToApplicationsFolder([options])`**
- **将**应用程序移动到**应用程序文件夹**在macOS上。有助于确保Mac用户的**标准安装**
- **移动** 应用程序到 **应用程序文件夹**(在 macOS 上)。帮助确保 Mac 用户的 **标准安装**
- **`app.setJumpList(categories)`**
- **设置**或**移除****自定义Jump List**在Windows上。可以指定**类别**以组织任务如何呈现给用户。
- **设置****移除** 一个 **自定义跳转列表****Windows** 上。可以指定 **类别** 来组织任务如何显示给用户。
- **`app.setLoginItemSettings(settings)`**
- **配置****登录** 时启动的 **可执行文件** 及其 **选项**(仅限 macOS 和 Windows
```javascript
@ -319,7 +319,7 @@ Native.app.exit()
```
## systemPreferences 模块
在 Electron 中访问系统偏好设置和发出系统事件的 **主要 API**。像 **subscribeNotification**、**subscribeWorkspaceNotification**、**getUserDefault** 和 **setUserDefault** 这样的函数都是这个模块的 **一部分**
在 Electron 中访问系统偏好设置和 **发出系统事件** **主要 API**。像 **subscribeNotification**、**subscribeWorkspaceNotification**、**getUserDefault** 和 **setUserDefault** 这样的函数都是这个模块的 **一部分**
**示例用法:**
```javascript
@ -336,19 +336,19 @@ console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **监听** **本 macOS 通知**,使用 NSDistributedNotificationCenter。
* **监听** **本 macOS 通知**,使用 NSDistributedNotificationCenter。
* 在 **macOS Catalina** 之前,您可以通过将 **nil** 传递给 CFNotificationCenterAddObserver 来嗅探 **所有** 分发的通知。
* 在 **Catalina / Big Sur** 之后,沙盒应用仍然可以通过按 **名称** 注册通知来 **订阅** **许多事件**(例如,**屏幕锁定/解锁**、**卷挂载**、**网络活动**等)。
### **getUserDefault / setUserDefault**
* **与** **NSUserDefaults** 交互,存储 **应用程序****全局** 偏好设置在 macOS 上
* **与** **NSUserDefaults** **接口**,它在 macOS 上存储 **应用程序****全局** 偏好设置。
* **getUserDefault** 可以 **检索** 敏感信息,例如 **最近的文件位置****用户的地理位置**
* **setUserDefault** 可以 **修改** 这些偏好设置,可能会影响应用的 **配置**
* 在 **旧版 Electron**v8.3.0 之前),只有 **标准套件** 的 NSUserDefaults 是 **可访问的**
* 在 **旧版 Electron**v8.3.0 之前),只有 **标准套件** 的 NSUserDefaults 是 **可访问的**
## Shell.showItemInFolder
@ -356,9 +356,21 @@ console.log('Recent Places:', recentPlaces);
有关更多信息,请查看 [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
## Content Security Policy
Electron 应用应具有 **内容安全策略 (CSP)****防止 XSS 攻击**。**CSP** 是一种 **安全标准**,有助于 **防止** 在浏览器中 **执行** **不受信任的代码**
它通常在 **`main.js`** 文件或 **`index.html`** 模板中通过 **meta 标签** 配置 CSP。
有关更多信息,请查看:
{{#ref}}
pentesting-web/content-security-policy-csp-bypass/
{{#endref}}
## **工具**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) 是一个识别 Electron 应用程序中的错误配置和安全反模式的工具。
- [**Electronegativity**](https://github.com/doyensec/electronegativity) 是一个识别 Electron 应用程序中配置错误和安全反模式的工具。
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) 是一个用于 Electron 应用程序的开源 VS Code 插件,使用 Electronegativity。
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) 用于检查易受攻击的第三方库
- [**Electro.ng**](https://electro.ng/): 您需要购买它