# Electron Desktop Apps
{{#include ../../../banners/hacktricks-training.md}}
## Вступ
Electron поєднує локальний бекенд (з **NodeJS**) та фронтенд (**Chromium**), хоча йому бракує деяких механізмів безпеки сучасних браузерів.
Зазвичай ви можете знайти код електронного додатку всередині програми `.asar`, щоб отримати код, вам потрібно його витягти:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
У вихідному коді програми Electron, всередині `packet.json`, ви можете знайти вказаний файл `main.js`, де налаштовуються конфігурації безпеки.
```json
{
"name": "standard-notes",
"main": "./app/index.js",
```
Electron має 2 типи процесів:
- Головний процес (має повний доступ до NodeJS)
- Процес рендерера (повинен мати обмежений доступ до NodeJS з міркувань безпеки)
.png>)
**Процес рендерера** буде вікном браузера, що завантажує файл:
```javascript
const { BrowserWindow } = require("electron")
let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
Налаштування **renderer process** можуть бути **сконфігуровані** в **main process** всередині файлу main.js. Деякі з конфігурацій **запобігатимуть отриманню RCE** або інших вразливостей, якщо **налаштування правильно сконфігуровані**.
Electron додаток **може отримати доступ до пристрою** через Node API, хоча його можна налаштувати, щоб запобігти цьому:
- **`nodeIntegration`** - за замовчуванням вимкнено. Якщо ввімкнено, дозволяє отримувати доступ до функцій Node з renderer process.
- **`contextIsolation`** - за замовчуванням увімкнено. Якщо вимкнено, основний і рендеринговий процеси не ізольовані.
- **`preload`** - за замовчуванням порожній.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - за замовчуванням вимкнено. Це обмежить дії, які може виконувати NodeJS.
- Node Integration в Workers
- **`nodeIntegrationInSubframes`** - за замовчуванням вимкнено.
- Якщо **`nodeIntegration`** **увімкнено**, це дозволить використовувати **Node.js APIs** на веб-сторінках, які **завантажуються в iframes** в рамках Electron додатку.
- Якщо **`nodeIntegration`** **вимкнено**, тоді попередні завантаження будуть завантажуватися в iframe.
Приклад конфігурації:
```javascript
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,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, "mainScreenPreload.js"),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true,
},
}
```
Деякі **RCE payloads** з [тут](https://7as.es/electron/nodeIntegration_rce.txt):
```html
Example Payloads (Windows):
Example Payloads (Linux & MacOS):
```
### Capture traffic
Змініть конфігурацію start-main і додайте використання проксі, такого як:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Electron Local Code Injection
Якщо ви можете виконати Electron App локально, можливо, ви зможете виконати довільний код JavaScript. Перевірте, як це зробити в:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
{{#endref}}
## RCE: XSS + nodeIntegration
Якщо **nodeIntegration** встановлено на **on**, JavaScript веб-сторінки може легко використовувати функції Node.js, просто викликавши `require()`. Наприклад, спосіб виконати калькулятор на Windows:
```html
```
## RCE: preload
Скрипт, вказаний у цьому налаштуванні, **завантажується перед іншими скриптами в рендерері**, тому він має **необмежений доступ до Node API**:
```javascript
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Отже, скрипт може експортувати node-features на сторінки:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
require("child_process").exec("calc")
}
```
```html:index.html
```
> [!NOTE] > **Якщо `contextIsolation` увімкнено, це не спрацює**
## RCE: XSS + contextIsolation
_**contextIsolation**_ вводить **окремі контексти між скриптами веб-сторінки та внутрішнім кодом JavaScript Electron**, так що виконання JavaScript кожного коду не впливає на інший. Це необхідна функція для усунення можливості RCE.
Якщо контексти не ізольовані, зловмисник може:
1. Виконати **произвольний JavaScript у рендерері** (XSS або навігація на зовнішні сайти)
2. **Перезаписати вбудований метод**, який використовується в preload або внутрішньому коді Electron, на власну функцію
3. **Запустити** використання **перезаписаної функції**
4. RCE?
Є 2 місця, де вбудовані методи можуть бути перезаписані: у коді preload або у внутрішньому коді Electron:
{{#ref}}
electron-contextisolation-rce-via-preload-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-electron-internal-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Обхід події кліку
Якщо є обмеження, які застосовуються при натисканні на посилання, ви можете обійти їх, **зробивши середній клік** замість звичайного лівого кліку.
```javascript
window.addEventListener('click', (e) => {
```
## RCE через shell.openExternal
Для отримання додаткової інформації про ці приклади перегляньте [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) та [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
При розгортанні настільного додатку Electron важливо забезпечити правильні налаштування для `nodeIntegration` та `contextIsolation`. Встановлено, що **віддалене виконання коду на стороні клієнта (RCE)**, яке націлене на попередньо завантажені скрипти або рідний код Electron з основного процесу, ефективно запобігається за наявності цих налаштувань.
Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують специфічні обробники подій, які є критично важливими для безпеки та функціональності додатку:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Ці слухачі **перекриваються настільним додатком** для реалізації власної **бізнес-логіки**. Додаток оцінює, чи слід відкривати навігаційне посилання внутрішньо чи в зовнішньому веб-браузері. Це рішення зазвичай приймається через функцію `openInternally`. Якщо ця функція повертає `false`, це вказує на те, що посилання слід відкривати зовні, використовуючи функцію `shell.openExternal`.
**Ось спрощений псевдокод:**
.png>)
.png>)
Найкращі практики безпеки 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')`.
**Приклади експлойтів протоколів Windows включають:**
```html
```
## Читання внутрішніх файлів: XSS + contextIsolation
**Вимкнення `contextIsolation` дозволяє використовувати `` теги**, подібно до `