Electron Desktop Apps
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Electron kombiniert ein lokales Backend (mit NodeJS) und ein Frontend (Chromium), obwohl es einige der Sicherheitsmechanismen moderner Browser vermissen lässt.
Normalerweise findest du den Electron-App-Code in einer .asar
-Anwendung. Um den Code zu erhalten, musst du ihn extrahieren:
Im Quellcode einer Electron-App, innerhalb von packet.json
, finden Sie die angegebene main.js
-Datei, in der die Sicherheitskonfigurationen festgelegt sind.
Electron hat 2 Prozessarten:
Hauptprozess (hat vollständigen Zugriff auf NodeJS)
Renderer-Prozess (sollte aus Sicherheitsgründen eingeschränkten Zugriff auf NodeJS haben)
Ein Renderer-Prozess wird ein Browserfenster sein, das eine Datei lädt:
Die Einstellungen des Renderer-Prozesses können im Hauptprozess in der main.js-Datei konfiguriert werden. Einige der Konfigurationen werden verhindern, dass die Electron-Anwendung RCE oder andere Schwachstellen hat, wenn die Einstellungen korrekt konfiguriert sind.
Die Electron-Anwendung könnte auf das Gerät zugreifen über Node-APIs, obwohl sie so konfiguriert werden kann, dass dies verhindert wird:
nodeIntegration
- ist standardmäßig aus
. Wenn es aktiviert ist, ermöglicht es den Zugriff auf Node-Funktionen vom Renderer-Prozess.
contextIsolation
- ist standardmäßig ein
. Wenn es deaktiviert ist, sind Haupt- und Renderer-Prozesse nicht isoliert.
preload
- standardmäßig leer.
sandbox
- ist standardmäßig deaktiviert. Es wird die Aktionen einschränken, die NodeJS ausführen kann.
Node-Integration in Workern
nodeIntegrationInSubframes
- ist standardmäßig aus
.
Wenn nodeIntegration
aktiviert ist, würde dies die Verwendung von Node.js-APIs in Webseiten ermöglichen, die in iframes innerhalb einer Electron-Anwendung geladen werden.
Wenn nodeIntegration
deaktiviert ist, werden Preloads im iframe geladen.
Beispiel für eine Konfiguration:
Einige RCE-Payloads von hier:
Ändern Sie die start-main-Konfiguration und fügen Sie die Verwendung eines Proxys hinzu, wie:
Wenn Sie eine Electron-App lokal ausführen können, ist es möglich, dass Sie sie dazu bringen können, beliebigen JavaScript-Code auszuführen. Überprüfen Sie, wie in:
macOS Electron Applications InjectionWenn nodeIntegration auf ein gesetzt ist, kann der JavaScript-Code einer Webseite die Node.js-Funktionen einfach nutzen, indem er require()
aufruft. Zum Beispiel ist der Weg, die Calc-Anwendung unter Windows auszuführen:
Das in dieser Einstellung angegebene Skript wird vor anderen Skripten im Renderer geladen, sodass es uneingeschränkten Zugriff auf Node-APIs hat:
Daher kann das Skript Node-Features auf Seiten exportieren:
Wenn contextIsolation
aktiviert ist, funktioniert das nicht
Die contextIsolation führt die getrennten Kontexte zwischen den Webseitenskripten und dem internen JavaScript-Code von Electron ein, sodass die JavaScript-Ausführung jedes Codes sich nicht gegenseitig beeinflusst. Dies ist eine notwendige Funktion, um die Möglichkeit von RCE zu eliminieren.
Wenn die Kontexte nicht isoliert sind, kann ein Angreifer:
Willkürliches JavaScript im Renderer ausführen (XSS oder Navigation zu externen Seiten)
Die eingebaute Methode überschreiben, die im Preload oder im internen Code von Electron verwendet wird, um eine eigene Funktion zu erstellen
Die Verwendung der überschriebenen Funktion auslösen
RCE?
Es gibt 2 Stellen, an denen eingebaute Methoden überschrieben werden können: Im Preload-Code oder im internen Code von Electron:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCWenn beim Klicken auf einen Link Einschränkungen gelten, könnten Sie in der Lage sein, diese zu umgehen, indem Sie einen Mittelklick anstelle eines regulären Links klicken.
Für weitere Informationen zu diesen Beispielen siehe https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 und https://benjamin-altpeter.de/shell-openexternal-dangers/
Beim Bereitstellen einer Electron-Desktop-Anwendung ist es entscheidend, die richtigen Einstellungen für nodeIntegration
und contextIsolation
sicherzustellen. Es ist erwiesen, dass client-seitige Remote-Code-Ausführung (RCE), die auf Preload-Skripte oder den nativen Code von Electron aus dem Hauptprozess abzielt, mit diesen Einstellungen effektiv verhindert wird.
Wenn ein Benutzer mit Links interagiert oder neue Fenster öffnet, werden spezifische Ereignis-Listener ausgelöst, die für die Sicherheit und Funktionalität der Anwendung entscheidend sind:
Diese Listener werden vom Desktop-Anwendung überschrieben, um ihre eigene Geschäftslogik zu implementieren. Die Anwendung bewertet, ob ein navigierter Link intern oder in einem externen Webbrowser geöffnet werden soll. Diese Entscheidung wird typischerweise durch eine Funktion, openInternally
, getroffen. Wenn diese Funktion false
zurückgibt, bedeutet dies, dass der Link extern geöffnet werden soll, unter Verwendung der Funktion shell.openExternal
.
Hier ist ein vereinfachter Pseudocode:
Die besten Sicherheitspraktiken für Electron JS raten davon ab, untrusted Inhalte mit der Funktion openExternal
zu akzeptieren, da dies zu RCE durch verschiedene Protokolle führen könnte. Betriebssysteme unterstützen unterschiedliche Protokolle, die RCE auslösen könnten. Für detaillierte Beispiele und weitere Erklärungen zu diesem Thema kann man auf diese Ressource verweisen, die Beispiele für Windows-Protokolle enthält, die diese Schwachstelle ausnutzen können.
Beispiele für Windows-Protokoll-Exploits sind:
Das Deaktivieren von contextIsolation
ermöglicht die Verwendung von <webview>
-Tags, ähnlich wie <iframe>
, zum Lesen und Exfiltrieren lokaler Dateien. Ein bereitgestelltes Beispiel zeigt, wie man diese Schwachstelle ausnutzt, um den Inhalt interner Dateien zu lesen:
Darüber hinaus wird eine weitere Methode zum Lesen einer internen Datei geteilt, die eine kritische Schwachstelle zum Lesen lokaler Dateien in einer Electron-Desktop-App hervorhebt. Dies beinhaltet das Injizieren eines Skripts, um die Anwendung auszunutzen und Daten zu exfiltrieren:
Wenn die chromium, die von der Anwendung verwendet wird, alt ist und es bekannte Schwachstellen gibt, könnte es möglich sein, sie zu nutzen und RCE über ein XSS zu erhalten. Ein Beispiel finden Sie in diesem writeup: https://blog.electrovolt.io/posts/discord-rce/
Angenommen, Sie haben ein XSS gefunden, aber Sie können RCE nicht auslösen oder interne Dateien stehlen, könnten Sie versuchen, es zu nutzen, um Zugangsdaten über Phishing zu stehlen.
Zunächst müssen Sie wissen, was passiert, wenn Sie versuchen, eine neue URL zu öffnen, indem Sie den JS-Code im Front-End überprüfen:
Der Aufruf von openInternally
entscheidet, ob der Link im Desktop-Fenster geöffnet wird, da es sich um einen Link handelt, der zur Plattform gehört, oder ob er im Browser als 3rd Party-Ressource geöffnet wird.
Falls der Regex, der von der Funktion verwendet wird, anfällig für Umgehungen ist (zum Beispiel durch das Nicht-Entkommen der Punkte von Subdomains), könnte ein Angreifer das XSS ausnutzen, um ein neues Fenster zu öffnen, das sich in der Infrastruktur des Angreifers befindet und den Benutzer nach Anmeldeinformationen fragt:
Electronegativity ist ein Tool zur Identifizierung von Fehlkonfigurationen und Sicherheits-Anti-Patterns in Electron-basierten Anwendungen.
Electrolint ist ein Open-Source-VS-Code-Plugin für Electron-Anwendungen, das Electronegativity verwendet.
nodejsscan zur Überprüfung auf verwundbare Drittanbieterbibliotheken
Electro.ng: Sie müssen es kaufen
In https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s finden Sie ein Labor, um verwundbare Electron-Apps auszunutzen.
Einige Befehle, die Ihnen im Labor helfen werden:
Weitere Forschungen und Berichte über die Sicherheit von Electron in https://github.com/doyensec/awesome-electronjs-hacking
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)