「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript でのプロトタイプ汚染攻撃を防ぐ手順

JavaScript でのプロトタイプ汚染攻撃を防ぐ手順

2024 年 7 月 31 日に公開
ブラウズ:961

Steps to Preventing Prototype Pollution Attacks in JavaScript

Web セキュリティの世界では、プロトタイプの汚染は微妙ですが潜在的に壊滅的な脆弱性であり、適切に対処しないと重大な結果につながる可能性があります。このブログでは、プロトタイプ汚染とは何か、それがどのように発生するのか、そして最も重要なことに、それを防ぐ方法について探っていきます。飛び込んでみましょう!

プロトタイプ汚染とは何ですか?

プロトタイプ汚染は、JavaScript アプリケーションに影響を与える脆弱性の一種です。これは、攻撃者がオブジェクトのプロトタイプにプロパティを挿入できる場合に発生し、そのプロパティがこのプロトタイプを継承するすべてのオブジェクトに伝播する可能性があります。これにより、既存のメソッドやプロパティを上書きする機能など、予期しない動作が発生し、最終的にアプリケーションのセキュリティと機能が侵害される可能性があります。

プロトタイプ汚染はどのように起こるのか

プロトタイプ汚染がどのように発生するかを理解するには、JavaScript オブジェクトとプロトタイプを詳しく調べる必要があります。 JavaScript では、すべてのオブジェクトにプロトタイプがあり、最初のオブジェクトがプロパティとメソッドを継承する別のオブジェクトです。このプロトタイプの連鎖により、効率的なプロパティ検索が可能になりますが、正しく処理されない場合、潜在的な攻撃への扉も開かれます。

プロトタイプの汚染がどのように発生するかを示す簡単な例を次に示します:

let obj = {};
console.log(obj.constructor); // function Object() { [native code] }

obj.__proto__.polluted = true;
console.log({}.polluted); // true

この例では、obj の proto プロパティを変更することで、同じプロトタイプを共有するすべてのオブジェクトに誤って影響を及ぼし、プロトタイプ チェーンを汚染することがいかに簡単かを示しています。

実際のプロトタイプ汚染の例

ユーザー入力が適切な検証なしにオブジェクトの拡張またはマージに使用されるシナリオを考えてみましょう。一般的な使用例は、クエリ パラメーターを構成オブジェクトにマージすることです。

const merge = require('lodash/merge');

let config = {};
let query = JSON.parse('{"__proto__":{"admin":true}}');

merge(config, query);

console.log(config.admin); // undefined
console.log({}.admin); // true

この例では、Lodash ライブラリのマージ関数を使用して、構成とクエリを結合します。ただし、攻撃者が制御するクエリ オブジェクトには、グローバル オブジェクト プロトタイプを汚染し、すべてのオブジェクトに対して admin を true に設定する proto プロパティが含まれています。

プロトタイプ汚染の防止

プロトタイプの汚染からアプリケーションを保護するには、次の対策を導入することを検討してください。

1.ネイティブ プロトタイプの拡張を避ける: ネイティブ プロトタイプ (Object.prototype など) を直接拡張しないでください。競合やセキュリティ脆弱性が発生する可能性があります。

例: ネイティブ プロトタイプの拡張を避ける

これは避けてください:

Object.prototype.polluted = true; // ネイティブ プロトタイプの拡張 obj = {} にします。 console.log(obj.汚染); // 真実
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

代わりに、独自の名前空間内にユーティリティ メソッドを作成します:


const myUtils = { 汚染された: function() { // メソッドの実装 } }; obj = {} にします。 console.log(obj.汚染); // 未定義
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

2.ユーザー入力の検証: ユーザー入力を使用してオブジェクトを構築または変更する前に、必ずユーザー入力を検証してサニタイズしてください。 Joi や Validator などのライブラリを使用して、厳密な入力検証ルールを適用します。

例: Joi を使用したユーザー入力の検証


const Joi = require('joi'); const スキーマ = Joi.object({ 管理者: Joi.boolean().required() }); const input = JSON.parse('{"admin":true}'); const {エラー、値} = schema.validate(input); if (エラー) { console.error('無効な入力:', error.details); } それ以外 { console.log('有効な入力:', 値); }
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

3.安全なオブジェクト メソッドを使用する:

プロトタイプなしでプレーン オブジェクトを作成する Object.create(null) など、プロトタイプ チェーンを横断しない安全なオブジェクト メソッドを使用することを好みます。

例: 安全なオブジェクト メソッドを使用する


letsafeObj = Object.create(null); safeObj.admin = false; console.log(safeObj.constructor); // 未定義 console.log(safeObj.admin); // 間違い
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

4.プロトタイプをフリーズ:

プロトタイプ チェーンの変更を防ぐために、Object.prototype をフリーズします。これは、Object.freeze().

を使用して実行できます。

例: プロトタイプのフリーズ


Object.freeze(Object.prototype); obj = {} にします。 試す { obj.__proto__.polluted = true; } キャッチ (e) { console.error('プロトタイプを変更しようとして失敗しました:', e); } console.log({}.汚染された); // 未定義
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

5.依存関係の更新:

依存関係を定期的に更新して、セキュリティ パッチを含む最新バージョンを使用していることを確認します。サードパーティ ライブラリの脆弱性は、プロトタイプ汚染攻撃に悪用されることがよくあります。

例: npm を使用した依存関係の更新


npm アップデート
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

このコマンドを定期的に実行して、すべてのパッケージが最新であることを確認します。

6.監視とテスト: モニタリングと自動テストを実装して、プロトタイプ汚染の脆弱性を検出して軽減します。 npm Audit のようなツールは、プロジェクト内の脆弱なパッケージを特定するのに役立ちます。

例: npm Audit を使用したモニタリングとテスト


npm監査
Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

このコマンドを実行して、プロジェクトの脆弱性をスキャンします。見つかった問題のレポートが提供され、修復手順が提案されます。

結論

プロトタイプの汚染は重大な脆弱性であり、チェックしないままにしておくと広範囲に影響を及ぼす可能性があります。この問題がどのように発生するかを理解し、それを防ぐためのベスト プラクティスを実装することで、JavaScript アプリケーションのセキュリティを大幅に強化できます。この陰湿な攻撃ベクトルから保護するために、常に警戒し、依存関係を最新の状態に保ち、ユーザー入力を常に検証してください。

このブログが役立つと思われた場合は、他の開発者やセキュリティ愛好家と必ず共有してください。堅牢な Web セキュリティを維持するには、常に最新の情報を入手し、事前に対処することが重要です。コーディングを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rigalpatel001/steps-to-preventing-prototype-pollution-attachs-in-javascript-118g?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3