【脆弱性図鑑 vol.2】CSRF(クロスサイトリクエストフォージェリ)

CSRFとは

CSRF(Cross-site request forgery)とは、攻撃者がユーザーに意図しないアクションを実行させるWebセキュリティの脆弱性です。

この脆弱性はユーザーが意図しない形でリクエストを送信させる事で、ユーザーのアカウントを不正に操作する事を目的とされています。

例えばアカウントのメールアドレス変更、パスワードの変更、お金の振込などをユーザーの意図に限らず実行されてしまうなどです。

アクションの性質によっては攻撃者がユーザーのアカウントを完全に制御できてしまい、被害を受けたユーザーが管理者アカウントだった場合、攻撃者はアプリケーション全てのデータと機能を完全に制御できてしまう可能性があります。

CSRFが成功する条件

CSRFが成功する条件はユーザーが正規Webサイトのセッション情報を保持しているかつ、ユーザーを偽サイトに誘導してリンクなどを踏ませることです。

CSRFの本質はユーザーが保持しているセッション情報を悪用する攻撃手法です。

通常、多くのWebサイトの認証は対象のWebサイトのサーバーから返却された適切なセッション情報を照合することで成り立っています。

基本このセッション情報には有効期限が設定されていることがほどんどで、その有効期限内であればセッション情報を持つ人は誰でも認証を突破することができます。

つまり、何かしらの手段で攻撃者がユーザーの有効なセッション情報を知る、または利用することができてしまった場合は不正な操作が可能になるわけです。

逆に言えば、このセッション情報をユーザーが保持していない場合、攻撃者も正規Webサイトにアクセスすることができません。

なので一般的にはCSRFのリスクを最低限にするためにWebサービスを利用した後には必ずログアウトすることが推奨されています。

セッションハイジャックとの違い

同じセッションを悪用する攻撃手法でセッションハイジャックがあります。

こちらは何かしらの手段でユーザーのセッションを入手して成りすましを行なったりPW変更するなどが目的ですが、CSRFはユーザーが保持しているセッションを利用するだけなので入手する必要はない、と言った違いがあります。

CSRF被害の具体例

Aさんは日常的にオンラインバンキングを利用しており、給与の振込確認や光熱費の支払いなどを行なっていました。

ある日、Aさんは普段使っているB銀行から送られてきたと思われる「至急ご確認ください」と書かれたタイトルのメールを開いてメール本文のリンクを踏んでしまいました。

そのリンクは罠サイトへの誘導リンクであり、罠サイトにはログイン中のオンラインバンキングサイトに対して不正な送金リクエストを送信するスクリプトが埋め込まれていました。

Aさんが罠サイトを訪れた瞬間、ブラウザは自動的にオンラインバンキングサイトに対して送金リクエストを実行しました。

このリクエストにはすでにAさんがログインしているセッション情報が利用されていたため、銀行側も正当なリクエストとして認識してしまいました。

数日後、Aさんは銀行の明細を確認して驚きました。自分の口座から見覚えのない送金が行われていたのです。

すぐに銀行に連絡し、調査を依頼しました。

対策

サービス利用後にはログアウトを徹底する

有効なセッションを利用されなければCSRFの被害には遭わないので、一番確実なのはサービス利用後に都度ログアウトをするのが効果的です。

(理論的には正しくてもすごい面倒なのは分かるのでここから下の対策も試してみてください)

怪しいリンクを開かない(偽サイトに行かない)

CSRFは偽サイトへの誘導することでセッションを利用できる状態にします。

怪しいメール、リンク、広告を安易に開かない事で偽サイトへ誘導される事を防げます。

CSRFトークンを利用する

CSRFトークンとは、Webアプリケーションがユーザーのセッションを認証し、不正なリクエストを防ぐために使用されるセキュリティ機能です。

具体的には、CSRF攻撃を防ぐために、サーバーがユーザーに対してランダムなトークンを生成し、フォームやリクエストに含めることで、リクエストが正当なものであることを確認します。

これにより、攻撃者が不正なリクエストを送信しようとしても、正しいトークンを持っていない限りリクエストは拒否されます。

CookieにSameSite属性を設定する

SameSite属性は、Cookieに設定できる属性の一つで、主にCSRF攻撃を防ぐために利用されます。

この属性を設定することで、Cookieがどのような状況で送信されるべきかを指定できます。

SameSite属性にStrictまたはLaxを設定することで、クロスサイトリクエストに対して制限を付与する事ができるので、罠サイトから正規サイトへの不正クロスリクエストを止めることが可能です。

重要な機能に多要素認証を設定する

パスワード変更や送金などの重要な操作には、追加の認証ステップを導入することで、CSRF攻撃のリスクを低減できます。

ワンタイムパスワードやCAPTCHA、生体認証などを利用することが考えられます。