NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

NXNSAttackについて

本記事ではNXNSAttackという脆弱性について検証した結果を紹介します。

NXNSAttack (Nonexistent Nameservers Attack) とは2020年5月に公表されたDNSゾルバの脆弱性であり、様々な実装(UnboundやBIND、PowerDNSなど)で影響を受けます。特定のDNSゾルバに関する脆弱性は度々公開されますが、様々なDNSゾルバに影響する脆弱性が公表されたのは久々なので検証してみました。

尚、本記事ではDNSの基礎的な知識が必要となります。もし、DNSに関して初学であれば「DNSがよくわかる教科書」という書籍がおすすめです。

https://www.amazon.co.jp/dp/B07KQSRZ1Swww.amazon.co.jp

脆弱性の概要

NXNSattackは権威DNSサーバに多数のNSレコードを登録し、DNSゾルバに再帰問い合わせをさせることで多数の再帰問い合わせを権威サーバに送出させる脆弱性です。この脆弱性が悪用されることで、様々なオープンリゾルバ(インターネット上のどの端末からも名前解決を要求できる状態のDNSゾルバ)に名前解決要求を送信させ第三者の権威DNSサーバがDDoS攻撃にさらされる可能性があります。

脆弱性を利用した攻撃手順詳細と攻撃時の処理フローについて説明します。

攻撃手順

  1. 攻撃者は自身が管理している権威DNSサーバに対し、下記要件を満たすNSレコードを多数登録する
    • 標的権威DNSサーバに対し再帰問い合わせをさせるドメイン
      • 例:標的がexample.comであればnx1.example.comnx2.example.comnx3.example.comなど
    • 再帰問い合わせをした際に標的権威DNSサーバがNXDOMAINを返すドメイン名にする
    • グルーレコードは登録しない
  2. 攻撃者が脆弱なDNSゾルバに対し、登録したレコードを再帰解決させるための名前解決要求を送信する
    • 例:dig example.com @openresolver.example.org

f:id:YamakaNoriko:20210728112003p:plain(画像引用元:https://www.nxnsattack.com/

攻撃時の処理フロー

  1. DNSゾルバが攻撃者の権威DNSサーバに対して再帰問い合わせを試行する
    • この時、攻撃者が登録したNSレコード(大量のドメイン名が含まれる)がレスポンスとして返ってくる
  2. 標的権威DNSサーバに対し、再帰問い合わせを試行する
    • 対応付けられたレコードが無いためNXDOMAINが返る
    • 例:nx1.example.comに対して問い合わせるもののNXDOMAINが返る
  3. 標的権威DNSサーバに対し、NSレコードに登録されていた別のドメイン名の再帰問い合わせを試行する
    • こちらも対応付けられたレコードが無いため失敗する
    • DNSゾルバは「問い合わせ結果が返ってくる」か「NSレコードに登録されていた移譲先全てに問い合わせるものの全て失敗する」まで問い合わせを繰り返す
    • 例:nx2.example.comnx3.example.comに対して問い合わせるもののNXDOMAINが返る

f:id:YamakaNoriko:20210728112113p:plain(画像引用元:https://www.nxnsattack.com/

実証

検証内容

上記の脆弱性について下記2つの検証を実施しました。

  1. 脆弱性の動作確認
    • 脆弱性が存在するバージョンのDNSゾルバを用意し、攻撃を検証する
  2. 脆弱性が修正されたバージョンの動作検証
    • 修正済みバージョンで攻撃を試行し、攻撃がどのように失敗するのか検証する

検証1.脆弱性の動作確認

脆弱なバージョンのDNSゾルバを用意し、脆弱性を試行した際の挙動を確認します。

構成環境

〇権威DNSサーバ

  • NSD (4.3.0)
    • NSDのバージョンは脆弱性の動作に影響しません

DNSゾル

  • unbound (1.9.3)
    • 脆弱性が修正されていないバージョンです

権威DNSサーバ(NSD)にNSレコードを約900件追加しました。下記の様な設定ファイル(/etc/nsd/zones/example.con.zone)となります。

f:id:YamakaNoriko:20210727100953p:plain

上記設定を追加し、権威DNSサーバにsub.example.comのNSレコードを1度問い合わせるとnx001.example.comnx900.example.comのホスト名が含まれていることを確認しました。尚、900件程のNSレコードを登録する場合はレスポンスサイズが512バイトを超えるため、TCPフォールバックもしくはEDNS0を有効化しておく必要があります。

実際にDMSリゾルバ(unbound)に名前解決要求を送信し、挙動を確認しました。その結果、下記のことが分かりました。

  • キャッシュDNSに問い合わせた所、NSレコードに含まれる全てのドメイン名を解決しようとした
  • 1度の名前解決要求で発生する合計パケット数は約20,000程度
  • 1レコード辺りの問い合わせ回数は20回程度
  • 問い合わせに失敗した場合に、何度か(大体8回程度)再問い合わせを実行する

その際のパケットキャプチャが下記の通りとなります。NSレコードに記載されているホスト名全てに再帰解決している様子が見受けられます。

10.4.0.60DNSゾルバのIPで、末尾48のIPが権威DNSサーバです

f:id:nfl_iw:20210813120727p:plain f:id:nfl_iw:20210813120736p:plain

ちなみに、1000件ほどのNSレコードを登録して再試行した所、NSレコードの取得に失敗しました。パケットを確認してみると、TCPハンドシェイクは確立し権威DNSサーバにドメイン名を送信した直後にコネクションが切断されていることが分かりました。その際のパケットキャプチャが下記の通りとなります。

172.17.0.2DNSゾルバのIPで、末尾48のIPが権威DNSサーバです

f:id:nfl_iw:20210813151613p:plain

恐らく、レスポンスのメッセージサイズを計算した結果65535バイトを超えたため権威DNSサーバアプリケーション(NSD)側でコネクションを切断したものかと思われます。

検証2.脆弱性が修正されたバージョンの動作検証

修正済みバージョンのDNSゾルバ(unbound)を用意し、脆弱性を利用した攻撃がどのように失敗するのか検証します。

構成環境

〇権威DNSサーバ

  • NSD (4.3.0)
    • NSDのバージョンは脆弱性の動作に影響しません

DNSゾル

  • unbound (1.10.1)

検証1と同様に900件のNSレコードを登録して攻撃を試行してみました。その結果、40回程度問い合わせを試行した後、Failと判断し再帰問い合わせを中断しました。

その際のパケットキャプチャが下記の通りとなります。

172.17.0.2DNSゾルバのIPで、末尾48のIPが権威DNSサーバです

f:id:YamakaNoriko:20210728112254p:plain

パケットキャプチャの結果から、脆弱性に対する緩和策として再起問い合わせの回数に制限がかけられている様子がうかがえます。

対策

脆弱性については既に多くDNSゾルバで修正パッチが公開されております。修正パッチを適用することで、本脆弱性の影響を緩和できます。

もし、自組織がDNSゾルバが意図せずオープンリゾルバとなっている場合は設定の見直しをおすすめします。本脆弱性に関わらずDDoS攻撃の踏み台などに利用されるためです。

脆弱性の影響を受ける可能性のあるDNSゾルバをShodanで調査したところ、2万件以上のオープンリゾルバが見つかりました。(調査日:2021年8月13日)

UnboundではなくBINDであれば、より数は多くなるかと思います。ただし、UbuntuCentOSなどのディストリビューションの様にパッチを適用してもバージョン番号が変化しないことが多々あります。この2万件の中にはパッチ適用済みのサーバも含まれている可能性があることをご留意ください。

f:id:nfl_iw:20210816103216p:plain

尚、NXNSAttackはDNSゾルバを利用した増幅型攻撃に利用される恐れのある脆弱性です。そのため、自組織では対策をしていても他組織のDNSゾルバ上から増幅したパケットが送られてくる可能性があります。つまり、自組織のDNSゾルバが増幅型攻撃の踏み台として利用される可能性は低減できるものの、他組織を踏み台とした自組織の権威DNSサーバへのDDoS攻撃を防ぐことはできません。

参考文献

〇NXNSAttack (脆弱性公表者のHP)