よくある質問・用語集

  • もっと調べる
  • どうやって使う?

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

キャッシュポイズニングとは、DNSのキャッシュ情報を意図的に書き換え、利用者を誤ったサイトへ誘導する攻撃である。例えば、キャッシュポイズニングの攻撃により、オンラインバンキングのサイトの偽情報を流すことができれば、利用者の口座番号やパスワードなどの情報を抜き出すことが可能となる。また、通信を偽サイトで中継して、盗聴したり改竄することも可能となる。その他にもキャッシュポイズニング攻撃によってSPAMメールの送信に悪用されたり、サイトを利用不能にするDOS攻撃に使われる恐れもある。

DNSとキャッシュ

例えば、www.example.comのようなサイトを閲覧したければ、このサイトのIPアドレスを調べなればならない。DNSでは、このwww.example.comのような名称から、通信を行うために必要なIPアドレスへの変換を行う。何らかの通信を行うために、頻繁にこの変換処理が必要になる。そのため、DNSは高速かつ効率的に動作する必要がある。ほとんどのサイトでは、サイト内にDNSキャッシュサーバを配置している。利用者はこのDNSキャッシュサーバに問い合わせを掛ける。DNSキャッシュサーバは、既に情報を保持していれば即座に回答を行う。しかし、保持した情報が古かったり、そもそも知らない場合には、インターネットへの問い合わせを実行し、その結果を利用者に知らせる。そして、新たに知った情報を保管しておく。これがDNSキャッシュである。

DNSキャッシュは、DNSの問い合わせを減らし、インターネットを効率的に使うことができるようにするための仕組みである。DNSで調べた情報には、必ず有効期限(TTL)が設定されている。この期間、情報はDNSキャッシュサーバに保管される。

キャッシュポイズニング攻撃

キャッシュポイズニング攻撃は、DNSキャッシュサーバに偽の情報を送り込むことで、利用者に意図的に誤った情報を伝える攻撃である。攻撃には、いくつかの方法がある。

シンプルなキャッシュポイズニングの攻撃手法

もっともシンプルで典型的なキャッシュポイズニングの攻撃手法は、DNSキャッシュサーバが外部へ問い合わせを行ったタイミングで、誤った情報を伝える方法である。DNSキャッシュサーバは、利用者からの問い合わせに応じて、外部問い合わせを行うため、攻撃者は利用者の振りをすれば簡単にタイミングを合わせることができる。このタイミングで、偽造したDNS情報を伝えれば、キャッシュサーバに偽の情報を教え込ませることができる。残念ながら、DNSがUDPの上に実装されているため、パケットの偽造は容易にできる。

ただし、実際にはDNSキャッシュサーバは、問い合わせパケットに16ビットのIDを付与している。攻撃者は、このIDを知らない。そのため、IDを総当たりしたり、別の手法でパケットを盗聴したりしなければならず、簡単に攻撃ができるわけではない。また、キャッシュは有効期限が切れるまで更新されない。そのため、攻撃者が攻撃できるのは、キャッシュを持っていない場合や、有効期限切れで無効の場合だけである。

カミンスキー攻撃

2008年に、セキュリティ研究者のカミンスキー氏が発表した攻撃の手法である。この攻撃は、DNSの付加情報を悪用して行われる。攻撃者は、本来存在しないドメイン名をDNSキャッシュサーバに問い合わせる。攻撃者は、偽の応答にDNS付加情報として、偽のドメイン名とIPアドレスの組み合わせを付加する。DNSキャッシュサーバは、この偽の情報を信用してキャッシュしてしまう。

この攻撃では、キャッシュの有効性に関わらず強制的に偽の情報を送り込むことができる。そのため、攻撃者が攻撃できるタイミングが飛躍的に増加する。

DNS水責め攻撃

DNS水責め攻撃は、2014年に日本国内でも多く観測され、多くのプロバイダが被害にあった攻撃である。デージーネットでも、この攻撃の対策を何度か行っていて、「Unbound水責め攻撃対策調査報告書」としてまとめて公開している。利用者が存在しない名称で問い合わせを実施した場合、DNSキャッシュサーバは利用者に情報が存在しないことを伝える。情報が存在しないことを調査するにもコストが掛かるため、DNSキャッシュサーバはこのような情報もキャッシュする。これをネガティブキャッシュと呼ぶ。DNS水責め攻撃では、攻撃者は、多数のクライアントから存在しない名前を一斉に検索する。DNSキャッシュサーバが保持できるキャッシュの容量には限りがある。そのため、DNSキャッシュサーバは古い情報を捨て、ネガティブキャッシュばかりを保存するようになる。すると、DNSキャッシュサーバの応答は徐々に遅延し、遅くなっていく。利用者は、DNSの問い合わせを迅速に受けることができなくなり、利用できなくなってしまう。

日本で、DNS水責め攻撃が行われた背景には、一般家庭に置かれたWi-Fiルータなどの設定が間違っていたり、古い機器のバグが取り除かれていなかったことがあげられる。こうした機器では、誰でもDNSの問い合わせができるようになっていた。これをオープンリゾルバと呼ぶ。オープンリゾルバに、大量に誤った検索をさせることで、その機器が設置されたプロバイダのDNSキャッシュサーバが使用不能になったのである。

キャッシュポイズニング攻撃の対策

キャッシュポイズニング攻撃を回避するためには、いくつかの方法がある。しかし、ほとんどの方法は決定的な回避方法ではない。完全に回避するためには、後述するDNSSECを導入する必要がある。

TTLを伸ばす

もっともシンプルな攻撃を避けるためには、DNSのキャッシュが無効になるタイミングを減らすことが有効だと考えられていた。つまり、キャッシュの有効期限を長くすると、キャッシュが更新されるタイミングが少なくなるため、攻撃されにくくなる。DNSのデータを切り替えても、すぐに設定が伝播しないことを嫌って、DNSのキャッシュを短くする設定してしまう管理者がいるが、これはより攻撃をしやすくしてしまうのだ。ただし、TTLを伸ばしてもカミンスキー攻撃には有効に働かない。

送信ポートのランダム化

以前は、DNSキャッシュサーバから外部への問い合わせは、決まったポート番号で行われていた。しかし、これは攻撃をしやすくする。そのため、問い合わせの都度、ポート番号を変える。すると、攻撃者は、どのポートに情報を送り込んだら良いかが分からず、攻撃がしにくくなる。しかし、ポート番号の変化が予測可能であれば、攻撃が可能になる。そのため、ポート番号をランダムに変更することで、攻撃を回避する方法である。

現在は、この方法はほとんどのDNSキャッシュサーバで実装されている。しかし、この方法は完璧ではない。そのため、ポート番号の変化の予測可能性が発見されるたびに、ソフトウェアがバージョンアップされるなどの対策が行われている。

権威DNSサーバとDNSキャッシュサーバの分離

DNSSECを除き、キャッシュポイズニング攻撃に対するほとんどの対処は、あくまで可能性を減らすレベルの対策である。そのため、権威DNSサーバとDNSキャッシュサーバを共存しておくことは、非常に危険である。特に、DNSサーバとしてもっともよく使われているbindでは、権威DNS機能で利用するキャッシュと、DNSキャッシュ機能で利用するキャッシュの領域が分離していない。そのため、キャッシュポイズニング攻撃を受けると、DNS情報を正確に伝えることができなくなってしまう可能性が高い。そのため、近年は権威DNSサーバとDNSキャッシュサーバを同居させることは、セキュリティ的に危険だと考えられている。機能毎に別々にサーバを作ることが推奨されている。しかし、一つのホストで権威DNSサーバとDNSキャッシュサーバが同居していた環境から、DNSサーバを分離した構成に変更するためには、比較的大きな設定変更や移行作業が必要になる。

デージーネットでは、多数のDNSサーバの構築を行っている。そのため、顧客には権威DNSサーバとキャッシュDNSサーバを分離することを強く推奨し、分離時の移行作業の設計も行っている。

DNSサーバの隠蔽

DNSキャッシュポイズニング攻撃は、攻撃者がDNSキャッシュサーバに偽造パケットを送ることで行われる。そのため、DNSキャッシュサーバをファイアウォール内に配置するなどして、組織内のユーザしか利用できないようにすれば、攻撃の可能性を減らすことができる。もちろん、権威DNSサーバは、インターネットから直接アクセスできる必要がある。そのため、権威DNSサーバと、DNSキャッシュサーバの分離は、必須である。

DNSSECの導入

DNSSECは、公開鍵認証方式を使ってDNSの情報に署名を付加する方法である。この署名を使うことで、DNSキャッシュサーバは、伝えられた情報が正しいかを検証することができる。DNSSECを導入することで、攻撃を根本的に防ぐことが可能となる。

キャッシュポイズニングに強いDNSサーバ

現在利用されているDNSサーバには、「OSSのおすすめDNSサーバ比較9選」でも紹介されているようにいくつかの種類がある。この中でも、キャッシュポイズニング攻撃に弱いソフトウェアと強いソフトウェアがある。

キャッシュポイズニング攻撃に強い権威DNSサーバ

権威DNSサーバでは、そもそもDNSキャッシュサーバの機能を持たず、権威DNS専用のソフトウェアを選ぶことで、キャッシュポイズニング攻撃を防ぐことができる。最も、普及しているDNSサーバであるbindは、権威DNSの機能とキャッシュDNSの機能を分離することができず、このような攻撃に脆弱である。権威DNSに特化したPowerDNSKnotDNSNSDなどのDNSサーバを利用することが推奨される。

なお、PowerDNSではDNSSECに対するサポート機能が用意されていて、比較的簡単にDNSSECを導入することができる。PowerDNSは日本国内でも商用サポートを受けることができ、デージーネットではキャッシュポイズニング攻撃に強い権威DNSサーバとしてPowerDNSを推奨している。

攻撃に強いキャッシュDNSサーバ

キャッシュDNSサーバの中でも、unboundは様々な攻撃に対する防御機能を持っている。「Unbound水責め攻撃対策調査報告書」で報告されているように、unbound 1.5.4から追加されたratelimitの機能は、DNSサーバに対して行われる攻撃を検知して対策を行うことができる。

攻撃に強いDNSサーバの構成

デージーネットでは、キャッシュポイズニングに強いDNSサーバの構成として、PowerDNS、dnsdist、Unboundを使った構成を提唱しています。詳しくは、無料資料「OSSで構築する安全で便利なDNSサーバ(PowerDNS, dnsdist, Unbound)」を参照してください。

【カテゴリ】:DNS  ネットワーク  セキュリティ  

  • もっと調べる
  • どうやって使う?

【Webセミナー】Rocket.Chatだけじゃない!OSSビジネスチャットの最新情報

日程: 12月19日(木)Webセミナー「BigBlueButton」を使用します。
内容: Rocket.Chatの機能制限でお困りの方も必見!ライセンスフリーで利用できるOSSのビジネスチャットを紹介します。
ご興味のあるかたはぜひご参加ください。

セミナー申込

関連用語

キャッシュポイズニングに関連するページ(事例など)

キャッシュポイズニングとは先頭へ