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 kombinuje lokalni backend (sa NodeJS) i frontend (Chromium), iako mu nedostaju neki od bezbednosnih mehanizama modernih pregledača.
Obično možete pronaći kod electron aplikacije unutar .asar
aplikacije, da biste dobili kod potrebno je da ga ekstrahujete:
U izvor kodu Electron aplikacije, unutar packet.json
, možete pronaći navedenu main.js
datoteku gde su postavljene sigurnosne konfiguracije.
Electron ima 2 tipa procesa:
Glavni proces (ima potpun pristup NodeJS-u)
Proces renderovanja (treba da ima ograničen pristup NodeJS-u iz bezbednosnih razloga)
Proces renderovanja će biti prozor pregledača koji učitava datoteku:
Podešavanja renderer procesa mogu se konfigurisati u main procesu unutar main.js datoteke. Neka od podešavanja će sprečiti Electron aplikaciju da dobije RCE ili druge ranjivosti ako su podešavanja pravilno konfigurisana.
Electron aplikacija može pristupiti uređaju putem Node apija, iako se može konfigurisati da to spreči:
nodeIntegration
- je isključen
po defaultu. Ako je uključen, omogućava pristup node funkcijama iz renderer procesa.
contextIsolation
- je uključen
po defaultu. Ako je isključen, glavni i renderer procesi nisu izolovani.
preload
- prazan po defaultu.
sandbox
- je isključen po defaultu. Ograničiće radnje koje NodeJS može izvesti.
Node integracija u radnicima
nodeIntegrationInSubframes
- je isključen
po defaultu.
Ako je nodeIntegration
omogućen, to bi omogućilo korišćenje Node.js API-a na web stranicama koje su učitane u iframovima unutar Electron aplikacije.
Ako je nodeIntegration
onemogućen, tada će preload-ovi učitati u iframe.
Primer konfiguracije:
Neki RCE payloads sa ovde:
Izmenite start-main konfiguraciju i dodajte korišćenje proksija kao što su:
Ako možete lokalno izvršiti Electron aplikaciju, moguće je da možete izvršiti proizvoljni JavaScript kod. Proverite kako u:
macOS Electron Applications InjectionAko je nodeIntegration postavljen na on, JavaScript web stranice može lako koristiti Node.js funkcije jednostavno pozivajući require()
. Na primer, način za izvršavanje calc aplikacije na Windows-u je:
Skripta navedena u ovoj postavci se učitava pre drugih skripti u rendereru, tako da ima neograničen pristup Node API-ima:
Stoga, skripta može da eksportuje node-features na stranice:
Ako je contextIsolation
uključen, ovo neće raditi
contextIsolation uvodi odvojene kontekste između skripti web stranice i unutrašnjeg JavaScript koda Electron-a tako da izvršavanje JavaScript-a svakog koda ne utiče na druge. Ovo je neophodna funkcija za eliminaciju mogućnosti RCE.
Ako konteksti nisu izolovani, napadač može:
Izvršiti arbitrarni JavaScript u renderer-u (XSS ili navigacija na spoljne sajtove)
Prepisati ugrađenu metodu koja se koristi u preload-u ili unutrašnjem kodu Electron-a na svoju funkciju
Pokrenuti korišćenje prepisane funkcije
RCE?
Postoje 2 mesta gde se ugrađene metode mogu prepisati: U preload kodu ili u unutrašnjem kodu Electron-a:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCAko postoje ograničenja primenjena kada kliknete na link, možda ćete moći da ih zaobiđete srednjim klikom umesto običnim levim klikom.
Za više informacija o ovim primerima pogledajte https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 i https://benjamin-altpeter.de/shell-openexternal-dangers/
Kada se implementira Electron desktop aplikacija, osiguranje ispravnih podešavanja za nodeIntegration
i contextIsolation
je ključno. Utvrđeno je da izvršavanje daljinskog koda na klijentskoj strani (RCE) koje cilja preload skripte ili Electron-ov nativni kod iz glavnog procesa efikasno sprečava sa ovim podešavanjima.
Kada korisnik interaguje sa linkovima ili otvara nove prozore, aktiviraju se specifični slušaoci događaja, koji su ključni za bezbednost i funkcionalnost aplikacije:
Ovi slušatelji su prepisani od strane desktop aplikacije kako bi implementirali svoju poslovnu logiku. Aplikacija procenjuje da li bi navigirani link trebao biti otvoren interno ili u spoljašnjem web pretraživaču. Ova odluka se obično donosi putem funkcije, openInternally
. Ako ova funkcija vrati false
, to ukazuje da link treba biti otvoren spolja, koristeći funkciju shell.openExternal
.
Evo pojednostavljenog pseudokoda:
Electron JS sigurnosne najbolje prakse savetuju protiv prihvatanja nepouzdanog sadržaja sa funkcijom openExternal
, jer to može dovesti do RCE kroz različite protokole. Operativni sistemi podržavaju različite protokole koji mogu pokrenuti RCE. Za detaljne primere i dalja objašnjenja o ovoj temi, može se konsultovati ovaj resurs, koji uključuje primere Windows protokola sposobnih za iskorišćavanje ove ranjivosti.
Primeri Windows protokolskih eksploatacija uključuju:
Onemogućavanje contextIsolation
omogućava korišćenje <webview>
tagova, sličnih <iframe>
, za čitanje i eksfiltraciju lokalnih fajlova. Primer koji je dat pokazuje kako iskoristiti ovu ranjivost za čitanje sadržaja internih fajlova:
Dalje, podeljena je još jedna metoda za čitanje internog fajla, ističući kritičnu ranjivost čitanja lokalnih fajlova u Electron desktop aplikaciji. Ovo uključuje injektovanje skripte za iskorišćavanje aplikacije i eksfiltraciju podataka:
Ako je chromium koji koristi aplikacija stari i postoje poznate ranjivosti na njemu, može biti moguće iskoristiti ga i dobiti RCE putem XSS. Možete videti primer u ovom writeup: https://blog.electrovolt.io/posts/discord-rce/
Pretpostavljajući da ste pronašli XSS, ali ne možete aktivirati RCE ili ukrasti interne fajlove, mogli biste pokušati da ga iskoristite za krađu kredencijala putem phishinga.
Prvo što treba da znate je šta se dešava kada pokušate da otvorite novu URL adresu, proveravajući JS kod u front-endu:
Poziv na openInternally
će odlučiti da li će link biti otvoren u desktop prozoru kao link koji pripada platformi, ili će biti otvoren u pregledaču kao resurs treće strane.
U slučaju da je regex koji koristi funkcija ranjiv na zaobilaženje (na primer, ne beži tačke subdomena) napadač bi mogao da iskoristi XSS da otvori novi prozor koji će biti smešten u infrastrukturi napadača tražeći kredencijale od korisnika:
Electronegativity je alat za identifikaciju loših konfiguracija i sigurnosnih anti-šablona u aplikacijama zasnovanim na Electron-u.
Electrolint je open source VS Code dodatak za Electron aplikacije koji koristi Electronegativity.
nodejsscan za proveru ranjivih biblioteka trećih strana
Electro.ng: Morate ga kupiti
Na https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s možete pronaći laboratoriju za eksploataciju ranjivih Electron aplikacija.
Neke komande koje će vam pomoći u laboratoriji:
Više istraživanja i članaka o Electron bezbednosti na https://github.com/doyensec/awesome-electronjs-hacking
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)