きっかけ
DNSプリフェッチをHTML側で大量に書いておくと、DNSサーバー側にアクセス不能攻撃が出来るBINDの脆弱性とかあったな。 / “DNSプリフェッチでウェブページの読み込み速度をスピードアップ | 海外SEO情報ブログ” http://t.co/hvDIfAxouu
— 齊藤貴義 (@miraihack)
思いつき
ブラウザに大量のDNSプリフェッチを実施させることで、経路上のNAT箱の送信元ポートを枯渇させ、DoS状態にする。
テスト環境
DNSプリフェッチが大量に記載されたウェブページを用意します。
unboundのlocal-zone機能を利用して”local.”に対するDNS問い合わせを自分で答えるようにします。ただし、問い合わせに対して素直に答えてしまうと、NAT装置が速やかにセッションをクローズし、送信元ポートをリリースしてしまう可能性があるので、”local-zone: “local.” deny”としてDNSクエリを破棄するようにします。”[1-70000].local. IN A xxx.xxx.xxx.xxx”をunbound.confに書きたくないという理由もあります。
Chromeの場合
バージョン 34.0.1847.137 mのchromeでウェブページにアクセスしました。
- Webページはすんなりと表示されます。
- プリフェッチによるDNSクエリは、以下のログの通りです。
- 以下の問い合わせを実施した後は、問い合わせを行いません。
- プリフェッチするFQDNが上から1,2,3と連番にならないのが面白い。
Firefoxの場合
バージョン28.0でウェブページにアクセスしました。
- Webページの表示に少々時間がかかります。
- プリフェッチによるDNSクエリは、以下のログの通りです。
- ログ上では途中で問い合わせが止まっているように見えますが、実際の挙動は同じペースでずっとDNS問い合わせを続けます。
IEの場合
IE11でウェブページにアクセスしました。
- Webページがなかなか表示されません。IEが応答なしになります。
- ある程度プリフェッチすると、満足したのかwebページを表示します。
- 次回以降の読み込みを高速化するためのプリフェッチのせいで、初回の読み込みが大幅に遅延します。
- プリフェッチによるDNSクエリは、以下のログの通りです。
- ログ上では途中で問い合わせが止まっていますが、実際の挙動は同じペースでずっとDNS問い合わせを続けます。
結論
WEBページにアクセスすると一気に70000件のDNS問い合わせが行われることを期待したのですが、そんな馬鹿な実装をしているブラウザはありませんでした。DNSプリフェッチでNAT箱は殺せない模様。 もしかしたら、Safariやoperaだと一気にDNSクエリを投げてくれるのかしら。