- 正規ユーザーが送信した認証情報・トークン・リクエストデータを攻撃者が傍受して後から「再送(リプレイ)」することで認証を回避したり不正な操作を実行したりするサイバー攻撃のこと
- パスワードそのものを盗まなくても「認証済みのデータパケットをそのままコピーして再送するだけで成立する」という点が危険で通信の暗号化だけでは防げない
- Webアプリの認証・APIのリクエスト・無線LANのWPA2認証・電子マネーの決済・Bluetoothキーレスエントリーなど幅広いシステムで発生しうる攻撃でナンス・タイムスタンプ・使い捨てトークンが主要な対策だ
【深掘り】これだけ知ってればOK!
リプレイアタックへの主な対策を整理しよう。ナンス(Nonce):「Number used once」の略。リクエストごとに一意のランダムな値を含めてサーバーが同じナンスのリクエストを2回受け取ったら拒否する。タイムスタンプ:リクエストに送信時刻を含めてサーバーが一定時間(例:5分)以上古いリクエストを拒否する。使い捨てトークン(ワンタイムトークン):1回だけ有効なトークンを発行して使用後に無効化する。
具体的なリプレイアタックの実例を理解しよう。セッションハイジャック:盗んだセッションCookieを再利用してそのユーザーとして操作する。API認証の回避:正規のAPIリクエスト(署名付き)を傍受して再送する。FIDO2・WebAuthn:フィッシング・リプレイアタック耐性が高い認証プロトコルとして採用が増えている。チャレンジ(サーバーから毎回異なるランダムな値)に対して署名するため再利用が不可能だ。
OAuth 2.0・JWT(JSON Web Token)でのリプレイアタック対策を理解しよう。JWTはexpiration(有効期限)クレームで短い有効期間を設定することが重要だ。また`jti`(JWT ID)クレームでトークンの一意性を確保して使用済みトークンをブラックリスト管理することでリプレイアタックを防げる。アクセストークンの有効期限を短くして(15分〜1時間)リフレッシュトークンで更新するというOAuth 2.0のベストプラクティスもリプレイアタック対策になる。
よくある誤解
HTTPSで通信を暗号化すればリプレイアタックを防げると思っている
HTTPSはデータの傍受・改ざんを防ぐがリプレイアタックは「正規の暗号化されたデータをそのままコピーして再送する」攻撃だ。データの中身を見なくてもコピーして再送するだけで攻撃が成立するためHTTPS単体では防げない。ナンス・タイムスタンプ・使い捨てトークンが必要だ。
リプレイアタックはMITM攻撃と同じだと思っている
MITM攻撃は通信の中間に割り込んでリアルタイムで傍受・改ざんする攻撃だ。リプレイアタックは正規の通信データを記録して後から再送する攻撃だ。MITM攻撃が成功した後にリプレイアタックに発展することはあるが、別の攻撃手法だ。
会話での使われ方

このAPIリクエスト、タイムスタンプが含まれていません。同じリクエストを後から再送するリプレイアタックが成立します。タイムスタンプとナンスを追加して5分以上古いリクエストを拒否するバリデーションを実装しましょう。
セキュリティエンジニアがAPIのリプレイアタック脆弱性を指摘して対策を提案している場面。




JWTのexpiration(有効期限)を1日に設定しているのは長すぎます。アクセストークンは15分以内に設定してリフレッシュトークンで更新する構成にしてリプレイアタックのリスクを下げましょう。
バックエンドエンジニアがJWTの適切な有効期限設定でリプレイアタック対策を提案している場面。




FIDO2認証を導入しました。サーバーがチャレンジを発行して毎回異なる値に対して署名するためパスワード漏洩やリプレイアタックに対して根本的に耐性があります。
セキュリティ担当者がFIDO2認証のリプレイアタック耐性を説明している場面。
【まとめ】3つのポイント
- 正規の認証データを傍受して後から再送することで認証を回避するサイバー攻撃:パスワードを盗まなくても認証済みのデータパケットをコピーして再送するだけで成立するためHTTPS単体では防げずナンス・タイムスタンプ・使い捨てトークンの組み合わせが対策の基本だ
- ナンス・タイムスタンプ・使い捨てトークンの3つがリプレイアタックの主要な対策:リクエストごとに一意のナンス・送信時刻のタイムスタンプ・1回だけ有効な使い捨てトークンを組み合わせることでサーバーが再送されたリクエストを識別して拒否できる
- JWTの有効期限を短く設定してOAuth 2.0のベストプラクティスでリプレイ耐性を高める:アクセストークンの有効期限を15分〜1時間に短く設定してリフレッシュトークンで更新するOAuth 2.0のベストプラクティスがJWTへのリプレイアタックリスクを大幅に低減する
よくある質問
-
Qリプレイアタックとセッションハイジャックはどう違いますか?
-
A
セッションハイジャックはセッションCookieを盗んでなりすまします。リプレイアタックはより広義で認証データ全般を再送する攻撃です。セッションCookieを使ったリプレイがセッションハイジャックとも言えます。
-
QOAuth 2.0のリプレイアタック対策はどうすればいいですか?
-
A
アクセストークンの有効期限を短く設定する・JWTにjtiクレームを付けて使用済みトークンをブラックリスト管理する・HTTPSを使う・stateパラメータで認証リクエストの一意性を確保するなどが対策です。
-
QFIDO2がリプレイアタックに強い理由は何ですか?
-
A
FIDO2認証はサーバーが毎回異なるチャレンジを発行して、ユーザーがそのチャレンジに対して署名します。同じチャレンジは二度使われないためリプレイしても無効になります。
-
Qキーレスエントリーのリレーアタックの対策は何ですか?
-
A
ファラデーケージのキーホルダーケース(電波遮断ケース)に入れる・動き検知センサー付きのスマートキーを選ぶ・ハンドルのタッチや追加認証が必要な設定を使うなどが対策です。
【出典】参考URL
https://owasp.org/www-community/attacks/Replay_Attack :OWASPのリプレイアタックの解説
https://fidoalliance.org/fido2/ :FIDO2(リプレイアタック耐性のある認証プロトコル)公式サイト


コメント