プロトタイプ汚染
プロトタイプ汚染 とは何ですか?
プロトタイプ汚染信頼できない入力により 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、安全なライブラリの採用などが含まれます。
● 例
- 01
JSON マージのエンドポイントに {"__proto__":{"isAdmin":true}} を送って、全体で admin 権限を得る。
- 02
プロトタイプを汚染してテンプレートのレンダリング設定を改ざんし、RCE を起こす。
● よくある質問
プロトタイプ汚染 とは何ですか?
信頼できない入力により Object.prototype を書き換え、全オブジェクトにプロパティを混入させて挙動を変える、場合によっては RCE に至る JavaScript の脆弱性。 サイバーセキュリティの 脆弱性 カテゴリに属します。
プロトタイプ汚染 とはどういう意味ですか?
信頼できない入力により Object.prototype を書き換え、全オブジェクトにプロパティを混入させて挙動を変える、場合によっては RCE に至る JavaScript の脆弱性。
プロトタイプ汚染 からどのように防御しますか?
プロトタイプ汚染 に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
プロトタイプ汚染 の別名は何ですか?
一般的な別名: Object.prototype 汚染, __proto__ インジェクション。