脆弱性
プロトタイプ汚染
別称: Object.prototype 汚染, __proto__ インジェクション
定義
信頼できない入力により Object.prototype を書き換え、全オブジェクトにプロパティを混入させて挙動を変える、場合によっては RCE に至る JavaScript の脆弱性。
プロトタイプ汚染は JavaScript のプロトタイプチェーンを悪用します。merge/clone/assign の最中に __proto__、constructor.prototype、prototype などのキーを設定することで、Object.prototype が改変され、すべての通常オブジェクトがそのプロパティを継承します。再帰的マージユーティリティ、ディープクローン、クエリ文字列パーサ、ユーザー由来 JSON を扱うテンプレートエンジンに多く見られます。DoS や認証バイパスから、isAdmin、サンドボックス、レンダリング設定などセキュリティに影響するプロパティが書き換えられた場合の RCE に至ります。代表的な CVE には lodash CVE-2019-10744 や Node.js 系の多数のバグがあります。対策には、__proto__/constructor キーの拒否、信頼できないデータには Map や Object.create(null) を使用、プロトタイプの Object.freeze、安全なライブラリの採用などが含まれます。
例
- JSON マージのエンドポイントに {"__proto__":{"isAdmin":true}} を送って、全体で admin 権限を得る。
- プロトタイプを汚染してテンプレートのレンダリング設定を改ざんし、RCE を起こす。
関連用語
安全でないデシリアライゼーション
アプリが信頼できないデータをデシリアライズすることで、攻撃者が任意オブジェクトを生成し、しばしばリモートコード実行に至る脆弱性。
マスアサインメント (Mass Assignment)
アプリがクライアントから渡されたフィールドを無検証で内部オブジェクトのプロパティに紐付け、攻撃者が本来制御すべきでない属性を書き換えてしまう脆弱性。
Input Validation
Input Validation — definition coming soon.
アクセス制御の不備
認可ルールが欠落または誤って適用され、ユーザーが本来の権限を超えた操作やデータにアクセスできてしまう脆弱性カテゴリ。
サプライチェーン攻撃
信頼されたサードパーティのソフトウェア・ハードウェア・サービス提供者を侵害し、その下流顧客に到達する攻撃。