ume

クロスサイトリクエストフォージェリの概要と対策

前書き

  • railsセキュリティガイドを読んでも攻撃手法のイメージが具体的にイメージできなかったので記事に残します。

クロスサイトリクエストフォージェリとは?

⇨ユーザーが意図しない操作を勝手に行わせる攻撃手法.

攻撃事例.
* amazonで勝手に商品を注文される.

どうやって攻撃している?

  • 前提.
    ⇨ユーザーは何かしらのサービス(amazon,楽天など)にログインしていることが前提.

  • 手順.
    ①悪い人が不特定多数の人に不正操作(ECサイトの購入処理や銀行の送金など)を行わせるリンクをメールなどで送信する(この時相手がそのリンクをクリックしたくなる文言付きでくる).

②このメールのリンクを踏むと不正な購入処理などが進む可能性がある。

なぜこんなことができるの?

amazonのサーバーは「不正なリクエストと正常なリクエストの区別がつかない」. (要は自分のブラウザーからリクエストしたのか他人のメール内のリンクを踏んでリクエストしたのかサーバーは区別がつかない) ①amazonでログインするとセッションidというユーザーを特定するための識別番号がユーザーのブラウザ内のクッキーに保存される(amazonのサーバーにリクエストを送信するたびにこのクッキー情報も自動でリクエストに含まれる).
②この状態で攻撃者が作成した不正メール内のリンクをクリックしてしまうとユーザーのクッキー情報も含まれたリクエスト(不正な購入処理など)がamazonのサーバーに送られる.
amazonのサーバーは「あっ何かリクエストが来た。誰からだろうとcookieの中身を見に行く」そして「〇〇さんからだ」と認識し「〇〇さんは購入処理をしたいのか」と認識する

対策は?

ユーザーごとのformの中に一意のセキュリティトークンを持たせる。サーバーはリクエストに含まれるクッキー情報とセキュリティトークンの有無を確認する。セキュリティトークンがあれば正しいリクエスト、ないのは不正リクエストと判断している

いつセキュリティトークンは発行されるの?

⇨ユーザーがログインしたタイミング。そのトークンはsession_idと関連付いている。また ユーザーだけのformタグ(アカウント変更や更新など)の中に隠しフィールドとしてそのセキュリティトークンは存在している。 クロスサイトリクエストフォージェリをしかける攻撃者はsession_idを知らないのでもちろんsession_idに関連付いているセキュリティートークンも知らない,なので攻撃者が作成するformタグの中にユーザーのセキュリティトークンを含ませられないので不正リクエストをサーバーに処理させることはできない。

まとめ

  • railsではrails newしたタイミングで自動的にセキュリティトークンをformの中に組み込まれるように設定されているのでこの攻撃を仕掛けられる心配をする必要はない

参考情報

https://railsguides.jp/security.html