Shikata Ga Nai

Private? There is no such things.

Prototype Pollution(プロトタイプ汚染)診断マニュアル

Hello there, ('ω')ノ

🎯 1. Prototype Pollution(プロトタイプ汚染)とは?

Prototype Pollution(プロトタイプ汚染)は、JavaScriptのオブジェクト継承機構(__proto__constructor.prototype)を悪用し、 アプリ全体のオブジェクトの挙動を汚染・改変する攻撃です。

JavaScriptではすべてのオブジェクトが Object.prototype を継承しています。 攻撃者がそこに悪意あるプロパティを追加すると、他のすべてのオブジェクトに影響が及びます。


🧨 2. 何が起こるのか?(影響例)

攻撃結果 内容
🛑 権限昇格 isAdmin=true を全体に挿入してバイパス
🕵️‍♂️ 情報漏洩 特定の値をグローバルに付与して出力させる
🔄 挙動改変 処理フローやロジックが意図せず書き換わる
💥 DoS 意図しないループ・無限プロパティなどでクラッシュ

📘 3. 攻撃の基本構文

プロトタイプ汚染の典型例は以下のようなパラメータで発生します:

{
  "__proto__": {
    "isAdmin": true
  }
}

または URL パラメータ経由:

?__proto__[isAdmin]=true

これにより、後続で生成された任意のオブジェクトに isAdmin=true既定値として設定される可能性があります。


🧪 4. 診断対象となる機能

対象機能 備考
JSONベースのAPI 特にネストしたオブジェクトを受け付けるもの
URLクエリパラメータをオブジェクトに変換する処理 qs, lodash, merge などのライブラリが使われていると危険
入力値を直接 Object.assign()merge() する処理 攻撃可能性あり

🔍 5. 診断手順(基本)

Step 1️⃣:入力ポイントを探す

  • JSONリクエストボディ
  • クエリパラメータ(?x[y]=z のような形式)
  • フォームパラメータ(x[y]=z

Step 2️⃣:プロトタイプ汚染ペイロードを送信

例(JSON):

{
  "__proto__": {
    "polluted": "yes"
  }
}

または(クエリパラメータ):

?__proto__[polluted]=yes

Step 3️⃣:後続リクエストやレスポンスで影響を確認

let obj = {};
console.log(obj.polluted); // → "yes" が出たら汚染成功

✅ 6. 診断成功のサイン

サイン 意味
新規生成オブジェクトに攻撃者の値が含まれる 汚染成功
ユーザの権限判定がバイパスされる isAdmin=true による特権化
アプリの動作が異常になる 処理ロジックの改変・クラッシュなど

🧰 7. 診断ツール・補助スクリプト

ツール 用途
Burp Suite 手動でパラメータ操作に最適
qs パッケージの理解 サーバが使っていればクエリ→オブジェクト変換が攻撃に使える
pollution テストスクリプト(Node.jsで自作) console.log({}.polluted) などを使った検証

🔐 8. 安全な実装のための防御策

防御方法 説明
__proto__, constructor, prototype のキーをフィルター 入力段階で除外すること
安全なマージ処理を使う deepmerge など、汚染対策済みのライブラリ利用
Object.create(null) を使う プロトタイプ継承のないオブジェクト生成
入力をバリデーションする ajv などのスキーマバリデーションを使うと良い

📌 見つけやすいヒント

  • クエリで [key]=value のようなネスト構造を使っている
  • JSONリクエストでオブジェクトのキー構造をそのまま使用
  • バックエンドが Node.js / Express / NestJS / Fastify 等
  • qs, lodash, merge, deep-extend などが依存に含まれる

✅ チェックリストまとめ

チェック項目 ✔ / ✘
__proto__ 経由で値がオブジェクト全体に伝播するか?
入力値の中に polluted, isAdmin, debug などを追加して影響が出るか?
クエリ/フォーム/JSON いずれかでネスト構造が使えるか?
再起的マージ関数(merge, assignDeep)が使用されているか?

プロトタイプ汚染は一見地味ですが、Node.jsアプリケーションを中心に重大な影響を与えることがある、ロジックベースの高度な脆弱性です。 他の脆弱性(XSS、認可バイパス、DoS)と組み合わせて攻撃されやすいため、しっかりとした検証が重要です。

Best regards, (^^ゞ