パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

正しいCSRF対策、してますか?」記事へのコメント

  • ここではあまり触れられませんでしたが、掲示板などの会員制でないWebページでのCSRF対策についてです。

    例として掲示板を取り上げ、掲示板の投稿フォームを (1)、掲示板の投稿処理を行うページ(フォームの送信先)を (2) とします。

    まず、よくやりそうで駄目な対策から、

    • ワンタイムトークン(hiddenに埋め込み)を使う(却下)

      高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法 [takagi-hiromitsu.jp]でも指摘されていますが、
      セッションIDやワンタイムトークンをFORMのhiddenに含めて対策を行うと、攻撃者がソケット通信などで (1) のワンタイムトークンを取得して、罠ページのhidden情報にそのトークンを注入して送信先を (2) にすることで、回避できてしまいます。(Session Fixation攻撃)

    • ワンタイムトークン(Cookie)を使う(却下)

      攻撃者が Session Fixation攻撃 でトークンを取得することができるが、その取得したトークンを罠ページを踏んだクライアントが (2)Cookieとして送信させるように仕向けることはできない。

      しかし、罠ページでimg要素やiframe要素を使い正規のユーザを (1) にアクセスさせれば、ワンタイムトークンを正規のユーザが取得し、(2) に対して送信してしまうことになる。

      従って、CSRF対策にならない。

    • (1) にアクセスしたクライアントのIPアドレスと、(2) で投稿処理を行ったクライアントのIPアドレスの一致を確認する(却下)

      罠ページimg要素やiframe要素によって正規のユーザを (1) にアクセスさせることもできるのでCSRF対策にならない。

    • (1) でワンタイムトークンを2つ発行する。(1つ目はCookieとして、2つは目hiddenに含める)

      Cookieはクライアントをimg要素やiframe要素で (1) に誘導して保存させ、
      hidden情報は攻撃者がSession Fixation攻撃を行って盗める。

      駄目な方法を複数組み合わせたところで、攻撃者の手間を増やすだけで完全な対策にはならない。

    次に自分で考えてみた、CSRF対策になりそうな方法です。

    • Refererを確認する

      CSRF対策になる。

      ただし、Referarを送信しないクライアント等は保護できない。(もしくは利用できなくする必要がある。)

    • (1) でワンタイムトークン(hiddenへの埋め込み)を発行し、(2) で投稿処理を行う際にワンタイムトークンの一致とクライアントのIPアドレスを確認する

      罠ページでimg要素やiframe要素を使って正規のユーザを (1) にアクセスさせることもできるが、その場合ブラウザにセキュリティホールが無い限り攻撃者がワンタイムトークンを取得したり、罠フォームに注入することはできない。

      CSSXSSの脆弱性のあるクライアントを保護するには (1) をPOSTメソッドでのアクセスのみに表示する必要がある。

      Session Fixation攻撃が行われたとしても、その場合はIPアドレスが一致しないため投稿を拒否できる。

      ちなみに、ここでワンタイムトークンの発行にCookieを利用すると、罠ページに仕掛けられたimg要素やiframe要素から (1) にアクセスさせCookieをクライアントに保存させることが可能で、罠フォームからのPOSTであってもCookieが送信されるため、CSRF対策にはらならい。

      正規のユーザのIPアドレスが途中で変動した場合には投稿処理が行えなくなる。

    間違いなどがありましたら、ご指摘頂けたら幸いです。

    • > 掲示板などの会員制でないWebページ
      そもそも「高木方式」は会員制でないWebアプリケーションを対象にしていないわけだが。
      なんでこうも前提条件を(読まない|読めない)奴ばっかなの?
      • > そもそも「高木方式」は会員制でないWebアプリケーションを対象にしていないわけだが。
        > なんでこうも前提条件を(読まない|読めない)奴ばっかなの?

        クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法 [takagi-hiromitsu.jp]を良くお読みください。

        不適切な解説の例

        ログインなしのWebアプリケーションに対するCSRF攻撃(掲示板荒らし)を防止するには、セッションIDやワンタイムトークンを使えばよい。*6

        *6 Session Fixation攻撃によって回避される。

        このように「ログインなしのWebアプリケーションに対するCSRF攻撃」について書かれており、 それを参考にしたことを、

        > 高木浩光@自宅の日記 - クロスサイトリクエストフォージェリ(CSRF)の正しい対策方法 [takagi-hiromitsu.jp]でも指摘されていますが、

        と表記しました。
        ちなみに「高木方式」という言葉は一切使っていません。

        親コメント

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

処理中...