DNSキャッシュポイズニング:情報処理安全確保支援士試験対策

2022-04-22

DNSと書かれた積み木が写っている写真

DNSサーバ

ドメインネームシステム(DNS)サーバはインターネットを使う上では必須となる、ドメイン名をIPアドレスに変換する情報を持つサーバです。

インターネット上のサーバは本来は重複の無いIPアドレスで識別されますが、数字の羅列のIPアドレスは人間には使いづらいためドメイン名を使って目的のサーバへアクセスします。その際、DNSサーバーはドメイン名をIPアドレスに(場合によっては反対にIPアドレスからドメイン名へ)変換するサーバです。これは、DNSデータベースで適切なレコードを検索することによって行われます。

ドメイン名は階層構造になっているため、DNSサーバもトップレベルドメインを担当するルートサーバーから階層に分かれて分散データベースとして機能しています。

キャッシュサーバ

キャッシュサーバは自身が管理するドメインは持たず、ユーザーから任意のドメイン名の問い合わせに対して当該ドメイン名を管理するDNSサーバへの問い合わせを行い、結果をユーザー伝えるためのサーバです。

その際、過去に問い合わせがあったドメイン名とIPアドレスは一定時間キャッシュサーバ内で記憶しておき、レスポンスの向上と通信量の削減を行っています。

インターネットに接続する際に必要となるDNSサーバはキャッシュサーバを指しています。

DNSキャッシュサーバーの動作概要図

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

DNSキャッシュポイズニングは、攻撃者がキャッシュサーバーのDNSレコードを変更してユーザーに本来のIPアドレスとは異なるIPアドレスを返す攻撃です。ユーザーのコンピュータやネットワークがキャッシュサーバーの変更されたDNSレコードを参照した場合、DNSキャッシュポイズニング攻撃が成功して本来のドメインと異なるIPアドレスに転送されます。

DNSキャッシュポイズニングを受けた場合の動作図

DNSキャッシュポイズニングによってユーザーが受ける影響には大きく「1.ホスト名とIPアドレスの対応を変更して有害サイトへの誘導」「2.Web・メールの内容の盗聴・改ざん」があります。

他にも、必要なサーバへの接続ができない事による各種のサービスやアプリケーションが使えなくなる可能性があります。近年は各種WebサービスやIoTデバイスの利用が広がっている事から、サービス・アプリケーションが障害を受ける影響範囲は広くなっています。

DNSキャッシュポイズニングの仕組み

根本的な理由としては、DNSの問い合わせや回答は主にUDPが使われていますが、UDPは通信にかかるコストが低い反面、通信パケットの偽装が比較的容易です。そのため、DNS問い合わせパケット中のIPアドレス、ポート番号、IDを細工してDNSメッセージが偽装されやすくなっています。

まず、DNSではIDという識別子を使ってユーザーからのDNSメッセージを識別しています。

キャッシュサーバはユーザーからの問い合わせメッセージにIDを追加して上位のDNSサーバに送信、上位のDNSサーバからDNSメッセージの応答パケットにもIDが含まれているため、ユーザーからの問い合わせメッセージのIDと一致するものを正式な応答メッセージとして処理します。

上位DNSサーバに送信する際に指定したIDと応答パケットに含まれるIDが一致しない場合は、不正なDNSメッセージとして処理します。

キャッシュサーバはメッセージ中のIDのみで不正なメッセージを識別しているため、問い合わせメッセージに追加したIDと応答パケット内のIDが一致していた場合は、正しいサーバからの応答と判断して偽装されたDNSメッセージであっても問い合わせの結果として処理してしまいます。

その際、ユーザーへの返答だけでなくキャッシュサーバ内にも偽装されたDNSレコードが記憶されます

Kaminsky attack

カミンスキーアタックは従来のDNSキャッシュポイズニングの攻撃方法と異なり、攻撃者が連続して繰り返し攻撃を行うことができるよう手法です。

具体的には攻撃対象と同じドメイン名内で、わざと存在しない名前をキャッシュサーバに対して問い合わせをします(false.uura.site)。

その直後、攻撃者が上位サーバの返答を偽った応答情報「false.uura.siteはuura.site:IPアドレスはXXX.XXX.XXX.YYY(攻撃者の設置したサーバのIPアドレス)」を、IDを変化させながらキャッシュサーバに送ります。

この時、IDが一致しているとキャッシュサーバにuura.siteのIPアドレスがXXX.XXX.XXX.YYYと記憶され、DNSキャッシュポイズニングが成立してしまいます。

DNSキャッシュポイズニングへの対策

DNSキャッシュポイズニングに対してはDNSサーバに実施する対策が中心になり、現状ではユーザー側で可能な対策はありません。

とは言え、ユーザーとしても信頼できないDNSサーバーを利用する事は控えた方がいいでしょう。

厳密にはキャッシュポイズニングとは違いますが、知らずに利用するのは危険を伴います。

DNSサーバで実施する対策

DNSサーバの対策は大きく以下の4点ですが、多くのDNSサーバでは認証や検証が行われていないため、実施できる対策も限られています。

  1. TTL(Time To Live)値の延長
  2. 使用するUDPポートのランダム化
  3. オープンリゾルバ対策
  4. DNSSECの導入

対策の中でも、1.~2.は攻撃が成功する確率を低くする対策になります。

3.のオープンリゾルバ対策は、キャッシュサーバが誰からの問い合わせにも応答するオープンリゾルバになっていると攻撃者がいつでも攻撃を開始できる状況です。

そのため、キャッシュサーバは特定のユーザーからのみ問い合わせを受けつける、権威DNSサーバでは管理ドメインの返答のみ行う(反復検索機能を無効)など、必要に応じた機能の分割が必須になります。

そして、4.のDNSSECの導入がDNSキャッシュポイズニングに対する根本的・効果的な対策になります。

DNSSEC

DNSSECは、ドメイン名を保護および認証するためのプロトコルです。このプロトコルは公開鍵暗号を使用してDNSレコードのデータにデジタル署名を提供するため、DNSキャッシュポイズニングによるDNSレコードの改ざんを検出できます。

しかし、DNSSECの導入には自身が管理するDNSサーバだけでなく、関連するDNSサーバ(権威DNSサーバ、キャッシュDNSサーバなど)すべてをDNSSECに対応する必要があるため、まだ広く普及しているとは言えない状況です。

2020年時点のDNSSEC普及率は管理しているドメインと国によって差が大きく広がり、普及率の最も高いサウジアラビアの約96%に対して日本では約9%となっています。

参考サイト・関連記事