CSRF攻撃からの保護方法

CSRF攻撃とは何ですか?


古典的なリソースに対するCSRF攻撃のアイデアに精通することができます。



SOへの回答からの抜粋:

CSRFの理由は、アクションがユーザーによって明示的に実行されたか( たとえば、フォーム上のボタンをクリックするか、リンクをたどるなど )、ユーザーがこのアクションを誤って実行したかどうか( たとえば、リソースでbad.comしたとき )を区別する方法をブラウザーが理解しないという事実にありますユーザーが既にgood.comログインしている間にリクエストがgood.com/some_actionに送信されました )。


それから身を守る方法は?


CSRF攻撃から保護する効果的で一般的に受け入れられた方法はトークンです。 トークンとは、サーバーがクライアントに送信するランダムなバイトセットを意味し、クライアントはサーバーに戻ります。


保護は、サーバーが生成したトークンとユーザーが送信したトークンをチェックすることになります。


そして、実際には、何を保護するのですか?


RFC7231標準に従ってWebサービスを作成する場合、 GETHEADOPTIONSおよびTRACEメソッドは安全です。これらは情報の受信のみを目的としており、サーバーの状態を変更すべきではありません。


したがって、 POSTPUTDELETEPATCH安全でないメソッドを保護する必要があります。


Yandexの記事がHabrahabrに公開されました。これは、標準に従って、サービスを作成する必要がある理由を説明しています


トークンの要件:



最初のMeetUp PDUGで Timur Yunusov( 銀行セキュリティ責任者
Positive Technologiesシステム 、まさにそのような要件がCSRFトークンに課されている理由と、それらを無視する脅威となるものを説明しました。


Webサービスと環境の要件:



セキュリティ方法


トークンを使用してWebサービスをCSRF攻撃から保護するには、3つの方法があります。



シンクロナイザートークン


どこでも使用される単純なアプローチ。 サーバー側にトークンストレージが必要です。


要点:

  1. サーバー側でセッションが開始されると、トークンが生成されます。


  2. トークンはセッションデータストアに配置されますつまり、後で検証するためにサーバー側に保存されます


  3. セッションを開始した )要求への応答で、トークンがクライアントに返されます。


    サーバーレンダリングが行われる場合、トークンはフォームフィールドの1つなどのHTML内、または<meta>タグ内に返されます。


    JSアプリケーションに対して応答が返された場合、トークンをヘッダーに渡すことができます( 多くの場合、 X-CSRF-Tokenこれに使用されます


  4. 後続のリクエストでは、クライアントは検証のためにサーバーにトークンを渡す必要があります。


    サーバーがコンテンツをレンダリングするとき、フォームdataのPOST内でトークンを返すのが慣例です。


    JSアプリケーションは通常、トークンを含むヘッダーX-CSRF-Token )でXHR要求を送信します。


  5. 安全でないメソッド( POSTPUTDELETEPATCH )がリクエストを受信すると、サーバーはセッションデータクライアントが送信したトークンからトークンのIDを確認する必要があります


    両方のトークンが一致する場合、リクエストはCSRF攻撃を受けませんでした。それ以外の場合、イベントをログに記録し、リクエストを拒否します。



出力には次のものがあります。



このアプローチで 、サーバー側のデータストレージ必要ありません 。つまり、 ステートレスです。 Webサービスを迅速かつ効率的に水平方向に拡張できるようにする場合に使用します。
アイデアは、Cookie、応答パラメーターヘッダーまたはHTML内 )の2つの方法でトークンをクライアントに提供することです。


要点:

  1. クライアントから要求されると、サーバー側でトークンが生成されます。 応答では、トークン(たとえばX-CSRF-Token )と応答パラメーターの1つヘッダーまたはHTML内 )でトークンが返されます


  2. 後続のリクエストでは、クライアントは以前に受信した両方のトークンを提供する必要があります。 1つはCookieとして、もう1つはヘッダーまたはフォームdataのPOST内にあります


  3. 安全でないメソッド( POSTPUTDELETEPATCH )による要求の受信時に、サーバーは、Cookieトークンとクライアントが明示的に送信したトークンのID 検証する必要があります


    両方のトークンが一致する場合、リクエストはCSRF攻撃を受けませんでした。それ以外の場合、イベントをログに記録し、リクエストを拒否します。



出力には次のものがあります。


暗号化されたトークン


Double Submitと同様に、 ステートレスアプローチです。 主な理由は、信頼性の高いアルゴリズムでデータを暗号化してクライアントに送信すると、クライアントはキーを知らないと偽造できないということです。 このアプローチでは、Cookieを使用する必要はありません。 トークンは、応答パラメーターでのみクライアントに送信されます。


このアプローチでは、 トークンはキーで暗号化された事実です。 最低限必要な事実は、 ユーザーIDとトークン生成時間のタイムスタンプです。 キーはクライアントに知られるべきではありません。


要点:

  1. クライアントから要求されると、サーバー側でトークンが生成されます。


    トークン生成は、将来トークンを検証するために必要なファクトを暗号化することで構成されます。


    最低限必要な事実は、 ユーザーIDタイムスタンプです。 応答では、トークンは応答パラメーターの1つヘッダー内またはHTML内 )で返さ ます


  2. 後続のリクエストでは、クライアントは以前に受信したトークンを提供する義務があります。


  3. 安全でないメソッド( POSTPUTDELETEPATCH )がリクエストを受信すると、サーバーはクライアントから受信したトークンを検証する必要があります。


    トークンの検証は、その解読と、解読後に得られた事実と実際の事実の比較から成ります。 ( タイムスタンプチェックは、トークンの有効期間を制限するために必要です)


    復号化できなかった、または事実が一致しない場合、リクエストはCSRF攻撃を受けたと見なされます。



出力には次のものがあります。


実装について



他に何を知る必要がありますか?


トークンは、CSRFに対する必須の保護です。



同じサイト


現在、Cookie(執筆時点での最新バージョン)の「同じサイト」属性の仕様に取り組んでいます。


この属性により、開発者は、Cookieが設定されているサイト以外のサイトからリクエストが送信された場合、Cookieを送信する必要がないことを明示的に示すことができます。 それは、追加のツールを使用せずに、CSRFからリソースを保護する機会があることを意味します。


Chromeブラウザはすでにこの機能をサポートしています。


Stack Exchangeで利用可能な方法と理由に関する詳細情報を入手できます。



Source: https://habr.com/ru/post/J318748/


All Articles