プロトタイプ汚染攻撃を防ぐには?

Purototaipu Wu Ran Gong Jiwo Fangguniha



プロトタイプ汚染攻撃は、JavaScript オブジェクトが対応するプロトタイプを処理する方法を悪用します。 JavaScript では、プロトタイプは、選択したオブジェクトのデフォルトのプロパティとメソッドを定義する別のオブジェクトです。攻撃者は、オブジェクトのプロパティを操作するか、オブジェクトを再帰的にマージする関数を使用して、これらのプロトタイプに悪意のあるコードを挿入することで、プロトタイプ汚染を悪用します。

このガイドでは、プロトタイプ汚染攻撃を防ぐ方法について説明します。







プロトタイプの汚染攻撃を防ぐには?

プロトタイプ汚染攻撃の根本原因は、JavaScript オブジェクトがプロトタイプからプロパティを継承することです。これは、攻撃者がプロトタイプに悪意のあるコードを挿入できる場合、そのプロトタイプから継承されたすべてのオブジェクトにそのコードが継承されることを意味します。これにより、データが盗まれたり、任意のコードが実行されたり、他のアプリケーションが制御されたりする可能性があります。



以下のコード スニペットでは、プロトタイプの汚染コードが挿入されます。



定数y = { 答え: 1 、b: 2 } ;
const データ = JSON.parse ( '{'__proto__': { '欠陥': true}}' ) ;

const c = オブジェクト.代入 ( { } 、および、データ ) ;
コンソール.ログ ( c.欠陥がある ) ;


上記のコード スニペットの説明:





    • まず、「」という名前のリスト そして ” が作成され、値がキーと値のペアに保存されます。
    • 「」の助けを借りて -したがって- 」では、ランダムに汚染されたコードがキーと値の形式で実装されます。キーは「」に設定されています 欠陥のある ” と割り当てられた値” 真実 ”。
    • 次に、この汚染されたコードは「」に割り当てられます。 そして ” リストを呼び出して、” 割当() 」メソッドを実行し、結果のリストは「」という名前の新しいリストに保存されます。 c ”。
    • 最後に、「」に注入された汚染されたコード c 」リストが取得され、その値がコンソールに表示されます。汚染または悪意のあるデータが挿入されていることを確認するため。

含まれているファイルを実行すると、悪意のあるコードが正常に挿入され、その値が取得されたことが出力に表示されます。



プロトタイプ汚染攻撃を防ぐには?

プロトタイプ汚染攻撃を防ぐ方法はいくつかあります。

安全でない再帰的マージ:

プロトタイプ汚染攻撃につながる可能性があるため、安全でない再帰的マージは避けてください。

ここでマージ = ( かかります 、ソース ) = > {
のために ( var 属性 送信元 ) {
もし ( の種類 ( かかります [ 属性 ) === 「オブジェクト」 && の種類 ( 送信元 [ 属性 ) === 「オブジェクト」 )
{
マージ ( かかります [ 属性 、ソース [ 属性 ) ;
} それ以外 {
かかります [ 属性 = ソース [ 属性 ;
}
}
戻る かかります ;
} ;


上記のコードでは次のようになります。

    • まずはカスタム関数「 マージ() 2 つの配列パラメータを受け入れる「」が作成されます。 かかります ' そして ' 送信元 ”。
    • 強化された「 のために 「ループは変数を反復するために利用されます」 属性 「提供されたものを超えて」 送信元 ”パラメータ。
    • ループ内で「」を利用します。 もし 」ステートメントを使用して、両方のエラーをナビゲートし、両方の配列に存在する要素のデータ型が同じかどうかを確認します。次に、それらの要素がパラメータとして同じ「 マージ() 」関数は再帰的な性質を生み出します。
    • 型が同じでない場合、「」にある要素の値は 送信元 ”パラメータ配列は”に渡されます。 かかります ”パラメータ。
    • 最後に、「 かかります ” パラメトリック配列が返されます。

プロトタイプのフリーズ

プロトタイプ汚染攻撃のもう 1 つの防止策は、実行サイクルを凍結することです。これは「 Object.freeze() ' 方法。以下のスニペットでは、上記で注入されたプロトタイプ化された汚染されたコードが凍結されます。

定数y = { 答え: 1 、b: 2 } ;
const データ = JSON.parse ( '{'__proto__': { '欠陥': true}}' ) ;

const c = オブジェクト.代入 ( { } 、および、データ ) ;
コンソール.ログ ( c.欠陥がある ) ;

コンソール.ログ ( オブジェクト.フリーズ ( c.欠陥がある ) ) ;
コンソール.ログ ( Object.isFrozen ( c.欠陥がある ) ) ;


上記のコードの説明を以下に示します。

    • 最初は、ダミーのプロトタイプの汚染されたコードがダミーのリストに挿入されます。 そして 」 上のセクションで説明したとおりです。
    • 次に、注入された汚染されたキー「 欠陥のある ” は” に渡されます。 氷結() 」汚染部分を凍結させる方法です。
    • 最後に凍結試作汚染部分の確認へ。 ” 欠陥のある 「リストのキー」 c ” は” に渡されます。 凍らされた() ' 方法。このメソッドは「 真実 「冷凍の場合」と「 間違い ” 凍結されていない場合:

含まれているコードを実行した後の出力には、凍結された汚染されたコードの挿入、凍結、および検証が行われたことが示されます。


プロトタイプ汚染攻撃を防ぐための追加のヒント

プロトタイプ汚染攻撃を防ぐための追加のヒントを以下に示します。

    • 「」のオプション –プロトを無効にする 」を使用すると、「」の動作を無効にしたり停止したりできます。 プロトタイプ.__proto__ ' 財産。
    • 「」の助けを借りた方法を使用しないでください。 プロトタイプ ”。
    • による ' ユーザー入力のサニタイズ これには、ユーザー入力を検証およびフィルタリングして、悪意のあるコードまたは汚染されたコードを削除することが含まれます。
    • 「」の使用 ホワイトリスト これは、オブジェクトに許可されるプロパティとメソッドのリストです。ホワイトリストのメンバーではないプロパティまたはメソッドを設定または取得しようとする試みはブロックされます。

Node.js におけるプロトタイプ汚染攻撃の防止については以上です。

結論

プロトタイプ汚染攻撃を防ぐには、安全でない再帰的マージの回避、プロトタイプの凍結、および「」を防ぐためのホワイトリストの使用などのアプローチが必要です。 __したがって__ ”プロパティが設定されている場合は使用できます。 』の活用とともに、 –プロトを無効にする ” オプション、” の使用を避ける オブジェクト.プロトタイプ '、 そして ' ユーザー入力のサニタイズ ” 汚染されたコードの場合。このガイドでは、Nodejs におけるプロトタイプ汚染攻撃の防止について説明しました。