Electron Desktop Apps
Вступ
Electron поєднує локальний бекенд (з NodeJS) та фронтенд (Chromium), хоча він не має деяких механізмів безпеки сучасних браузерів.
Зазвичай ви можете знайти код додатка на Electron всередині застосунку .asar
, щоб отримати код, вам потрібно його видобути:
У вихідному коді додатка Electron, всередині packet.json
, ви можете знайти вказаний файл main.js
, де встановлені конфігурації безпеки.
Electron має 2 типи процесів:
Основний процес (має повний доступ до NodeJS)
Процес відображення (повинен мати обмежений доступ до NodeJS з міркувань безпеки)
Процес відображення буде вікном браузера, яке завантажує файл:
Налаштування процесу відображення можна налаштувати в основному процесі всередині файлу main.js. Деякі з конфігурацій будуть запобігати отриманню RCE або інших вразливостей, якщо налаштування виконані правильно.
Додаток Electron може отримати доступ до пристрою через Node apis, хоча його можна налаштувати для запобігання цього:
nodeIntegration
- за замовчуванням вимкнено. Якщо увімкнено, дозволяє отримувати доступ до можливостей node з процесу відображення.contextIsolation
- за замовчуванням увімкнено. Якщо вимкнено, основний та процеси відображення не ізольовані.preload
- за замовчуванням порожній.sandbox
- за замовчуванням вимкнено. Це обмежить дії, які може виконувати NodeJS.Інтеграція Node в робочих потоках
nodeIntegrationInSubframes
- за замовчуванням вимкнено.Якщо
nodeIntegration
увімкнено, це дозволить використовувати API Node.js на веб-сторінках, які завантажуються в iframe в додатку Electron.Якщо
nodeIntegration
вимкнено, то попередні завантаження будуть завантажені в iframe
Приклад конфігурації:
Деякі RCE payloads з цього:
Захоплення трафіку
Змініть конфігурацію start-main та додайте використання проксі, наприклад:
Локальне внедрення коду в Electron
Якщо ви можете локально виконати додаток Electron, є можливість виконання довільного коду JavaScript. Перевірте, як це зробити:
RCE: XSS + nodeIntegration
Якщо nodeIntegration встановлено на on, JavaScript веб-сторінки можуть легко використовувати можливості Node.js, просто викликаючи require()
. Наприклад, спосіб виконання додатку калькулятора на Windows:
RCE: preload
Сценарій, вказаний у цьому налаштуванні, завантажується перед іншими сценаріями в рендерері, тому він має необмежений доступ до API Node:
Отповідно, скрипт може експортувати вузли-функції на сторінки:
Якщо contextIsolation
увімкнено, це не працюватиме
RCE: XSS + contextIsolation
contextIsolation вводить відокремлені контексти між скриптами веб-сторінки та внутрішнім кодом JavaScript Electron, щоб виконання JavaScript кожного коду не впливало на кожен. Це необхідна функція для усунення можливості RCE.
Якщо контексти не відокремлені, зловмисник може:
Виконати довільний JavaScript у рендерері (XSS або перехід на зовнішні сайти)
Перезаписати вбудований метод, який використовується в попередньо завантаженому коді або внутрішньому коді Electron на власну функцію
Спровокувати використання перезаписаної функції
RCE?
Є 2 місця, де можна перезаписати вбудовані методи: у попередньо завантаженому коді або у внутрішньому коді Electron:
Обхід події кліку
Якщо є обмеження при натисканні посилання, ви можете обійти їх, натиснувши середню кнопку замість звичайного лівого кліку
Виконання коду з віддаленим доступом через shell.openExternal
Для отримання додаткової інформації про ці приклади перегляньте 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 включають:
Читання внутрішніх файлів: XSS + contextIsolation
Вимкнення contextIsolation
дозволяє використовувати теги <webview>
, схожі на <iframe>
, для читання та ексфільтрації локальних файлів. Надано приклад, що демонструє, як використовувати цю уразливість для читання вмісту внутрішніх файлів:
Крім того, надається ще один метод читання внутрішнього файлу, який висвітлює критичну уразливість читання локальних файлів у додатку для робочого столу Electron. Це включає впровадження скрипту для експлуатації додатку та ексфільтрації даних:
RCE: XSS + Старий Chromium
Якщо chromium, який використовується програмою, є старим, і на ньому є відомі вразливості, можливо експлуатувати їх і отримати RCE через XSS. Ви можете побачити приклад у цьому описі: https://blog.electrovolt.io/posts/discord-rce/
XSS-фішинг через обхід внутрішнього URL-regex
Припустимо, ви знайшли XSS, але ви не можете викликати RCE або вкрасти внутрішні файли, ви можете спробувати використати його для вкрадення облікових даних через фішинг.
По-перше, вам потрібно знати, що відбувається, коли ви намагаєтеся відкрити новий URL, перевіряючи JS-код у фронтенді:
Виклик openInternally
вирішить, чи буде посилання відкрите в вікні робочого столу, оскільки це посилання належить до платформи, чи відкрите в браузері як ресурс сторонньої сторони.
У випадку, якщо регулярний вираз, використаний функцією, вразливий до обхідних шляхів (наприклад, не екрануючи крапки піддоменів), зловмисник може скористатися 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
Last updated