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

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

学習目的

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

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

記事のリンクをコピーする

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

たとえば、高校生最後のいたずらとして、最上級生が高校の教室の番号をすべて入れ替えたとしましょう。そうすると、校舎内の配置に不慣れな新入生たちは、翌日、行き先に迷い、間違った教室にたどり着くことになります。さらに、この正しくない部屋番号が校舎の見取り図に記録され、最終的に誰かがこれに気づいて見取り図を修正するまで、生徒達は間違った教室に向かい続けると想像してください。

DNSキャッシュポイズニングはDNSキャッシュに偽情報を入力し、DNSは、正しくない応答を行い、ユーザーを間違ったWebサイトに接続します。DNSキャッシュポイズニングは「DNSスプーフィング」としても知られています。IPアドレスは、インターネットの「教室番号」で、Webトラフィックが適切な場所に着くことを可能にします。DNSリゾルバーキャッシュは「見取り図」で、不完全な情報を保存している場合、キャッシュされた情報が修正されるまで、トラフィックは間違った場所に転送されてしまいます。(実際のIPアドレスと本物のWebサイトが分離されているわけではないことに注意してください。)

典型的には、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キャッシュなし応答

DNSキャッシュ済み応答:

DNSキャッシュ済み応答

DNSキャッシュのポイズニングを実行する方法とは?

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

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

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

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

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

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

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

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

攻撃者は、DNSスプーフィング攻撃を行うために、次のような多くの情報要素を手に入れるか、推測する必要があります。

  • 標的とされたDNSリゾルバーによってキャッシュされていない、つまりリゾルバーが権威ネームサーバーにクエリを行うDNSクエリがどれか
  • What port* the DNS resolver is using – they used to use the same port for every query, but now they use a different, random port each time
  • リクエストID番号
  • クエリが送信される権威ネームサーバー

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

*In networking, a port is a virtual point of communication reception. Computers have multiple ports, each with their own number, and for computers to talk to each other, certain ports have to be designated for certain kinds of communication. For instance, HTTP communications always go to port 80, and HTTPS always uses port 443.

DNSスプーフィングと検閲

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

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

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

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