送信元の正当性を証明する「電子署名」が、なぜ攻撃者によってバイパスされてしまうのか。
DKIMは、送信側が電子署名をメールヘッダーに付与し、受信側が送信ドメインのDNSに公開された「公開鍵」を使って暗号学的に検証する技術です。 IPアドレスのみで認証を行うSPFとは異なり、以下の特性があります。
| タグ | 意味 | 役割 |
|---|---|---|
| v= | バージョン | 現在は常に「1」固定です。 |
| a= | 暗号アルゴリズム | 主に「rsa-sha256」や「ed25519-sha256」が使われます。 |
| d= | 送信ドメイン | 署名元の組織名。DMARCはこの値とFromアドレスを照合します。 |
| s= | セレクタ | DNSから対象の公開鍵レコードを見つけるためのキー。 |
| c= | 正規化方式 | ヘッダー/本文の空白処理基準 (relaxed / simple)。 |
| h= | 署名対象ヘッダー | 改ざん防止対象とするヘッダー。From, To, Subjectなど。 |
| bh= | ボディハッシュ | 正規化したメール本文をハッシュ化した固定値。 |
| b= | デジタル署名値 | hタグ対象ヘッダーとbhハッシュを秘密鍵で暗号化したバイナリデータ。 |
メールの中継・転送中には、MTA(中継サーバー)によって空白の挿入や大文字・小文字への変更が勝手に行われ、署名が壊れることがよくあります。 これを防ぐために、あらかじめ送信・受信側で共通のルールで「データを整形」してからハッシュ化を行います。
DKIM署名は、メールのヘッダー情報と本文全体を「完全に書き換えない」ままであれば、どこから送信しても数学的に検証が「PASS」し続けるという性質があります。 これが「DKIMリプレイ攻撃」が発生する根本的な隙間です。
攻撃者は署名付きメールを複製した後、標的(Victim)へ宛先を変更する際、ヘッダーに新しい `To: victim@target.org` を追加(Prepending)して送り出します。 受信サーバーが最新の `To:` ヘッダーを読み込む一方で、署名時のハッシュ計算対象からは取り残されているため、DKIM検証は完全に成功してしまいます。
署名生成時、存在しないはずのヘッダーもあらかじめ署名対象リスト(`h=`)にダブルで指定します(例: `h=from:to:subject:to`)。 この状態で攻撃者が後から `To:` をヘッダーに追加すると、署名時の想定とヘッダー数が合致しなくなり、DKIM検証が強制的に「FAIL」となります。