CSRFは、Webアプリケーションでセッションが維持されているユーザーが、意図せず攻撃者の用意したリクエストを送信し、不正な操作が実行される攻撃です。攻撃者は、正規ユーザーのブラウザを通してリクエストを送信させるため、サーバー側では正当なユーザーからのリクエストとして認識され、不正な操作が行われます。
例:CSRF攻撃の流れ
ユーザーが正規のサイトにログイン ユーザーが、正規のWebサイトにログインし、セッションが有効な状態でサービスを利用しています。
攻撃者が悪意あるリクエストを用意 攻撃者は、ユーザーに悪意のあるサイトやメール、リンクを経由して、偽のリクエストを送り込む仕組みを作成します。
ユーザーが攻撃者のサイトにアクセス ユーザーが攻撃者のサイトにアクセスすると、背後で偽のリクエストが送信され、ユーザーのセッション情報を使ってサーバーが不正リクエストを受け入れてしまいます。
不正な操作が実行される 結果として、ユーザーのアカウント設定の変更、資金の送金、不正な投稿などが行われてしまいます。
CSRF攻撃のリスク
CSRF攻撃は、ユーザーの権限を悪用して不正操作を行うため、重大なリスクをもたらします。以下は、CSRF攻撃がもたらす具体的なリスクです。
1. アカウントの不正操作
ユーザーのアカウント情報(パスワード、メールアドレス、設定など)が不正に変更される可能性があります。例えば、攻撃者がユーザーのパスワードを変更し、アカウントを乗っ取ることができます。
2. 金銭的被害
銀行やオンラインショップのアプリケーションでCSRF攻撃が成功すると、攻撃者はユーザーになりすまして不正な取引や送金を行うことができます。これにより、ユーザーに金銭的な被害が発生します。
3. 不正な投稿やメッセージの送信
ソーシャルメディアやフォーラムなどのWebサービスで、攻撃者が不正な投稿やメッセージをユーザーになりすまして送信することが可能になります。これにより、ユーザーの信頼性が損なわれる可能性があります。
CSRF攻撃の防止策
CSRF攻撃を防ぐためには、Webアプリケーションでいくつかのセキュリティ対策を講じることが重要です。以下は、CSRF攻撃を効果的に防止するための主な対策です。
1. CSRFトークンの使用
CSRFトークン(ワンタイムトークン)は、リクエストに埋め込まれるユニークな識別子です。これをユーザーのセッションに紐付けることで、リクエストが正当なユーザーからのものであることを確認できます。トークンが一致しない場合は、リクエストを拒否する仕組みです。
例:CSRFトークンの実装(擬似コード)
<form method="POST" action="/submit">
<input type="hidden" name="csrf_token" value="abc123">
<!-- トークンを埋め込む -->
<button type="submit">送信</button>
</form>
サーバー側でトークンを検証し、一致しないリクエストは不正とみなして拒否します。
def validate_csrf(request):
token_from_request = request.POST.get("csrf_token")
token_from_session = request.session.get("csrf_token")
if token_from_request != token_from_session:
return False
return True
2. SameSite Cookie属性の設定
SameSite属性をCookieに設定することで、クロスサイトリクエスト時にCookieが送信されることを防止します。これにより、攻撃者のサイトから発信されたリクエストでは、セッション情報が含まれず、不正な操作が行われにくくなります。
例:SameSite属性の設定(HTTPヘッダー)
Set-Cookie: sessionid=xyz123; SameSite=Lax; Secure; HttpOnly
Lax:基本的なクロスサイトリクエストに対してCookieを送信しない。
Strict:すべてのクロスサイトリクエストに対してCookieを送信しない。
3. Refererヘッダーの検証
サーバー側でRefererヘッダーを確認し、正しいドメインからのリクエストのみを受け付けるようにします。これにより、外部のドメインからの不正なリクエストを検出し、拒否できます。
ただし、Refererヘッダーはユーザーの設定やプロキシの影響で必ずしも信頼できるとは限らないため、他の対策と併用するのが望ましいです。
4. 認証が必要な操作をPOSTリクエストに限定
GETリクエストは、CSRF攻撃に利用されやすいため、重要な操作や状態変更を伴うリクエストはPOSTリクエストに限定することが推奨されます。これにより、ユーザーのアクションが明示的であることを求め、不正なリクエストを防ぎます。
まとめ
クロスサイトリクエストフォージェリー(CSRF)は、ユーザーの権限を悪用して不正な操作を実行させる攻撃です。セッションの維持が必要なWebアプリケーションでは、CSRFトークンの使用やSameSite属性の設定などの対策を講じることで、攻撃のリスクを軽減できます。また、重要な操作をPOSTリクエストに限定することも効果的です。
これらの対策を実施して、CSRF攻撃からアプリケーションとユーザーを守りましょう。