DNSキャッシュポイズニングとは? | DNSスプーフィング

攻撃者はDNSリゾルバーを欺きDNSキャッシュを汚染して偽情報を保存させ、リゾルバーが、クライアントに間違ったIPアドレスを送信します。Webサイトへ閲覧することを試みるユーザーは、不正な場所へ転送されます。

Share facebook icon linkedin icon twitter icon email icon

DNSスプーフィング

学習目的

この記事を読み終えると、以下のことができます。

  • DNSキャッシュ・ポイズニングの定義
  • DNSキャッシングの仕組みを理解する
  • 攻撃者がどのようにDNSキャッシュを汚染するか説明します
  • DNSSECがDNSキャッシュ汚染攻撃をどのようにして防止するか理解します

DNSキャッシュポイズニングとは?

高校生最後のいたずらとして、最上級生が高校のキャンパスのすべての部屋番号を交換したとしましょう。そうすると、キャンパスの配置に不慣れな新入生たちは、翌日、行き先に迷い、間違った教室にたどり着くことになります。ここで、一致しない部屋番号がキャンパスディレクトリに記録され、最終的に誰かがこれに気づいてディレクトリを修正するまで、生徒達は間違った部屋に向かい続けると想像してください。

DNSキャッシュポイズニングは、DNSキャッシュに虚偽の情報を入力して、DNSクエリが誤った応答を返し、ユーザーが間違ったWebサイトにリダイレクトされるようにする行為です。DNSキャッシュポイズニングは「DNSスプーフィング」とも呼ばれます。IPアドレスはインターネットの「部屋番号」であり、Webトラフィックが適切な場所に到着できるようにします。DNSリゾルバーキャッシュは「キャンパスディレクトリ」であり、誤った情報を保存すると、キャッシュされた情報が修正されるまで、トラフィックは間違った場所に向かいます。(これにより、本物のWebサイトが本物のIPアドレスから実際に切断されることはありません。)

一般的にDNSリゾルバーにはキャッシュ内のデータを検証する方法がないため、Time to Live (TTL)が期限切れになるか、手動で削除されるまで、誤ったDNS情報がキャッシュに残ります。多数の脆弱性によりDNSポイズニングが可能になりますが、主な問題は、DNSがはるかに小さなインターネットを意図して構築されており、(ちょうどBGPのような)信頼の原則に基づいていることです。 DNSSECと呼ばれる、よりセキュアなDNSプロトコルは、これらの問題のいくつかを解決することを目的としていますが、まだ広く採用されていません。

DNSリゾルバーは、何をするのでしょうか?

DNSリゾルバーは、 ドメイン名に関連付けられたIPアドレスをクライアントに提供します。言い換えれば、「cloudflare.com」のような人間が読めるWebサイトのアドレスを取得し、それらを機械可読IPアドレスに変換します。ユーザーがWebサイトに移動しようとすると、オペレーティングシステムはDNSリゾルバーにリクエストを送信します。DNSリゾルバーはIPアドレスで応答し、Webブラウザはこのアドレスを取得してWebサイトの読み込みを開始します。

DNSキャッシュの仕組みは?

DNSリゾルバーは、一定時間IPアドレスクエリへの応答を保存します。このようにして、リゾルバーは、将来のクエリに対して、一般にDNS解決プロセスに関係する多くのサーバーと通信する必要なく、はるかに迅速に応答できます。DNSリゾルバーは、そのIPアドレスに関連付けられた指定されたTime to Live (TTL)が許可する限り、キャッシュに応答を保存します。

DNSキャッシュなし応答:

DNS uncached response

DNSキャッシュ済み応答:

DNS cached response

攻撃者はDNSキャッシュのポイズニングをどう実現するのか?

攻撃者は、 DNSネームサーバーに成りすましてDNSリゾルバーに要求を行い、DNSリゾルバーがネームサーバーに問い合わせるときに応答を偽造することにより、DNSキャッシュをポイズニングできます。これは、DNSサーバーがTCPではなくUDPを使用し、現在DNS情報の検証がないために可能です。

DNSキャッシュポイズニングプロセス:

DNS Cache Poisoning Process

ポイズニングされたDNSキャッシュ:

Poisoned DNS Cache

TCPを使用する代わりに、通信当事者が通信を開始してデバイスのIDを確認するために「ハンドシェイク」を実行する必要があります。DNSリクエストと応答はUDP、ユーザーデータグラムプロトコルを使用します。 UDPでは、接続が開かれていること、受信者が受信する準備ができていること、または送信者が本人であることを保証するものはありません。 UDPはこの理由で偽造に対して脆弱です。攻撃者はUDPを介してメッセージを送信し、ヘッダーデータを偽造することで正当なサーバーからの応答であると偽装できます。

DNSリゾルバーが虚偽の応答を受信した場合、情報が正確で正当なソースからのものであるかどうかを確認する方法がないため、データを無批判に受け入れてキャッシュします。DNSは、インターネットの初期、接続しているのは大学と研究センターだけであった頃に作成されました。誰かが虚偽のDNS情報を広めることを予期する理由はありませんでした。

DNSキャッシュプロセスの脆弱性のこれらの主要なポイントにもかかわらず、DNSポイズニング攻撃は簡単ではありません。DNSリゾルバーは実際に権威ネームサーバーに問い合わせるため、攻撃者は権威ネームサーバーからの実際の応答が到着する前に偽の応答を送信するのに数ミリ秒しかありません。

攻撃者は、DNSスプーフィング攻撃を行なうには次のような多くの情報要素を手に入れるあるいは推測しなければなりません。

  • 標的とされたDNSリゾルバーによってキャッシュされていない、つまりリゾルバーが権威ネームサーバーにクエリを行うDNSクエリがどれか
  • DNSリゾルバーが使用しているポート*-かつては同じポートをすべてのクエリに使用していましたが、今では毎時間異なるポートをランダムに使用します
  • リクエストID番号
  • クエリが送信される権威ネームサーバー

攻撃者は他の方法でDNSリゾルバーにアクセスすることもできます。悪意のある者がDNSリゾルバーを操作、ハッキング、または物理的にアクセスした場合、キャッシュされたデータをより簡単に変更できます。

*ネットワークでは、ポートは通信受信の仮想ポイントです。コンピューターには複数のポートがあり、それぞれに独自の番号が付いています。コンピューターが相互に通信するには、特定の種類の通信用に特定のポートを指定する必要があります。たとえば、HTTP通信は常にポート80に送信され、HTTPSは常にポート443を使用します

DNSスプーフィングと検閲

一部の政府は、特定のWebサイトやWebリソースへのアクセスを禁止するために、国内で、故意にDNSキャッシュポイズニングを行っています。

DNSSECはどのようにDNSポイズニング防止に役立つのか?

DNSSECはDomain Name System Security Extensionsの略で、DNSデータの整合性と発信元を検証する手段です。DNSは元々そのような検証なしで設計されたため、DNSポイズニングが可能です。

TLS/SSLと同様に、DNSSECは公開鍵暗号化(情報にデジタル署名する方法)を使用してデータを検証および認証します。DNSSEC拡張機能は2005年に公開されましたが、DNSSECはまだ主流ではないため、DNSは依然として攻撃に対して脆弱です。