SAD DNSは、DNSキャッシュポイズニングの新たな変種である。攻撃者が悪意を持ったDNSレコードをDNSキャッシュに挿入することで、任意のトラフィックを自身のサーバにリダイレクトし、中間介在者(man-in-the-middle、MITM)になることができる。
SAD DNSはカリフォルニア大学リバーサイド校と清華大学の研究者が、ACM Conference on Computer and Communication Securityで最初に報告した。
DNSポイズニングは古典的な攻撃手法で、一般的にはソースポートの乱数化によって軽減することが可能である。攻撃者が16ビットのポート番号と16ビットのDNSトランザクションIDを推測しなければならないため、攻撃を成功させることがほぼ不可能になるからだ。
驚いたことに、最初にソースポートを、次にトランザクションIDを推測することで、攻撃者による値空間の"分割統治"が可能になる(その結果は、わずか
2^16+2^16
のなりすまし応答)、という弱点が見つかりました。さらに悪いのは、攻撃者が成功率を大幅に向上させることのできる方法がいくつか存在することです。
SAD DNSを可能にするおもな要因は、送出するICMP応答をブロックしていないことだ。これによって影響範囲は大きく広がり、広範に使用されている8.8.8.8や1.1.1.1、および多くのプライベートDNSサービスを含む、大部分なパブリックリゾルバが検索時に影響を受けることになる。
理論上は、一般的なオペレーティングシステムの新バージョンをICMPの発信をブロックせずに運用する(デフォルトでブロックしているのはWindowsのみ)すべてのDNSサーバに脆弱性が存在する、ということになる。
全体として、脆弱性を発見した研究者チームの提供する数値によれば、最大値として一般的なDNSサービスでは最大85パーセント、DNSサービス全体の34パーセントに脆弱性がある。
CloudflareのエンジニアであるMarek Vavruša氏とNick Sullivan氏が、SAD DNSの中核部分について分かりやすく説明している。その中で特に強調されているのは、 再帰的DNSソルバとDNSネームサーバ間のコミュニケーション手段としていまだ最も多く使われている、UDPとの間にある本質的な関係である。上述のように、メッセージのエントリポイントを増やすためにUDP上のDNSプロトコルによって実現されている唯一のメカニズムは、ポートの乱数化とランダムなトランザクションIDの使用のみである。有効なDNSリプライを構築するには、この2つを知らなければならない。
今回明らかになったのは、"port unreachable"メッセージを返すことのできるInternet Control Message Protocol(ICMP)プロトコルのメカニズムを利用すれば、ソースポートの乱数化を打ち破ることが可能になる、ということだ。これによって攻撃者は、クローズされているポートを知ることができるため、可能性のあるソースポートの数を絞ることが可能になる。
サーバを1回[ICMP]スキャンすれば、有効なUDPレスポンスの検索範囲を232(10億以上)から217(10万程度)に、少なくとも理屈の上では低減することができます。
この話には続きがある。すなわち、多くのリゾルバが"open"なUDPソケットではなく"connected"なUDPソケットを使用してネームサーバとのメッセージ交換を行っているので、単純なICMPクエリを使って通信に使用されているポートを検出することはできないのだが、ICMPのレート制限を使った高度なアプローチを用いれば、指定されたポートがオープンされているのかどうかが明らかになるのだ。
攻撃者がソースアドレスを被害者に偽造した大量(レート制限を発動するのに十分な数)のプローブメッセージをターゲットに送信する。プローブしたセットの中にオープンされているポートが含まれていなければ、ターゲットは同じ数のICMP"port unreachable"応答を被害者に返送するので、送出するICMPメッセージに対するレート制限が起動される。次に攻撃者は、自身のアドレスから確認メッセージを送信することで、ICMPレスポンスが返ってくるかどうかを観察することができる。
この時点で攻撃者は、プローブしたポートに関する情報の漏洩に成功しており、DNS交換に使用されているポートに関する自身の推測の幅を狭めることが可能になっている。これにより、有効なDNS応答を構築するために必要な総当たり攻撃(brute-force attack)の数が大幅に削減されるのだ。
単純ではあるが、この攻撃を実際に行うには多くのハードルがある、とCloudflareの技術者たちは指摘している。具体的には、ターゲットとするIPアドレスを知らなければならない、被害者によるデータ交換の継続中に攻撃を完了しなければならない、といったことだ。
従って、DNSの安全性に大きく貢献するDNSSECの採用が広まるのを待つ間、適用すべきリスク低減策がいくつか存在する。予測不能なICMPレート制限の適用(Linux 5.10カーネルで採用された)、ICMP"port unreachable"メッセージのファイアウォール保護、DNSソフトウェアのアップデートなどだ。