2020年7月14日(日本時間)、Microsoft社よりWindows DNSサーバにリモートでコード実行が可能な脆弱性が公開されました[1]。これは不正なDNSレスポンスをWindows DNSサーバが適切に処理できないことにより影響を受けるものです。
本脆弱性はCheckPoint社のリサーチャーによって発見され、"SIGRed"と命名されました[2]。共通脆弱性評価システム(CVSS)においても最高となるスコア10と評価され、今後の攻撃コード公開状況によっては、「ワーム化可能」とされる脆弱性です。
本記事では、本脆弱性の検証結果やその悪用を試みる通信の痕跡の確認方法について解説します。
本脆弱性の概要
本脆弱性は、DNSにおけるリクエストや処理の認証に使われるSIGレコード(電子署名が定義されているリソースレコード)に対するクエリの応答に、巨大なサイズのメッセージを付与することでターゲットのWindows DNSサーバのメモリ領域にバッファオーバーフローを発生させるものです。
ベンダーより報告されている本脆弱性の影響を受ける環境は以下のとおりです。
- DNSサーバとして構成されているWindowsサーバ
※Active Directory環境でDNSサーバ機能が稼働しているWindowsサーバも対象となります。
詳細な影響バージョンなどはベンダーの情報を参照ください。本脆弱性は2020年7月のセキュリティ更新プログラムにて修正プログラムが公開されています[3]。
本脆弱性の検証結果
本脆弱性を悪用し対象ホストをサービス不能にする検証コードが既に公開されており、本検証では脆弱な環境における当該検証コードの有効性を確認しました。なお、本記事公開時点でリモートからコード実行を行う手法は公開されておりません。
当社では脆弱性検証を Windows DNSサーバ機能を有効化にしたWindows Server 2008 R2で実施し、以下のことを確認しました。
-
本脆弱性を有する環境において、DNSサーバをサービス不能状態にさせることが可能である。
-
ベンダーが推奨する回避策を適用することで攻撃は成立しなくなる。
脆弱性を悪用する流れ
以下に本検証で確認した脆弱性を悪用する一連の流れを示します(図1)。検証の結果、本脆弱性を悪用する検証コードを用いることでターゲットのWindows DNSサーバが不正なDNSレスポンスを受信し、サービス不能の状態に陥ることを確認しました。
図1. 脆弱性を悪用する一連の流れ
- クライアント端末がターゲットのWindows DNS サーバに対して、攻撃者が用意した不審ドメインの名前解決をリクエスト
- ターゲットのWindows DNS サーバは、上位に設定されている権威DNSサーバに問い合わせを実施
- 権威DNSサーバは、攻撃者の用意したDNSサーバの情報(NSレコード)を送信
- ターゲットのWindows DNS サーバが、攻撃者の用意したDNSサーバに問い合わせを実施
- 攻撃者の用意したDNSサーバがターゲットのWindows DNS サーバへ不正なDNSレスポンスを送信
- 不正なDNSレスポンスを受信したWindows DNS サーバがサービス不能状態に陥る
以下は、本脆弱性を悪用する際にクライアント端末が送信するDNSクエリの例です。(図2)
この際、typeオプションにて「sig」を指定することによりSIGレコードを問い合わせます。
図2. 不審なドメインを問い合わせるDNSクエリ
以下はWindows DNS サーバからのDNSリクエスト(図3)に対して、攻撃者が用意したDNSサーバが応答したDNSレスポンス(図4)の例です。
図3. 攻撃者が用意したDNSサーバに対するDNSリクエスト
図4. 攻撃者が用意したDNSサーバから送信されたDNSレスポンス
まず、Windows DNS サーバからのDNSリクエストはUDPで行われます。攻撃者が用意したDNSサーバは応答通信にTruncatedフラグをセットして応答することでTCPによるDNS通信への切り替えを要求します。その後、Windows DNS サーバはTCPで攻撃者が用意したDNSサーバに対してDNSリクエストを行い、そのレスポンスとして巨大なサイズのデータを応答します。
本脆弱性を悪用するレスポンスでは、メッセージ圧縮の仕組みを悪用して、Windows DNS サーバがDNSレスポンスを処理するために確保しているメモリ領域を超えるサイズとなるよう細工されており、これによりバッファオーバーフローが引き起こされます。
以下は不正なDNSレスポンスを受信した結果、Windows DNSサーバがサービス不能状態となることを確認したものです。(図5)
図5. Windowsサーバ上で確認できたDNSサーバエラーメッセージ
不正なレスポンスはWindows DNS サーバのクエリログでは以下のように確認できます。(図6)
図6. 不正なレスポンスを含むDNSクエリログ
本検証で得られた通信では、クエリログに以下の特徴を含むことが確認できます。
- レスポンスはTCPで送信されていること
- リソースレコードがSIGであること
- Signatureフィールドに巨大なデータがセットされていること
回避策の有効性確認
本脆弱性に対する修正プログラムの公開と合わせて、回避策がベンダーより公開されています。詳細はベンダーの情報を参照ください[4]。
ベンダーが推奨する回避策は本脆弱性を有するWindowsサーバのレジストリを変更するものです(変更時にDNSサービスの再起動が必要となります)。以下は回避策を適用したレジストリ設定です。(図7)
これにより、TCPによるDNSレスポンスパケットの最大受信サイズを65,280バイトへ制限します。
- HKEY_LOCAL_MACHINE\SYSTEMCurrentControlSet\Services\DNS\Parameters\TcpReceivePacketSize
※TcpReceivePacketSizeは存在しない場合、新規追加が必要です。 - 値 = 0xFF00
※DWORD(32ビット値)
図7. 回避策適用により変更されたレジストリ値
回避策の適用後、再度同様の検証を実施し回避策の有効性を確認しました。その結果、不正なTCPのレスポンスはドロップされクエリログにも記録されておらず、本検証に用いた検証コードでは攻撃が成立しなくなることが確認できました。(図8)
図8. 回避策適用後のDNSクエリログ
回避策の適用により本検証に用いた検証コードによる脆弱性悪用の影響を受けなくなることを確認できましたが、ベンダーはできるだけ早くセキュリティ更新プログラムを適用することを推奨しています。なお、回避策の適用後、上位権威DNSサーバからのDNSレスポンスが65,280バイトより大きい場合はそのレスポンスパケットはエラーなしでドロップされます。
そのため、一般的な環境では影響を受ける可能性は低いと考えられますが、Windows DNSサーバによるクライアントの名前解決が正常に行えなくなる可能性がありますのでご注意ください。本件における詳細な対策方法はベンダーの情報を参照ください。
本脆弱性の悪用を試みる通信の確認手法
脆弱性検証の結果から、本脆弱性を悪用する通信の有無は以下の方法で確認可能であると考えております。
- Windows DNSサーバのクエリログから不審なドメインとSIGレコードもしくはRRSIGレコードがセットされたリクエストを確認する※
- Windows DNSサーバが稼働しているWindowsサーバの上位に存在するIDSやIPSにてDNSレスポンスパケットをキャプチャし、65,280バイトを超えるようなDNSレスポンスを確認する
(具体的な確認箇所としては、図4のパケットにおいてData Lengthの1バイト目が「ff」にセットされている箇所となります)
※本検証に用いた検証コードはSIGレコードを指定したDNSクエリを利用するものでしたが、CheckPoint社の報告によりますとSIGレコードと同様にRRSIGレコード(DNSSECにて署名検証に使用されるレコード)についても本脆弱性の悪用に利用される可能性があるとしています。
Windows DNSサーバのクエリログを確認するには、あらかじめDNSサーバのプロパティからデバッグログの取得を有効にする必要があります。(図9) なお、一般的にクエリログの取得は負荷がかかりますので、有効にする際はサーバリソース等に影響が発生する可能性がありますのでご注意ください。
図9. Windows DNSサーバのデバッグログ取得の設定例
本脆弱性の悪用を試みるシナリオ
本脆弱性が悪用されるシナリオについて考察します。
- 組織内に侵入した攻撃者や内部犯行による場合
組織内に侵入した攻撃者や内部犯行による攻撃者がいた場合、環境内で使用する Windows DNSサーバに悪意のあるリクエストを送信することで対象ホストが悪用されるシナリオが想定されます。
- 攻撃者が外部から攻撃の発生を誘導する場合
CheckPoint社の報告によればブラウザからも不審なDNSクエリを送ることができるとされています。そのため、組織内のユーザが不審なDNSクエリを誘発するようなスクリプトを含むウェブサイトへのリンクを記載したメールを受信し、そのリンクから当該ウェブサイトにアクセスすると、スクリプトによって本脆弱性を悪用する通信が発生してしまうシナリオも想定されます。本シナリオの成立には、必ずしも組織内に攻撃者が侵入している必要はない点に注意が必要です。
なお、本脆弱性はSIGレコードに起因しているため、Webページを閲覧する際に通常発生するAレコードを指定したDNSリクエストでは本脆弱性を悪用できません。そのため、単純に攻撃者が用意した不審ドメインにアクセスさせるだけでは、SIGレコードを指定しないDNSリクエストとなるため本検証コードによる攻撃の影響はないものと考えられます。
また、設定不備等の理由により組織内のWindows DNSサーバが、インターネット上からの問い合わせを受け付けているオープンリゾルバになっていた場合は、攻撃者は対象のホストに対して悪意のあるDNSリクエストを送信することが可能であるため、容易に攻撃ができてしまう状況となります。
組織内部にWindows DNSサーバが設置されている環境下では、直接外部から攻撃を受ける可能性は低いと考えられますが、今後新たなリモートによるコード実行が可能な攻撃コードがリリースされた場合には、攻撃が成功すると対象のDNSサーバが稼働するWindowsサーバやActive Directory環境では組織内のドメインが掌握される可能性があります。
対策
本記事公開時点(2020年7月29日)で本脆弱性を悪用する検証コードは Windows DNSサーバをサービス不能状態にするもののみが確認されていますが、今後リモートからコード実行が可能な攻撃コードが公開される可能性があります。
そのため、脆弱な環境を利用している場合は、早急にベンダーから公開されている修正プログラムを適用することを推奨いたします。早急な修正プログラムの適用が困難な場合は、ベンダーの推奨する回避策を適用することが重要です。
[1] Microsoft「CVE-2020-1350 | Windows DNS サーバのリモートでコードが実行される脆弱性」
https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/CVE-2020-1350
[2] Check Point Research「SIGRed - Resolving Your Way into Domain Admin: Exploiting a 17 Year-old Bug in Windows DNS Servers」
https://research.checkpoint.com/2020/resolving-your-way-into-domain-admin-exploiting-a-17-year-old-bug-in-windows-dns-servers/
[3] Microsoft「2020 年 7 月のセキュリティ更新プログラム」
https://portal.msrc.microsoft.com/ja-JP/security-guidance/releasenotedetail/2020-Jul
[4] Microsoft「KB4569509: DNS サーバーの脆弱性に関するガイダンス」
https://support.microsoft.com/ja-jp/help/4569509/windows-dns-server-remote-code-execution-vulnerability