CSRFミドルウェアの適用順序

CSRFミドルウェアの適用順序

説明

クロスサイトリクエストフォージェリ(CSRF)は、ブラウザーが自動送信する認証情報を悪用し、意図しない状態変更リクエストを処理させる攻撃です。CSRF検証の後でHTTPメソッドを変更すると、検証から除外されたリクエストが状態変更処理へ進む可能性があります。実際に回避できるかは、許可する元のメソッドと変換設定によって異なります。

想定される影響

  • 被害者の認証済み権限を使い、データや設定を不正に変更されるおそれがあります。
  • CSRF自体がセッションの秘密値を盗むわけではありませんが、被害者のブラウザーから認証済みリクエストを送るために悪用される可能性があります。

対処方法

  • メソッドを変換するミドルウェアを、CSRF検証より先に適用してください。
  • 変換を許可する元のメソッドを制限し、最終的なメソッドに基づいて状態変更リクエストのCSRFトークンを検証してください。
  • 現在の method-override は、既定では元のメソッドが POST のリクエストだけを変換します。GET などに拡張する場合は、セキュリティへの影響も確認してください。

例

サポートが終了したExpress 3のミドルウェア順序を比較する、過去の実装の抜粋です。本文の解析、Cookie・セッションの設定、トークンの発行は省略しています。新しいコードには、サポートされているExpressとCSRFの実装を使ってください。

変更前

javascript
const express = require('express');
const app = express();

app.use(express.csrf()); // CSRFミドルウェアが先に動作
app.use(express.methodOverride());

app.post('/update', function(req, res) {
  // アプリケーションのデータ処理
  res.send('done');
});

変更後

javascript
const express = require('express');
const app = express();

app.use(express.methodOverride()); // methodOverrideを先に適用
app.use(express.csrf()); // 続いてCSRFミドルウェアを適用

app.post('/update', function(req, res) {
  // アプリケーションのデータ処理
  res.send('done');
});

解説:

  • 変更前: CSRF検証がメソッド変換前のリクエストを判断します。変換設定によっては、検証対象外のリクエストが状態変更処理に到達する可能性があります。
  • 変更後: 先にメソッドを変換し、CSRFミドルウェアが最終的なメソッドを判断します。適切なトークン検証とセッション設定も必要です。

参考資料