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 combina un backend locale (con NodeJS) e un frontend (Chromium), anche se manca di alcuni meccanismi di sicurezza dei browser moderni.
Di solito puoi trovare il codice dell'app electron all'interno di un'applicazione .asar
, per ottenere il codice è necessario estrarlo:
Nel codice sorgente di un'app Electron, all'interno di packet.json
, puoi trovare specificato il file main.js
dove sono impostate le configurazioni di sicurezza.
Electron ha 2 tipi di processi:
Processo Principale (ha accesso completo a NodeJS)
Processo Renderer (dovrebbe avere accesso limitato a NodeJS per motivi di sicurezza)
Un processo renderer sarà una finestra del browser che carica un file:
Le impostazioni del renderer process possono essere configurate nel main process all'interno del file main.js. Alcune delle configurazioni preveniranno che l'applicazione Electron ottenga RCE o altre vulnerabilità se le impostazioni sono configurate correttamente.
L'applicazione Electron potrebbe accedere al dispositivo tramite le API di Node, anche se può essere configurata per prevenirlo:
nodeIntegration
- è disattivato
per impostazione predefinita. Se attivato, consente di accedere alle funzionalità di Node dal renderer process.
contextIsolation
- è attivato
per impostazione predefinita. Se disattivato, i processi principale e renderer non sono isolati.
preload
- vuoto per impostazione predefinita.
sandbox
- è disattivato per impostazione predefinita. Restringerà le azioni che NodeJS può eseguire.
Integrazione di Node nei Workers
nodeIntegrationInSubframes
- è disattivato
per impostazione predefinita.
Se nodeIntegration
è abilitato, questo consentirebbe l'uso delle API di Node.js nelle pagine web che sono caricate in iframe all'interno di un'applicazione Electron.
Se nodeIntegration
è disabilitato, allora i preload verranno caricati nell'iframe.
Esempio di configurazione:
Alcuni RCE payloads da qui:
Modifica la configurazione start-main e aggiungi l'uso di un proxy come:
Se puoi eseguire localmente un'app Electron, è possibile che tu possa far eseguire codice javascript arbitrario. Controlla come in:
macOS Electron Applications InjectionSe il nodeIntegration è impostato su on, il JavaScript di una pagina web può utilizzare facilmente le funzionalità di Node.js semplicemente chiamando require()
. Ad esempio, il modo per eseguire l'applicazione calc su Windows è:
Lo script indicato in questa impostazione è caricato prima di altri script nel renderer, quindi ha accesso illimitato alle API di Node:
Pertanto, lo script può esportare le funzionalità del nodo nelle pagine:
Se contextIsolation
è attivato, questo non funzionerà
Il contextIsolation introduce i contesti separati tra gli script della pagina web e il codice interno JavaScript di Electron in modo che l'esecuzione di ciascun codice non influisca sugli altri. Questa è una caratteristica necessaria per eliminare la possibilità di RCE.
Se i contesti non sono isolati, un attaccante può:
Eseguire JavaScript arbitrario nel renderer (XSS o navigazione verso siti esterni)
Sovrascrivere il metodo incorporato che viene utilizzato nel preload o nel codice interno di Electron con una propria funzione
Attivare l'uso della funzione sovrascritta
RCE?
Ci sono 2 luoghi in cui i metodi incorporati possono essere sovrascritti: nel codice di preload o nel codice interno di Electron:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCSe ci sono restrizioni applicate quando clicchi su un link, potresti essere in grado di aggirarle facendo un clic centrale invece di un normale clic sinistro.
Per ulteriori informazioni su questi esempi, controlla https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 e https://benjamin-altpeter.de/shell-openexternal-dangers/
Quando si distribuisce un'applicazione desktop Electron, è fondamentale garantire le impostazioni corrette per nodeIntegration
e contextIsolation
. È stato stabilito che l'esecuzione remota di codice lato client (RCE) mirata a script di preload o al codice nativo di Electron dal processo principale è efficacemente prevenuta con queste impostazioni in atto.
Quando un utente interagisce con i link o apre nuove finestre, vengono attivati specifici listener di eventi, che sono cruciali per la sicurezza e la funzionalità dell'applicazione:
Questi listener sono sovrascritti dall'applicazione desktop per implementare la propria logica aziendale. L'applicazione valuta se un link navigato debba essere aperto internamente o in un browser web esterno. Questa decisione viene solitamente presa tramite una funzione, openInternally
. Se questa funzione restituisce false
, indica che il link deve essere aperto esternamente, utilizzando la funzione shell.openExternal
.
Ecco un pseudocodice semplificato:
Le migliori pratiche di sicurezza di Electron JS sconsigliano di accettare contenuti non attendibili con la funzione openExternal
, poiché potrebbe portare a RCE attraverso vari protocolli. I sistemi operativi supportano diversi protocolli che potrebbero attivare RCE. Per esempi dettagliati e ulteriori spiegazioni su questo argomento, si può fare riferimento a questa risorsa, che include esempi di protocolli Windows in grado di sfruttare questa vulnerabilità.
Esempi di exploit di protocolli Windows includono:
Disabilitare contextIsolation
consente l'uso di <webview>
tag, simile a <iframe>
, per leggere ed esfiltrare file locali. Un esempio fornito dimostra come sfruttare questa vulnerabilità per leggere il contenuto di file interni:
Inoltre, viene condiviso un altro metodo per leggere un file interno, evidenziando una vulnerabilità critica di lettura di file locali in un'app desktop Electron. Questo comporta l'iniezione di uno script per sfruttare l'applicazione ed esfiltrare dati:
Se il chromium utilizzato dall'applicazione è vecchio e ci sono vulnerabilità note su di esso, potrebbe essere possibile sfruttarlo e ottenere RCE tramite un XSS. Puoi vedere un esempio in questo writeup: https://blog.electrovolt.io/posts/discord-rce/
Supponendo che tu abbia trovato un XSS ma non puoi attivare RCE o rubare file interni, potresti provare a usarlo per rubare credenziali tramite phishing.
Prima di tutto, devi sapere cosa succede quando provi ad aprire un nuovo URL, controllando il codice JS nel front-end:
La chiamata a openInternally
deciderà se il link sarà aperto nella finestra desktop poiché è un link appartenente alla piattaforma, o se sarà aperto nel browser come una risorsa di terze parti.
Nel caso in cui il regex utilizzato dalla funzione sia vulnerabile a bypass (ad esempio, non eseguendo l'escape dei punti dei sottodomini), un attaccante potrebbe abusare dell'XSS per aprire una nuova finestra che sarà situata nell'infrastruttura dell'attaccante richiedendo credenziali all'utente:
Electronegativity è uno strumento per identificare misconfigurazioni e anti-pattern di sicurezza nelle applicazioni basate su Electron.
Electrolint è un plugin open source per VS Code per applicazioni Electron che utilizza Electronegativity.
nodejsscan per controllare librerie di terze parti vulnerabili
Electro.ng: Devi acquistarlo
In https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s puoi trovare un laboratorio per sfruttare app Electron vulnerabili.
Al alcuni comandi che ti aiuteranno con il laboratorio:
Ulteriori ricerche e articoli sulla sicurezza di Electron in https://github.com/doyensec/awesome-electronjs-hacking
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)