Cyber Security Deep Dive Interactive Knowledge Hub

DKIM & リプレイ攻撃の仕組み

送信元の正当性を証明する「電子署名」が、なぜ攻撃者によってバイパスされてしまうのか。

Visualization Arena STEP 1 / 10
DNSサーバー dns.example.jp 送信者サーバー example.jp 攻撃者 evil-relay.net 受信者サーバー target.org D D DKIM PASS ✅ DKIM PASS ✅ DKIM FAIL ❌
システムログ: シミュレーションを初期化しています。
Raw Mail Stream smtp_transaction.log

DKIM (DomainKeys Identified Mail) 技術詳解マニュアル

1. DKIMの基本概念と認証特性

DKIMは、送信側が電子署名をメールヘッダーに付与し、受信側が送信ドメインのDNSに公開された「公開鍵」を使って暗号学的に検証する技術です。 IPアドレスのみで認証を行うSPFとは異なり、以下の特性があります。

  • メール転送への耐性: 転送によって送信元IPが変わっても、署名さえ壊れなければ認証は成功(SPFの弱点を克服)。
  • 改ざん防止の保証: 配送中に第三者が件名や本文を改ざんすると、ハッシュ値が崩れて必ず検出されます。

2. DKIM署名ヘッダーのコアパラメーター一覧

タグ 意味 役割
v= バージョン 現在は常に「1」固定です。
a= 暗号アルゴリズム 主に「rsa-sha256」や「ed25519-sha256」が使われます。
d= 送信ドメイン 署名元の組織名。DMARCはこの値とFromアドレスを照合します。
s= セレクタ DNSから対象の公開鍵レコードを見つけるためのキー。
c= 正規化方式 ヘッダー/本文の空白処理基準 (relaxed / simple)。
h= 署名対象ヘッダー 改ざん防止対象とするヘッダー。From, To, Subjectなど。
bh= ボディハッシュ 正規化したメール本文をハッシュ化した固定値。
b= デジタル署名値 hタグ対象ヘッダーとbhハッシュを秘密鍵で暗号化したバイナリデータ。

3. 正規化(Canonicalization: `c=`)の仕組み

メールの中継・転送中には、MTA(中継サーバー)によって空白の挿入や大文字・小文字への変更が勝手に行われ、署名が壊れることがよくあります。 これを防ぐために、あらかじめ送信・受信側で共通のルールで「データを整形」してからハッシュ化を行います。

simple 方式: 一切の改行の変更や空白の挿入を許容しない厳密な判定方式。
relaxed 方式: 複数の連続するスペースを1つに統合、大文字を小文字に変換、行末のスペースを無視するなど柔軟に判定。

4. なぜリプレイ攻撃が成立し、どう防ぐのか?

DKIM署名は、メールのヘッダー情報と本文全体を「完全に書き換えない」ままであれば、どこから送信しても数学的に検証が「PASS」し続けるという性質があります。 これが「DKIMリプレイ攻撃」が発生する根本的な隙間です。

攻撃のポイント(ヘッダーの追加・上書き)

攻撃者は署名付きメールを複製した後、標的(Victim)へ宛先を変更する際、ヘッダーに新しい `To: victim@target.org` を追加(Prepending)して送り出します。 受信サーバーが最新の `To:` ヘッダーを読み込む一方で、署名時のハッシュ計算対象からは取り残されているため、DKIM検証は完全に成功してしまいます。

決定的な防衛ロジック:オーバーサイニング (Oversigning)

署名生成時、存在しないはずのヘッダーもあらかじめ署名対象リスト(`h=`)にダブルで指定します(例: `h=from:to:subject:to`)。 この状態で攻撃者が後から `To:` をヘッダーに追加すると、署名時の想定とヘッダー数が合致しなくなり、DKIM検証が強制的に「FAIL」となります。