DNSのキャッシュにphising siteなどの悪いことをするサイトへのip address を注入することができる。かなり以前からこのような事実はわかっていたが、この5月くらいから問題視されるようになった。
DNSの役目は、クライアントが、たとえば m にアクセスしたいという要求を出すとDNSがそのip address は123.123.123.123ですよと答えるのだ。これをDomain Name Service( DNS)といいこれを実施するのがDNSサーバというわけだ。実際の通信の宛先はすべて ip addressで行われるので、つまりパケットではip addressだけが住所として有効なので、ip addressを直接書き込まない限りDNS がないと通信ができない。
DNS サーバはドメインネームとip addressの対応表が必要だが、世の中にあるすべてのip addressを記録するわけにはいかない。量が多すぎるし、しょっちゅう変化するからである。そこでDNSサーバは自分のとこに記録がないと上位のDNSサーバに問い合わせる。そこにないと、さらに上位のDNSサーバに問い合わせる。というわけで、最上位のDNSサーバは全世界に13台しかなく、そのうちの1台は日本にあるらしい。どこにあるかは秘密である。ここがテロで襲われるとネットワークは使い物にならなくなっちゃうからだ。
ユーザはまず最下位のDNSサーバを使うわけだが、ここにそんなに多くの対応表があるわけではない。しかし、このサーバに対する要求は同じことが多いので、サーバは問い合わせのあったドメインネームとそのip address を記録しておけば、上位のサーバに問い合わせる必要がないから早く反応ができて好都合である。そこで、問い合わせのあったものについては保存しておく。これがキャッシュに保存するという意味である。
キャッシュの保存されるときのIDは順番に付けられる。そこで、悪いやつは、この順番にということを利用して、順番をひとつずつ繰り上げるようにしてDNSサーバに本来とは異なるip addressを注入していく。DNSが上位のDNSに問い合わせた答えを返事しているように装うと注入できる。DNSはudpだからだ。そうするとDNSが参照するのはID番号なのでどっかでユーザが要求したのと同じIDとなり、思うとおりのip addressに誘導できてしまう。IDとポート番号が同じだと注入に成功するのだ。IDの数もポート番号も有限なので確率の問題だ。
これを防ぐためには、
1)キャッシュの容量を減らすとすぐ息詰まっちゃうので、ヒットする可能性が低くなる
2)IDの割り付けをランダムにする
3)問い合わせに対する答えを保持しないで、上位に必ず問い合わせる(キャシュをなしにする)
というわけで2)の対策をとることにする。生理のDNSはルータ、RT57i だ。ようやくYAMAHAはアップデータを出したのでこれにアップデートし、言われたとおりにフィルタを設定した。これでいいのだろうか?
これって、丸投げだから上位のDNSがちゃんとしているかどうかの問題になる。で上位のDNSはkだ。
テストしてみると
123.123.123.123 (xxxxxxx.ac.jp) appears to have GREAT source port randomness and GREAT transaction ID randomness.
と問題はないようだ。