DNSリバインディングにどう立ち向かうべきか

2.9K Views

August 19, 22

スライド概要

DNS Summer Day 2022 講演資料

https://dnsops.jp/event20220624.html

profile-image

徳丸本の中の人 OWASP Japanアドバイザリーボード EGセキュアソリューションズ取締役CTO IPA非常勤職員 YouTubeチャンネル: 徳丸浩のウェブセキュリティ講座 https://j.mp/web-sec-study

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

DNSリバインディングにどう立ち向かうべきか EGセキュアソリューションズ株式会社 取締役CTO 徳丸浩 徳丸浩のウェブセキュリティ講座

2.

本日お伝えしたいこと • • • • 再び注目を集めるDNS Rebinding DNS Rebindingはどのような攻撃か DNS Rebindingの対策 結局DNS Rebindingはどうすべきか 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

3.

DNS Rebindingとは • 「時間差」を用いた攻撃の一種 • 複数回のDNSクエリに対して異なるIPアドレスを返すことにより、 ネットワーク的に到達できないサーバーに対して、ブラウザ経由 で攻撃する • DNSのキャッシュ時間(TTL=Time to Live)を非常に短く (0秒~5秒程度)設定して攻撃する 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

4.

DNS Rebindingの様子 ユーザー(被害者) Authoritative DNS server Resolver trap.example.org? キャッシュなし 初回 A=203.0.113.5 TTL=0 A=203.0.113.5 TTL=0 trap.example.org? trap.example.org? キャッシュなし trap.example.org? 5秒後 A=192.168.10.2 TTL=0 1回目と2回目で Aレコードの値が 変わる 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru A=192.168.10.2 TTL=0

5.

再び注目を集めるDNS Rebinding • DNS Rebindingは2006年に指摘されている「歴史のある」攻撃手法 • 1996年にはDNS Spoofingという呼称でJavaアプレットに問題提起され、 Sunが対策を行う • 古典的な攻撃 – ルータやファイアウォールへの攻撃 – イントラネット内の端末やサーバーへの攻撃 – ガラケーの「かんたんログイン」に対する指摘(2009年11月) • 最近再注目されている様子 – IoT機器や家庭用IT機器に対する攻撃手法 – 開発者のパソコン上で動く開発ツールへの攻撃(Ruby on Rails等) – SSRF(Server-side Request Forgery)との合わせ技 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

6.

ケータイtwitter(twtr.jp)においてDNS Rebinding脆弱性 • twtr.jpはフィーチャーフォン(ガラケー)向けtwitterフロントエンド • twtr.jpの「かんたんログイン」機能にDNS Rebinding脆弱性があるこ とをIPAに届け出 – – – – – 2010/01/14 深夜 脆弱性の確認完了 2010/01/15 11:37 デジタルガレージ社への通報 2010/01/15 12:52 IPAへの届出 取扱い番号 IPA#04364080 として受信される 2010/01/15 19:18 IPAより届出受理および取り扱い開始の連絡 2010/01/15 21:51 デジタルガレージ社の担当者より修正済みの返信。手元でも 修正を確認。 – 2010/01/19 10:53 IPAより修正完了の連絡。その後取り扱い終了となる。 参考: https://www.tokumaru.org/d/20100222.html#p01 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

7.

Rails 6にDNSリバインディング攻撃防止機能が追加された(翻訳) Rails 6にはDNSリバインディング攻撃から保護する機能が#33145で追加されました。 この機能はdevelopment環境ではデフォルトで有効になっており、他の環境でもオプ ションで有効にできます。 DNSリバインディング攻撃とは DNSリバインディング攻撃は、攻撃者が悪意のあるクライアントサイドスクリプト を仕込んだWebページを用いて標的ネットワークに侵入し、そのネットワーク内の ブラウザをプロキシとしてネットワーク内の他のデバイスを攻撃することを指す。 Railsアプリで生じる影響 ローカル実行されているRailsアプリケーションに対して、攻撃者がDNSリバイン ディングを用いてリモートコード実行(RCE)する可能性があります。攻撃者が的確 にアプローチすると、ローカルENV(環境変数)情報や、ローカルRailsアプリの全 情報にアクセスできてしまうことがあります。 徳丸浩のウェブセキュリティ講座 https://techracho.bpsinc.jp/hachi8833/2020_02_05/83154 より引用

8.

Google Nest WiFiのマニュアルから… DNS リバインディングに対する保護機能 Google Nest スピーカー、ホームメディア サーバー、IoT(モノのインターネット) デバイスのような接続されたデバイスをホストするホーム ネットワークは、DNS リ バインディングと呼ばれる攻撃を受けるおそれがあります。Google Wifi では、この 種の攻撃を防止するため、DNS リバインディングに対する保護機能で、公開ドメイ ンにプライベート IP アドレス範囲を使用されないようブロックすることができます。 この機能はデフォルトで有効になっています。 ただし、サービスによっては DNS リバインディングが許可されていないと機能しな いものがあります。ローカル ネットワークで DNS リバインディングを許可する場合 は、ご自身の責任でカスタム DNS サーバーを設定することで、DNS リバインディン グに対する保護機能を無効にすることができます。 徳丸浩のウェブセキュリティ講座 https://support.google.com/googlenest/answer/9144137?hl=ja

9.

徳丸浩のウェブセキュリティ講座 https://blog.tokumaru.org/2019/03/ssrf-with-dns-rebinding.html

10.

デモ:イントラネット内のWordPressサイトに侵入 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

11.

DNS Rebindingによるイントラネット内サイトへの攻撃 trap.example.org 203.0.113.5 JS trap.example.org function func() { const xhr = new XMLHttpRequest() xhr.open("GET", "/wp-login.php") } setInterval(func, 2000) TTL=1秒 trap.example.org IN A 203.0.113.5 Fire Wall example.jp 192.168.10.2 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

12.

DNS Rebindingによるイントラネット内サイトへの攻撃 trap.example.org 203.0.113.5 trap.example.org function func() { const xhr = new XMLHttpRequest() xhr.open("GET", "/wp-login.php") } setInterval(func, 2000) Fire Wall example.jp 192.168.10.2 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru TTL=1秒 trap.example.org IN A 203.0.113.5 ↓ trap.example.org IN A 192.168.10.2

13.

DNS Rebindingによるイントラネット内サイトへの攻撃 trap.example.org 203.0.113.5 trap.example.org function func() { const xhr = new XMLHttpRequest() xhr.open("GET", "/wp-login.php") } setInterval(func, 2000) Fire Wall example.jp 192.168.10.2 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru TTL=1秒 trap.example.org IN A 203.0.113.5 ↓ trap.example.org IN A 192.168.10.2 • パスワード試行 • ナンス(トークン)取得 • 攻撃用テーマアップロード

14.

DNS Rebindingによるイントラネット内サイトへの攻撃 trap.example.org 203.0.113.5 trap.example.org function func() { const xhr = new XMLHttpRequest() xhr.open("GET", "/wp-login.php") } setInterval(func, 2000) Fire Wall example.jp 192.168.10.2 XMLHttpRequest (trap.example.org) 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru • • • • パスワード試行 ナンス(トークン)取得 攻撃用テーマアップロード リバースシェル起動

15.

Demo 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

16.

対策編 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

17.

DNS Rebindingの対策できる箇所 trap.example.org 203.0.113.5 攻撃対象 Proxy Server DNS Resolver Fire Wall ブラウザ 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

18.

対策1: 攻撃対象での対策 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

19.

DNS Rebinding対策 • DNS Rebinding攻撃はXSSやCSRFとは異なり、HTTPリクエス トのHostヘッダが罠サイトのホスト名になる – Cookie等は飛ばずセッションが乗っ取られるわけではない(重要) • DNS Rebinding対策としては以下が有効 – Hostヘッダのチェックを行う または – 認証機能を設け安全なパスワードを設定する • 古い文献では、Hostヘッダを改変できる可能性を懸念するも のがあるが、現在ではHostヘッダはForbidden header name として改変が仕様として禁止されている 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

20.

ダミーのバーチャルホストによる対策(対策前) # Before server { listen 80; server_name 0.0.0.0; … 徳丸浩のウェブセキュリティ講座 全てのホストを受付 © 2022 Hiroshi Tokumaru

21.

ダミーのバーチャルホストによる対策(対策後) # After (ダミーのデフォルトサーバーを追加) server { listen 80 default_server; ダミーのデフォルトサーバー server_name '_'; … } server { listen 80; ホスト名を明示 ## server_name 0.0.0.0; server_name wp.example.jp; … 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

22.

対策2: ブラウザでの対策 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

23.

DNS Pinning • ブラウザでのDNS Rebinding対策としては、DNS Pinningが一般的 • DNS Pinningはリゾルバの結果を一定時間ブラウザが保持すること • 主要ブラウザのDNS Pinningの保持時間(実測値) Google Chrome Firefox 1分程度 1秒~70秒 Safari 15秒~30秒 IE 無期限? • 以前はDNS Pinningの期間はもっと長かったが、最近はCDN利用のた めDNSのTTLが短くなっており、DNS Pinningの期間も短くなっている 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

24.

Anti DNS Pinning • ブラウザのDNS Pinningを回避するテクニックとして、 古来、「一度アクセスをわざと失敗される」方法が知 られてる(金床本など) 開始 – 一度当該ポートを閉じるなど – 実験の範囲では、404を返すことでも効果あり • • • • 右のフローチャートでよいことになるが… Nginxだと t = 10 等にすると無限ループになる DNS Pinningが固いのかと思いきや Nginx のKeepAliveのデフォルト値が70秒なので、無 限にKeepAliveし続けるためだった • KeepAliveを無効にすれば前ページの結果となる 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru t 秒待つ 攻撃対象への リクエスト No 成功? Y 次へ

25.

Google Chrome での最近の対策 "More private" という概念 Google Chrome 94以降では、青矢印の遷移 (More private)では、HTTPSが要求される → 証明書エラーになりDNS Rebindingできない https://developer.chrome.com/blog/private-network-access-preflight/ より引用 Google Chrome のPrivate-network Accessの保護機能は強力だが、 PROXY経由でのアクセスには効果がない 徳丸浩のウェブセキュリティ講座

26.

対策3: PROXYサーバーでの対策 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

27.

PROXYサーバーでのDNS Rebinding対策方針 • Squidの場合以下の二種類の対策がとれる – IPアドレスによるアクセス制御 – DNS Pinning • IPアドレスによるアクセス制御例 acl localnet dst 192.168.0.0/24 http_access deny localnet • 特定ドメインのみローカルネットワークを許可する例 acl example dstdomain .example.jp acl localnet dst 192.168.0.0/24 http_access allow example http_access deny localnet 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

28.

SquidのDNS Pinning • デフォルトで以下の設定になっている ディレクティブ 意味 デフォルト値 positive_dns_ttl DNSキャッシュの上限 6時間 negative_dns_ttl DNSキャッシュの下限 1分 • DNS側のTTLに関わらず、TTLは1分~6時間の値に丸められる • negative_dns_ttl を大きくすると、DNS Pinning相当のことができるが、 DNSクエリの失敗も長時間保持される • 結論としては、これらはいじらずに、IPアドレスによるアクセス制御 を用いるがよい 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

29.

対策4: リゾルバでの対策 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

30.

著名リゾルバのDNS Rebinding対応 0秒のTTL TTL下限値の変更 TTL上限 拒否リストの設定 bind9 許容 min-cache-ttl unbound 許容 cache-min-ttl dnsmasq 許容 min-cache-ttl TTL>=1 minimum-ttloverride 無制限? Luaスクリプトで可能 TTL>=5 cache.min_ttl() 無制限? modules.load('rebinding < iterate') 1.1.1.1 許容 - ? - 8.8.8.8 許容 - ? - PowerDNS recursor KNOT DNS resolver 徳丸浩のウェブセキュリティ講座 90 deny-answer-addresses 無制限? private-address 3600 stop-dns-rebind © 2022 Hiroshi Tokumaru 主要リゾルバは DNS Rebinding対 策機能がある

31.

BIND 9 Administrator Reference Manual 8.2.16.17. より Note that this is not really an attack on the DNS per se. In fact, there is nothing wrong with having an “external” name mapped to an “internal” IP address or domain name from the DNS point of view; it might actually be provided for a legitimate purpose, such as for debugging. As long as the mapping is provided by the correct owner, it either is not possible or does not make sense to detect whether the intent of the mapping is legitimate within the DNS. The “rebinding” attack must primarily be protected at the application that uses the DNS. For a large site, however, it may be difficult to protect all possible applications at once. This filtering feature is provided only to help such an operational environment; turning it on is generally discouraged unless there is no other choice and the attack is a real threat to applications. これは、実際にはDNSそのものに対する攻撃ではないことに注意してください。実際、DNSの観点からは、「外 部」の名前が「内部」のIPアドレスやドメイン名に マップされることは何の問題もありません。マッピングが正 しい所有者によって提供されている限り、DNS内でマッピングの意図が正当であるかどうかを検出することは不 可能であるか、意味がないかのどちらかです。リバインディング攻撃は、主にDNSを使用するアプリケーション で保護されなければなりません。しかし、大規模なサイトでは、すべてのアプリケーションを一度に保護するこ とは困難な場合があります。このフィルタリング機能は、そのような運用環境を支援するためにのみ提供されて います。他に選択肢がなく、攻撃がアプリケーションにとって本当に脅威とならない限り、この機能をオンにす ることは一般に推奨されません。 徳丸浩のウェブセキュリティ講座

32.

結局DNS Rebindingはどうすべきか • ブラウザ、PROXY、リゾルバでDNS Rebindingの対策機能はあるが いずれも完全な対策にはならない • 閉域といえども、インターネット公開サイト同様に対策をしておけば 影響ない – 閉域内のサーバーでも認証ちゃんとやる • ウェブサーバーの設定によりホストヘッダを確認するとよい – DNS Rebindingの簡単で安全な対策 – IPアドレス直打ちの総当たり的な攻撃にも効果あり 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru

33.

ご清聴ありがとうございました Any Questions? 徳丸浩のウェブセキュリティ講座 © 2022 Hiroshi Tokumaru