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, (^^ゞ