CSRF

CSRF(クロスサイトリクエストフォージェリ)とは?【セキュリティ】

ネットワークにおける脆弱性には様々なものがありますが、今回はその中の1つ、CSRFについて説明していきます。

CSRFとは

CSRF(クロスサイトリクエストフォージェリ)とは、Cross-Site Request Forgeriesの略で、別のサイトを通して(クロスサイト)、悪意のある要求(リクエスト)を正しい要求だと偽って(フォージェリ)を送信することです。

簡単に例を出してみます(ほんとはこんな実装はしないと思いますが)

例えば通販のサイトで、GETリクエストのURLのクエリパラメータで品物と個数を指定するとします。

サイト利用者のAさんがリンゴを3つ買うときは次のようなリクエストを送るとしましょう。

GET http://hogeshop.com/order?item=apple&number=3

CSRFで脆弱性をつく場合、攻撃者は別のサイトで次のようなリンクを踏ませます。

http://hogeshop.com/order?item=banana&number=1000

これをAさんが踏んでしまうと、Aさんはバナナを1000個注文してしまうことになります、困りますね。

CSRFの困るところは、リクエストを別のコンピュータを通して送信することで、ログインユーザーにしかリクエストが許可されていなくても、Aさんがログインしている状況であれば任意のリクエストを送信できてしまうことです。

これにより、上記の注文のような被害や、非公開にしていたプロフィールを公開させられたりということがありえます。

過去には、被害者のユーザーに犯罪予告をさせたり、大量の書き込みをさせDoS攻撃を行うなどの事件が発生しています。

 

対策

CSRFがどんなものかを見たところで、どんな対策をする必要があるのかを見ていきましょう。

CSRFは自分の運営するサイトとは別のところに攻撃者が罠を仕掛けるので、罠を仕掛けさせないようにするのは不可能です。よって、そのリクエストは送信されるものとしてどう対処すればいいのかを考える必要があります。

利用者側

脆弱性は全部Webサイト任せにせず、ユーザーも気をつける必要があります。

例えばログインが必要なサイトでも、そもそもログインしていなければリクエストを送信したところで受理されません。

必要な時以外は基本的にはログアウトしておくと被害を抑えることができます。

開発者側

ユーザーに気をつけてもらうと言っても、やはり開発者側ができるだけ脆弱性のないシステムを作る必要があります。

セッションを利用する

リクエストを送信するときに、nonce値という推測されにくいランダムな値をセッションなどで渡し、それをサーバー側で照合することで不正なアクセスを検出するものです。

ただし、セッションハイジャックなどでセッションまで乗っ取られては意味がないので他の脆弱性も気をつける必要があります。

リファラーを利用する

リファラーというのはリクエスト元のURLを示す物ですが、上記の例であればこれがhttp://hogeshop.comから来ているかどうかを確認すれば、意図しない不正のサイトからのアクセスを防ぐことができます。

ただ、リファラーを改ざんされたHTTPヘッダのリクエストを送られては通ってしまうため、完璧な対策とは言えません。

ユーザーによる二段階認証を入れる

上記の例では注文の認証なしでリクエストを送信していましたが、注文後、もう一段階ユーザーの手による確認操作を入れてしまえば自動で送信されることは無くなります。

ただ、ユーザーの操作が増えてしまうため、UXが損なわれてしまう可能性があります。

 

 

CSRFには対策用のライブラリも多数公開されているので、そう言ったものも利用しながらセキュアなWebサービスを構築することを心がけましょう!

 

Webエンジニアなら必須の知識?PWAとは【Progressive Web App】