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