CSRF(クロスサイト・リクエスト・フォージェリ)の仕組み

CSRF(クロスサイト・リクエスト・フォージェリ)とは?その仕組みと対策方法について

どーもー、某ITベンチャー企業に勤めるエンジニアです。

先日、当社では年に一度のセキュリティ診断がおこなわれ、私が担当するサービスも指摘を受けました。

その一つが、「CSRF(クロスサイト・リクエスト・フォージェリ)」というハッキングの脆弱性でした。

「CSRF?」

これまで、この「CSRF」についてあまり理解していなかった部分があるので、今回は理解していく意味合いも含めて、当記事にその仕組や対策についてまとめていきたいと思います。

以下、目次。

  1. CSRFの仕組みと脆弱性について
  2. CSRFの対策方法

CSRF(クロスサイト・リクエスト・フォージェリ)とは。。その仕組みと脆弱性について

CSRFとは、クロスサイト・リクエスト・フォージェリ。

”フォージェリ” って何?って感じですが、調べてみると「偽造」って意味。

だから、クロスサイト・リクエスト・フォージェリ・・・他のサイト(攻撃対象のサイト)へのリクエストを偽造する。といった意味なります。

まあその通りなんですね。

例えば、以下のような「Aサイトのアカウント変更画面」があるとしましょう。

クロスサイト・リクエスト・フォージェリの仕組み図-1

上記は、各アカウント情報を入力して「変更」ボタンを押すことで、アカウント情報が更新される!といった流れになります。

ただここで、「Aサイトのアカウント変更画面」に似せて作った(偽造した)、「攻撃者の用意したアカウント変更画面」があります。

そして、その偽画面のURLを、正規のAサイトのログイン済みユーザー(Bさん)に送りつけ、Bさんは間違って偽画面から、アカウント変更をリクエストしてしまいます。。。

そして、Bさんの意図せぬアカウント情報で更新されてしまうハメに。。。

※ログイン済みユーザーなので、有効なCookieの認証情報とともにリクエストを送ってしまうわけですね。

これが、「CSRF:クロスサイト・リクエスト・フォージェリ」というわけです。

要は、本来の正しい画面(ページ)からのリクエスト以外のリクエストも受けつけてしまう脆弱性なわけです。。

この脆弱性によって、被害を受けたユーザーのアカウントが乗っ取られたり、知らぬうちに情報が変更されていたり。。。といった事につながるわけですね。

(iframeからフォーム送信することで、ユーザーに気づかれずにリクエストを送信することも可能となります)

以上が、CSRFの仕組み、脆弱性になります。

CSRF(クロスサイト・リクエスト・フォージェリ)の対策方法

クロスサイト・リクエスト・フォージェリの対策-1

続いて、対策方法についてです。

何にも対策しないと、上述の通り、ユーザーのアカウントが乗っ取られたり、勝手に情報が書き換えられたりしますからね。

対策は、大きく以下の3つ。

  1. ユーザーによる再認証をおこなう

    上述のように、アカウント情報を変更させたり、パスワード情報を変更させるような重大な処理の前には、再度ログイン認証をさせるステップを追加すれば、CSRFの対策になります。

    ただこの方法の場合、ユーザーが再認証をしなければいけない手間が増えてしまうといったデメリットがありますが。。

    「あれ、さっきログインしたのに、またログインしなければいけないのかよ。。」ってな感じに。。

  2. リファラ(参照元URL)をチェックする

    こちらは、どこからリクエストがきているのかをチェックする方法です。

    同じサイト内からきているのか・・それとも、別のサイト(攻撃者のサイト)からきているのか・・

    当然、別のサイトからのリクエストについては遮断する必要があります。

    そして、それを確認できるのが、HTTPリクエストヘッダーのリファラ情報(参照元URL)です。

    ここを確認することで、「どこから来ているのか」をチェックすることができます。

    ただここで問題なのですが、そもそもHTTPリクエストヘッダーのリファラ情報自体を変更されてしまうことが可能な事

    変更されてしまったらどうしようもありませんし、変更自体は容易にできてしまいます

  3. トークン(token)を利用する

    おそらく、今回挙げたCSRF(クロスサイト・リクエスト・フォージェリ)への対策方法で、一番良いのがこの「トークン」の利用です。

    トークン:乱数等、不規則の文字列データ。

    例えば、上述しているアカウント変更画面(以下)

    クロスサイト・リクエスト・フォージェリの画面例-1

    こちらの画面を開いたときに、ワンタイムトークンを発行します(また同じ情報をサーバー側にも保持させます)

    で、そのトークン情報をHTTPリクエストのパラメーターに設定し、サーバー側でアカウント変更処理をおこなう前に、トークンのチェックをおこなうわけです。

    ユーザーが送ってきたトークンと、サーバー側で保持しているトークン情報比較し、同じであれば更新処理を実行させる!といった流れですね。

    これで、正規の画面からのリクエストじゃないと、受け付けないようにするチェックをすることが出来ます。

以上が、CSRF(クロスサイト・リクエスト・フォージェリ)の対策方法になります。

というわけで今回は、CSRFについて仕組みや対策をまとめてきました。

また、CSRF以外にも、Webアプリケーション上で有名な脆弱性・ハッキングについて、(XSS(クロスサイトスクリプティング)やSQLインジェクション等)

以下にまとめているので、よかったら参考にしてください。

→ ハッキング対策まとめ!自分のサイトを守るためにやっておかなければならない10のこと

では。

コメントを残す

メールアドレスが公開されることはありません。