BINDに存在するサービス拒否の脆弱性、Windows2000互換コードに原因

「ドメイン・ネーム・システム(Domain Name System 、DNS)」のサーバソフト「BIND」は、インターネット基幹で重要な役割を担っています。例えば、13 のルート・ネーム・サーバのほとんどが BIND を使用しています。2015年7月28日、BIND に存在する脆弱性が報告されました。この脆弱性を利用して、攻撃者は不正な TKEYクエリを匿名で送信するだけでサーバをクラッシュさせることが可能です。BIND の開発元「Internet System Consortium (ISC)」は、この脆弱性「CVE-2015-5477」に対するセキュリティ情報を公開し、「Proof-of-concept(PoC、概念実証型エクスプロイト。実際に有効な攻撃ができることを実証している攻撃コード)」が公開されていることをユーザに報告しました。

■脆弱性はどのように利用されるか
これは、BINDサーバが TKEYクエリを処理する際の脆弱性です。BIND がTKEYクエリと一致する TKEYレコードを検索するために TKEYクエリを処理する時に、特別に細工された不正な要求がクラッシュさせます。「lib/dns/tkey.c」にあるメソッド「dns_tkey_processquery()」内の関数「dns_message_findname()」が呼び出された時、BIND がパラメータ「name」に正しい値を割り当てないために発生するクラッシュです。

■クラッシュが発生する過程
図1 は、クラッシュ発生時の BIND のコールスタックです。図2 は、パラメータ「Name」を検証する関数「dns_message_findname()」によるクラッシュを示しています。

図1:クラッシュ時の BIND のコールスタック
図1:クラッシュ時の BIND のコールスタック

図2:「REQUIRE」のマクロ
図2:「REQUIRE」のマクロ

パラメータ「Name」が正しく初期化されず、「REQUIRE」のマクロがプロセス「named」(つまり DNSサーバ)を終了させます。

■クラッシュする条件
DNSプロトコルの形式は、インターネットの仕様や運用規則を定める文書「Request for comment(RFC)」で定義されています。以下は、この脆弱性に関連するメッセージ形式を簡潔に説明したものです。DNSクライアント(リゾルバ)はクエリを DNSサーバに送信し、特定の情報を要求します。図3 は、クエリ上に 1レコードを持つDNSクエリ形式を一般化したものです。

図3:DNSクエリの形式
図3:DNSクエリの形式

DNSクエリレコードは、どのような情報が要求されているかをサーバに伝えます。ここで、2つの重要なパラメータを指定します。「Name」と「Type」です。パラメータ「Name」は、DNS 内のオブジェクトを参照します。これは、通常はドメインです。パラメータ「Type」は、どのような情報が要求されているかを指定します。例えば、ドメインに対する IP を要求する場合には、Aレコードが使用されます。

クエリレコードだけでは要求されたすべての情報を宣言するのに十分でない場合があります。その場合は、DNSクエリ形式の他のセクションが使用されます。図4 は TKEYクエリの種類です。追加の情報をサーバに送信するように要求され、追加リソースレコードのセクションがこの目的で使用されます。

図4:DNS TKEYクエリの形式
図4:DNS TKEYクエリの形式

クエリと追加リソースレコードは別セクションにあるため、DNS は DNSクエリレコードと一致する追加リソースレコードを検索しなければなりません。そのため、サーバはすべての追加リソースレコードを繰り返し処理して、同じ Type と Name を持つクエリレコードと一致させます。

DNS TKEYクエリの指定は、RFC2930 で定義されています。BIND は、メソッド「dns_tkey_processquery()」で、クエリと追加リソースレコードのセクション間の TKEYレコードをで一致させます。これは、「lib/dns/tkey.c」に実装されています。図5 は、この一致を実行しているコードです。

図5:関数「dns_tkey_processquery」
図5:関数「dns_tkey_processquery」

BIND が追加セクションでクエリレコードを検索できなかった場合、応答セクションを試します。Windows2000 は検索されている情報を入力するため、これは明示的に実行されます。ここで実際のクラッシュが起きます。これは、追加セクションでの検索が終了し、変数「name」が初期化されますが、同時に失敗となるためです。どのような条件でこの矛盾するように見える状態が発生するのでしょうか。それには、関数「dns_message_findname()」を簡単に見てみましょう。

図6:関数「dns_message_findname()」
図6:関数「dns_message_findname()」

BIND は TKEYクエリレコード内の名前と一致するすべての追加レコードを検索します。検索されたすべてのレコードは「foundname」に保存されます。1つでも一致する名前があれば、変数「name」は初期化されます。これが第一の条件です。

BIND はその後、すべての foundnameレコードの TYPE を確認します。foundname に TKEYレコードがあれば、「dns_message_findname()」は正を返し、応答セクションを確認しません。

つまり、この脆弱性を利用するための条件は以下のとおりです。

  1. クエリレコードのセクションは、以下のパラメータに少なくとも 1つのレコードを持つ必要がある
    • Type:TKEY
    • Name:指定された名前
  2. 追加レコードのセクションは、クエリレコードと同じ名前を持つレコードを少なくとも 1つ持つ必要がある(ただし、TKEY以外)
  3. 追加レコードのセクションに 1つ以上の TKEYレコードがある場合は、別の名前を使用しなければならない

公開されている PoC のコードがどのように利用されるか見てみましょう。

■脆弱性を利用した攻撃
攻撃は、不正な TKEYクエリを BIND のサービスが実行されている DNSサーバに送信することで開始されます。この脆弱性を利用した攻撃に権限は必要ありません。DNSキャッシュサーバや権威DNSサーバは共にこの脆弱性の影響を受けます。さらに、「アクセス制御リスト」やサービスを制限したり、拒否するオプション設定も、この脆弱性利用を防ぐことができません。なぜなら、アクセス制御などを行う前に、パケット処理の初期でこの脆弱性が利用されるためです。

一般に公開されている PoC はいくつかあり、実際にサーバが攻撃を受けたという報告もあります。公開済みの 2つの PoC から生成したトラフィックでこの攻撃を説明します。

公開済みの PoC の 1つは以下の DNSトラフィックを送信します。

図7:PoC の例1
図7:PoC の例1

図7では、TKEYクエリの名前と同じ名前を持つ不正な Aレコードがどのように追加セクションに含められているかが分かります。この攻撃では応答セクションも含まれていますが、BIND の脆弱性を利用するために必要ではありません。

もう1つの PoC は以下のトラフィックを送信します。

図8:PoC の例2
図8:PoC の例2

この例では、追加のセクションは TXTレコードを含んでいます。

■トレンドマイクロの対策
この脆弱性は、不正な要求を匿名で送信するだけで利用される可能性があるため、危険度は深刻と考えられています。また、この脆弱性の影響を受けるソフトウェアは重要なインターネット基幹の一部であり、多くの内部ネットワークで実装されています。DNSサーバがクラッシュすれば、企業のネットワーク全体がオフラインとなるでしょう。

DNSプロトコルの性質上、この攻撃は、クエリセクションや追加セクションの複数のレコードといった多くの変数を持つことができます。巧妙な攻撃者であれば、従来のセキュリティ対策を回避する攻撃コードを作成できるでしょう。

そのため、BIND の最新バージョンをインストールすることが管理者にとって重要となります。軽減策の 1つは、DNSサーバの冗長化です。ネットワーク基盤に複数の DNSサーバがあれば、ネットワーク基盤は攻撃からの回復が早くなります。DNSサーバの 1つがダウンしても、もう 1つのサーバが稼働し続けるためです。しかし、すべての DNSサーバに同じ実装をしてしまうと、特定のゼロデイ脆弱性に対して同時に脆弱となってしまう可能性があります。そのため、BIND やMicrosoft DNS、NSD など異なるソフトウェアを複数のサーバに導入して下さい。そうした場合、今回のようなゼロデイ脆弱性でも、DNSサーバは「サービス拒否(DoS)攻撃」から早く回復できます。

トレンドマイクロのサーバ向け総合セキュリティ製品「Trend Micro Deep Security(トレンドマイクロ ディープセキュリティ)」をご利用のお客様は、以下のフィルタを適用することにより、問題の脆弱性を利用した攻撃から保護されます。

  • 1006924 – ISC BIND TKEY Query Handling Denial Of Service Vulnerability (CVE-2015-5477)
  • 1006925 – ISC BIND TKEY Query Handling Denial Of Service Vulnerability (CVE-2015-5477) – 1

協力執筆者:Pavithra Hanchagaiah

参考記事:

 翻訳:品川 暁子(Core Technology Marketing, TrendLabs)