CyberGlossary

脆弱性

プロトタイプ汚染

別称: 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 を起こす。

関連用語