Anti DNS Pinning/DNS Rebinding/DNS multi-pinning

Security 9月 7, 2007
(Last Updated On: 2007年11月29日)

備考:かなり古いブログですが公開し忘れしていた分です。

この話題はどちらかというとWebブラウザとプラグインの問題と言えるので書いていませんでした。Web開発者としては早く直してほしい問題ですがサーバのコードを書く側としては対策をできません。なぜかこの話題の日本語リソースがあまり無いようです。とりあえず私のブログにも書いておくことにします。

WebブラウザとプラグインはSame Originポリシーで守られています。基本的にはXMLHttpRequest、Javaアプレット、Flashはそのコードを送ったサーバにのみリクエストが送信できるようになっています。クッキーもコードを送ったサーバ(ドメイン)のクッキーにのみアクセスできるようになっています。

Same Originポリシーが無いと悪意があるサイトにアクセスするだけでいくらでもクッキーに保存されたセッションIDなどを盗めます。これを防ぐ為にブラウザはDNS Pinning(IPアドレスを固定するセキュリティ対策)と呼ばれる手法を利用しています。

DNS Pinningが無いとファイアーウォールで保護されている内部のコンピュータにアクセスしたり、IPアドレスベースでの認証の回避が可能になります。DNS Pinningが無い場合にどのように攻撃されるか簡単に解説します。

DNS Pinningの必要性

ブラウザがURLを解釈する際、ホスト名をIPアドレスに変換するためにDNSサーバに問い合わせを行います。サーバ名はDNSによって管理されサーバのIPアドレスは必要に応じて自由に変更できるようになっています。

攻撃者がドメインを管理して、悪意があるDNSサーバを運用している場合、ブラウザからの最初の問い合わせには実際に存在する攻撃用のページをホストしているサーバのIPアドレス(通常のグローバルIPアドレス)を返します。

仮に攻撃用のURLは次のURLだとします。
http://www.example.jp/attack.html

被害者がURLにアクセスさせる攻撃用attack.htmlのコンテンツにはXMLHttpRequestを利用してwww.example.jpサーバにリクエストを送信するJavaScriptを記述します。ページが記述してあるwww.example.comとXMLHttpRequestの送信先であるサーバ(www.example.com)は同じサーバであるのでブラウザはアクセスを許可します。

DNS Pinningが無い場合、ブラウザはサーバ名を解決するためにDNSで再度名前の解決を行います。攻撃者がホストしている悪意のあるDNSサーバはwww.example.comの名前解決リクエストがきた場合は内部のIPアドレス、例えば192.168.0.1、192.168.0.2、192.168.0.3等を返させます。この様なDNSサーバを用意することにより攻撃者は簡単に本来アクセスできてはならない内部ネットワークのコンピュータにアクセス可能になります。

例えば、IPアドレスが192.168.0.1のコンピュータはSOHOルータでCSRFに脆弱な場合、Firewallを無効にしたり、VoIP対応ルータの場合通話を盗聴されたりVoIPサービスを不正利用される可能性があります。さらなる攻撃を行うために内部ネットワーク構成のスキャン等を行う事も可能になります。

この様にDNSによって名前の解決を毎回行っていると内部ネットワークへの不正アクセスを許してしまいます。これを防ぐためにブラウザやブラウザの拡張はDNS Pinning(DNSリクエストのキャッシング)を行います。同じサーバ名にリクエストを送信する場合、DNSによって名前の解決を行わず既に解決済みの結果を利用します。

このように解説すると、悪意のあるDNSサーバを用いた攻撃は明白で全ての実装が最初からこのような攻撃を考慮していたはず、と思われる方もいるかも知れません。しかし、実際にJava AppletがDNS Pinningを実装していなかったり、XMLHttpRequestオブジェクトがDNS Pinningを実装していかったりしたケースがありました。

攻撃例としてFirewall設定の変更やVoIPの不正利用を取り上げていますが、実際にAnti DNS Pinning/DNS Rebidingを利用したFirewall設定の改竄やVoIPの不正利用などの攻撃は行われています。

Anti DNS Pinning/DNS Rebinding

Anti DNS Pinningは名前が示すとおりDNS Pinningを回避する手法の名前です。Stanford大学の論文でより直感的に分かりやすい名前としてDNS Rebindingが利用されています。DNS RebidingはAnti DNS Pinningの別名と考えても差し支えありません。


書きかけです。近日中に再編集します。

投稿者: yohgaki