Electron Desktop Apps
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Electron поєднує локальний бекенд (з NodeJS) і фронтенд (Chromium), хоча йому не вистачає деяких механізмів безпеки сучасних браузерів.
Зазвичай ви можете знайти код електронного додатку всередині .asar
програми, щоб отримати код, вам потрібно його витягти:
В вихідному коді програми Electron, всередині packet.json
, ви можете знайти вказаний файл main.js
, де налаштовуються конфігурації безпеки.
Electron має 2 типи процесів:
Головний процес (має повний доступ до NodeJS)
Процес рендерера (повинен мати обмежений доступ до NodeJS з міркувань безпеки)
Процес рендерера буде вікном браузера, що завантажує файл:
Налаштування renderer process можуть бути сконфігуровані в main process всередині файлу main.js. Деякі з конфігурацій запобігатимуть отриманню RCE або інших вразливостей, якщо налаштування правильно сконфігуровані.
Electron додаток може отримати доступ до пристрою через Node API, хоча його можна налаштувати, щоб запобігти цьому:
nodeIntegration
- за замовчуванням вимкнено. Якщо ввімкнено, дозволяє отримувати доступ до функцій Node з renderer process.
contextIsolation
- за замовчуванням увімкнено. Якщо вимкнено, основний і renderer процеси не ізольовані.
preload
- за замовчуванням порожній.
sandbox
- за замовчуванням вимкнено. Це обмежить дії, які може виконувати NodeJS.
Node Integration в Workers
nodeIntegrationInSubframes
- за замовчуванням вимкнено.
Якщо nodeIntegration
увімкнено, це дозволить використовувати Node.js APIs на веб-сторінках, які завантажуються в iframes в рамках Electron додатку.
Якщо nodeIntegration
вимкнено, тоді попередні завантаження завантажаться в iframe.
Приклад конфігурації:
Деякі RCE payloads з тут:
Змініть конфігурацію start-main і додайте використання проксі, наприклад:
Якщо ви можете виконати Electron App локально, можливо, ви зможете виконати довільний код JavaScript. Перевірте, як це зробити в:
macOS Electron Applications InjectionЯкщо nodeIntegration встановлено на on, JavaScript веб-сторінки може легко використовувати функції Node.js, просто викликавши require()
. Наприклад, спосіб виконати додаток calc на Windows:
Скрипт, вказаний у цій налаштуванні, завантажується перед іншими скриптами в рендерері, тому він має необмежений доступ до Node API:
Отже, скрипт може експортувати node-features на сторінки:
Якщо contextIsolation
увімкнено, це не спрацює
contextIsolation вводить окремі контексти між скриптами веб-сторінки та внутрішнім кодом JavaScript Electron, щоб виконання JavaScript кожного коду не впливало на інший. Це необхідна функція для усунення можливості RCE.
Якщо контексти не ізольовані, зловмисник може:
Виконати произвольний JavaScript у рендерері (XSS або навігація на зовнішні сайти)
Перезаписати вбудований метод, який використовується в preload або внутрішньому коді Electron на власну функцію
Запустити використання перезаписаної функції
RCE?
Є 2 місця, де вбудовані методи можуть бути перезаписані: у коді preload або у внутрішньому коді Electron:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCЯкщо є обмеження, які застосовуються при натисканні на посилання, ви можете обійти їх, зробивши середній клік замість звичайного лівого кліку.
Для отримання додаткової інформації про ці приклади перегляньте https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 та https://benjamin-altpeter.de/shell-openexternal-dangers/
При розгортанні настільного додатку Electron важливо забезпечити правильні налаштування для nodeIntegration
та contextIsolation
. Встановлено, що віддалене виконання коду на стороні клієнта (RCE), яке націлене на попередньо завантажені скрипти або рідний код Electron з основного процесу, ефективно запобігається за наявності цих налаштувань.
Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують певні обробники подій, які є критично важливими для безпеки та функціональності додатку:
Ці слухачі перекриваються настільним додатком для реалізації власної бізнес-логіки. Додаток оцінює, чи слід відкривати навігаційне посилання внутрішньо чи в зовнішньому веб-браузері. Це рішення зазвичай приймається через функцію openInternally
. Якщо ця функція повертає false
, це вказує на те, що посилання слід відкривати зовнішньо, використовуючи функцію shell.openExternal
.
Ось спрощений псевдокод:
Найкращі практики безпеки Electron JS радять не приймати ненадійний контент з функцією openExternal
, оскільки це може призвести до RCE через різні протоколи. Операційні системи підтримують різні протоколи, які можуть викликати RCE. Для детальних прикладів та подальшого пояснення з цього питання можна звернутися до цього ресурсу, який містить приклади протоколів Windows, здатних експлуатувати цю вразливість.
Приклади експлуатації протоколів Windows включають:
Вимкнення contextIsolation
дозволяє використовувати <webview>
теги, подібно до <iframe>
, для читання та ексфільтрації локальних файлів. Наведений приклад демонструє, як експлуатувати цю вразливість для читання вмісту внутрішніх файлів:
Крім того, подається ще один метод читання внутрішнього файлу, що підкреслює критичну вразливість читання локальних файлів в Electron десктопному додатку. Це передбачає ін'єкцію скрипта для експлуатації програми та ексфільтрації даних:
Якщо chromium, що використовується в додатку, є старим і в ньому є відомі вразливості, можливо, ви зможете використати це та отримати RCE через XSS. Ви можете побачити приклад у цьому writeup: https://blog.electrovolt.io/posts/discord-rce/
Припустимо, ви знайшли XSS, але ви не можете викликати RCE або вкрасти внутрішні файли, ви можете спробувати використати це для викрадення облікових даних через фішинг.
По-перше, вам потрібно знати, що відбувається, коли ви намагаєтеся відкрити новий URL, перевіряючи JS код на фронтенді:
Виклик openInternally
вирішить, чи посилання буде відкрито в десктопному вікні, оскільки це посилання, що належить платформі, чи буде відкрито в браузері як ресурс третьої сторони.
У випадку, якщо regex, використаний функцією, є вразливим до обходів (наприклад, через неекранування крапок піддоменів), зловмисник може зловживати XSS, щоб відкрити нове вікно, яке буде розташоване в інфраструктурі зловмисника, питавши у користувача про облікові дані:
Electronegativity - це інструмент для виявлення неправильних налаштувань та антипатернів безпеки в додатках на базі Electron.
Electrolint - це плагін з відкритим кодом для VS Code для додатків Electron, який використовує Electronegativity.
nodejsscan для перевірки вразливих сторонніх бібліотек
Electro.ng: Вам потрібно його купити
У https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s ви можете знайти лабораторію для експлуатації вразливих додатків Electron.
Деякі команди, які допоможуть вам у лабораторії:
Більше досліджень та статей про безпеку Electron на https://github.com/doyensec/awesome-electronjs-hacking
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)