盗み取った認証データを再送して正規利用者になりすます攻撃。
リプレイ攻撃(再送攻撃)とは、盗み取った認証データ(=本人だと示す情報)を、あとでそのまま送り返して正規利用者になりすます攻撃のことです。リプレイ=録音した音声を「再生」するイメージから来ています。
身近な例で考えると、合言葉を録音しておいて、あとで再生して入場するのに似ています。合言葉の意味が分からなくても、録音をそのまま流せば門番は本人だと信じてしまいます。攻撃者は中身を解読する必要すらありません。
上のツールで▶ボタンを押すと、正規利用者の認証データを攻撃者が盗聴し、保存してから再送し、なりすましが成立する流れを確認できます。
攻撃は次の流れで進みます。難しい暗号解読は一切登場しないのが特徴です。
・① 盗聴:通信路を流れる認証データを攻撃者がこっそりコピーする
・② 保存:盗んだデータを手元にためておく
・③ 再送(リプレイ):保存したデータをそっくりそのままサーバへ送りつける
・④ なりすまし成立:サーバはデータが正しいので本人と信じて受理してしまう
成立してしまう根本原因は、認証データを何度でも使い回せてしまう点にあります。サーバには「これは初めて届いたものか、それとも前のものの再送か」を見分ける手立てがないため、同じデータを区別できません。中身が暗号化されていても、かたまりごと再送できるので暗号化だけでは防げません。
対策の基本は、認証データを「1回しか使えないもの」にすることです。同じデータの使い回しを禁止すれば、再送しても通らなくなります。
代表的な手段は次のとおりです。
・ナンス(nonce):サーバが毎回ちがう使い捨ての乱数を発行し、認証に混ぜさせる。盗んだデータは古いナンスを含むので再送すると拒否される
・タイムスタンプ:データに送信時刻を入れ、古すぎるものは無効にする
・ワンタイムパスワード(OTP):毎回ちがう使い捨てのパスワードを使い、一度使ったものは二度と通らないようにする
どれも考え方は同じで、「1回限りの番号札」を配るイメージです。番号札が毎回ちがえば、過去の札を使い回そうとしても「もう使われた札ですね」と弾けます。上のツールの最終ステップで、古いナンスを含む再送が拒否される様子を確認できます。
「暗号化すれば安全では?」と思う人も多いですが、リプレイ攻撃は暗号を解読せずに成立します。理由は、攻撃者がやることは「盗んだデータをかたまりごと再送する」だけだからです。
たとえ通信が暗号化されていても、サーバは次のような判断しかできません。
・「このデータは正しい形式の認証データか」→ 盗んだ本物のコピーなので「正しい」と判定される
・「このデータは初めて届いたものか、使い回しか」→ 通常の暗号化では区別できない
身近な例で考えると、封をした手紙の「封印の印鑑」を丸ごとコピーして別の手紙に貼り付けるようなものです。印鑑が本物かどうかは確認できても、「同じ印鑑が前にも使われたか」は封筒を見るだけでは分かりません。暗号化は「内容を隠す」技術ですが、「1回限りしか使えない」という仕組みは別に用意する必要があるのです。
すべての対策に共通する発想は「1回しか使えない値を認証に含める」ことです。そうすると、盗んだデータを再送しても「その値はもう使われた」と拒否できます。
| 対策 | 仕組み | 「1回限り」の作り方 |
|---|---|---|
| ナンス(nonce) | サーバが毎回ちがう使い捨て乱数を発行し、それを含めた認証を要求する | 同じ乱数は2度使えないようサーバが管理 |
| タイムスタンプ | データに送信時刻を入れ、古すぎるものは無効にする | 時間が過ぎたデータは自動的に期限切れ |
| OTP(ワンタイムパスワード) | 使い捨てのパスワードを毎回生成し、1回使ったら無効にする | パスワード自体が1回限りの設計 |
なぜこれで防げるのか。攻撃者は盗んだデータをそのまま再送するだけです。しかしナンスやタイムスタンプが「一度使われた/古くなった」ことをサーバが覚えているので、同じデータを何度送っても「使用済み・期限切れ」として弾かれます。身近な例では、映画の半券が「使用済み」のスタンプを押されたら同じ半券では2度入場できないのと同じ発想です。