DKIMリプレイ攻撃とは?その防御方法
DKIMの仕様を突いた攻撃手法
2023年12月7日
著者: Ahona Rudra
翻訳: 竹洞 陽一郎
この記事はPowerDMARCのブログ記事 What are DKIM Replay Attacks and How to Protect Against Them? の翻訳です。
Spelldataは、PowerDMARCの日本代理店です。
この記事は、PowerDMARCの許可を得て、翻訳しています。
DKIMは、メール認証において重要な要素であり、デジタル署名という暗号技術を利用して、ドメインから送信されるメッセージに署名を行います。
これにより、正当な送信元からのメールが、受信者に届くまでに改竄されていないことが保証され、なりすましの脅威を軽減します。
DKIMリプレイ攻撃では、攻撃者が正当なDKIM署名付きのメールメッセージを傍受し、メッセージの内容や署名に一切変更を加えることなく、受信者または別の標的に対してそのメールを何度も再送信します。
この攻撃の目的は、DKIM署名によって確立された信頼を悪用し、受信者に正当なメッセージを何度も受け取っていると信じ込ませることです。
重要なポイント
- DKIMは、メールが転送中に改竄されていないことを検証するために、暗号署名を使用します。
- DKIMリプレイ攻撃は、信頼されたメールを再送信することで、受信者に新しい正当なメッセージだと誤認させる行為です。
- 攻撃者は、高い評価を持つドメインを使用して、信頼されたメール送信元になりすますことで、DKIMを悪用する可能性があります。
- DKIMリプレイ攻撃を防ぐためには、ヘッダーのオーバーサイニングやDKIMキーの定期的なローテーションなどの戦略が必要です。
- メール受信者に対するDKIMの教育や、レート制限の実装も、リプレイ攻撃のリスクを軽減するのに役立ちます。
DKIMリプレイ攻撃とは
DKIMリプレイ攻撃は、サイバー攻撃の一種で、脅威となる行為者がDKIMを使用して署名され信頼されたメールを傍受し、その後、同じメールを再送信または「リプレイ」して、受信者にそれが新しく、信頼できるメッセージであると思わせるためのものです。
たとえそれが改竄されていたり有害であったとしてもです。
DKIMリプレイ攻撃の構造を詳しく説明し、緩和戦略について話し合う前に、まずはDKIMの仕組みについて説明しましょう。
DKIMはメールをどのように認証するか?
DKIM(DomainKeys Identified Mail)は、メールメッセージの真正性を検証し、メールのなりすましやフィッシング試みを検出するのに役立つメール認証方法です。
DKIMは送信サーバでメールメッセージにデジタル署名を追加し、この署名は受信者のメールサーバによって検証され、メッセージが転送中に改竄されていないことを保証します。
DKIMは以下のプロセスを活用して機能します。
- 1. メッセージ署名
-
DKIMを使用するドメインからメールが送信されると、送信メールサーバはメッセージに対してユニークな暗号署名を生成します。
この署名は、メールの内容(ヘッダーと本文)および「From」アドレスや「Date」フィールドなどの特定のヘッダーフィールドに基づいています。
署名プロセスには通常、秘密鍵が使用されます。 - 2. 公開鍵の公開
-
送信ドメインは、そのDNS(ドメインネームシステム)レコードに公開DKIMキーを公開します。
この公開鍵は、受信者のメールサーバによって署名を検証するために使用されます。 - 3. メッセージの送信
- DKIM署名を含むメールメッセージは、インターネットを介して受信者のメールサーバに送信されます。
- 4. 検証
-
受信者のメールサーバがメールを受信すると、メールのヘッダーからDKIM署名を取得し、送信者のドメインのDNSレコードで送信者の公開DKIMキーを検索します。
メールの内容と署名が一致すれば、受信者はメールが転送中に改竄されておらず、主張された送信者のドメインから実際に送信されたものであると合理的に確信することができます。 - 5. 合格または不合格
-
検証プロセスの結果に基づいて、受信者のサーバはメールをDKIM検証済みまたはDKIM失敗としてマークすることができます。
DKIMは、送信者のドメインの真正性を検証するメカニズムを提供することにより、フィッシングやなりすましなどのさまざまなメールベースの攻撃を防ぐのに役立ちます。
DKIMリプレイ攻撃はどのように実行されるか?
DKIMリプレイ攻撃では、悪意のある個人がDKIM署名の寛容さを利用してメールの受信者を欺き、有害なコンテンツや詐欺を広める可能性があります。
DKIMリプレイ攻撃がどのように機能するか、ステップバイステップで見ていきましょう。
- 1. DKIM署名の柔軟性
-
DKIMでは、署名ドメイン(メールに署名するドメイン)がメールの「From」ヘッダーに記載されているドメインと異なることが許されます。
これは、メールが「From」ヘッダーで特定のドメインから来たと主張していても、DKIM署名が別のドメインに関連付けられている可能性があることを意味します。 - 2. DKIM検証
-
メール受信者のサーバがDKIM署名付きのメールを受信すると、メールがドメインのメールサーバによって署名されてから変更されていないことを確認するために署名をチェックします。
DKIM署名が有効であれば、メールが署名ドメインのメールサーバを通過し、転送中に改竄されていないことを確認します。 - 3. 高評価ドメインの悪用
-
ここで攻撃が登場します。
攻撃者がメールボックスを乗っ取ったり、ハッキングしたり、高評価(つまり、メールサーバにとって信頼されたソースである)のドメインでメールボックスを作成することに成功した場合、彼らはそのドメインの評判を利用します。 - 4. 初期メールの送信
-
攻撃者は、自分たちがコントロールする別のメールボックスに、高評価のドメインから単一のメールを送信します。
この初期メールは、疑いを避けるために無害であったり、実際に正当であったりすることがあります。 - 5. 再送信
-
次に、攻撃者は記録されたメールを使用して、元々の正当な送信者によって意図されていなかった異なる受信者グループに同じメッセージを再送信することができます。
高評価のドメインからのDKIM署名がそのままのメールは、メールサーバによって正当なメッセージとして信頼される可能性が高く、認証フィルターを迂回することになります。
DKIMリプレイ攻撃を防ぐステップ
メール送信側の戦略
- ヘッダーの過剰署名
-
署名後に「Date」、「Subject」、「To」、「CC」などの重要なヘッダーが追加または変更されないようにするため、これらをハッシュ値を生成する対象に追加して過剰に署名することを検討してください。
この安全策は、悪意のある行為者がこれらの重要なメッセージコンポーネントを改竄するのを防ぎます。 - 短い有効期限の設定(x=)
-
実用的に可能な限り短い有効期限(x=)を設定します。
これにより、リプレイ攻撃の機会のウィンドウタイムを短縮します。
新しく作成されたドメインは、攻撃に対してより脆弱であるため、古いドメインよりもさらに短い有効期限を持つ必要があります。 - タイムスタンプ(t=)とノンスの使用
-
リプレイ攻撃をさらに防ぐために、メールのヘッダーや本文にタイムスタンプとノンス(ランダムな数値)を含めます。
これにより、攻撃者が後の時間に同じメールを再送信することが困難になります。
なぜなら、その値は変更されているからです。 - 定期的なDKIMキーのローテーション
-
定期的にDKIMキーをローテーションし、DNSレコードをそれに応じて更新します。
これにより、侵害されてリプレイ攻撃に使用される可能性のある長期間使用されるキーの露出を最小限に抑えます。
訳注: ダークWebに自社のメールアドレスやそのアカウントのパスワードが出回っていないか確認することも大事です。
メール受信側の戦略
- レート制限の実装
-
受信者は、リプレイされたメールでシステムが溢れるのを防ぐために、受信するメールメッセージに対するレート制限を実装することができます。
これを行うには、特定の送信者から特定の時間枠内に受け入れるメールの数に制限を設けます。 - メール受信者への教育
-
メールの受信者にDKIMの重要性について教育し、受信するメールのDKIM署名を検証するように促します。
これにより、受信者に対する潜在的なリプレイ攻撃の影響を軽減するのに役立ちます。 - ネットワークセキュリティ対策
- リプレイ攻撃に関与している可能性のある既知の悪意のあるIPアドレスやソースからのトラフィックを検出し、ブロックするためのネットワークセキュリティ対策を実装します。
PowerDMARCがDKIMリプレイ攻撃を軽減する方法
ドメイン所有者がDKIMキー管理を簡単かつ効率的に行えるように、当社は包括的なホスト型DKIMソリューションを導入しました。
私たちは、メールの流れとDKIM署名の実践を監視することで、不一致を迅速に検出し、常に攻撃者より一歩先を行くことができます。
当社のダッシュボード上でのレコード最適化は自動で行われ、DNSに複数回アクセスして手動で更新する必要はありません。
PowerDMARCによる自動化に切り替えて、署名の変更、複数のセレクターの処理、DKIMキーのローテーションを手間のかからない方法で行いましょう。
今日サインアップして無料トライアルを試してみてください!