TOP > タイガーチームセキュリティレポート > Windows DNSサーバのリモートでコードが実行される脆弱性ーSIGRed(CVE-2020-1350)
タイガーチームセキュリティレポート
はじめに
2020年7月14日マイクロソフトからDNSサーバの脆弱性情報(CVE-2020-1350)が公開された。 この脆弱性はDNSサーバ上でリモートコードが実行される危険性をはらんでいる脆弱性で、CVSS基本スコアは10.0となっている。 本記事ではこの脆弱性がどのように利用され攻撃が実行されるのか検証する。
脆弱性の概要
本脆弱性はヒープ領域をオーバーフローさせることによってリモートから任意のコードを実行することが可能となる脆弱性で、DNSサーバとして構成されているWindowsサーバが対象となる。
PoCによる攻撃の検証
本脆弱性を利用してDNSサーバをクラッシュさせるPoCがgithub上に公開されている。本PoCを利用することによって脆弱性を利用された際の状況を確認してみる。
前提とする知識
・DNSは53番ポート(UDP/TCP)を利用する。
・UDPにおいて、レスポンスでTruncatedを返すと、TCPで再度問い合わせを実施する。
・DNSメッセージの最大サイズはUDP:512byte、TCP:65,535byteである。
評価環境と攻撃の流れ
以下に評価した環境と攻撃の流れを示す。 本来はドメインをドメインレジストラに登録して攻撃用のネームサーバに問い合わせる流れになるが、本評価では被攻撃対象となるWindowsサーバのDNS設定において、「条件付きフォワーダ」を設定して評価を実施した。
【攻撃の流れの詳細】
1.クライアント端末から攻撃者が管理するドメイン名を指定して、「DNSレコードタイプ=SIG」のリクエストを送信
2.Windowsサーバから攻撃用DNSサーバに対してUDPでリクエストを送信
3.攻撃用DNSサーバからTruncatedフラグをセットしたレスポンスを送信
4.Windowsサーバから攻撃用DNSサーバに対してTCPでリクエストを再送
5.攻撃用DNSサーバから巨大なサイズのレスポンスを送信
6.DNSサーバがクラッシュしてサービスが利用不可の状態となる
実施結果
クライアントPCから攻撃者が管理するドメインに対してリクエストを送信すると、クライアントPCでは応答がない状態となった。
WindowsサーバではDNSサーバが停止した状態となっており、イベントログにエラーが出力されていた。
攻撃時のパケットを確認すると、最初にUDPによるリクエストをWindowsサーバから攻撃用DNSサーバに送信した後、 攻撃用DNSサーバからUDPによりレスポンスが送信されており、レスポンスにはTruncatedフラグが設定されていることが確認できた。
また、DNSサーバがクラッシュした時のレスポンスのパケットを確認すると、TCPを利用した通信により65,515byteの巨大なサイズのレスポンスが送信されていることが確認できる。 また、その時の「Signer's name」フィールドが壊れて表示されている。
これは、攻撃者により「Signer's name」を参照するオフセットが細工されており、本来指定するべきオフセットから1byteずらしていることが原因である。 これにより、65,535byte以上のサイズでメモリ領域を確保しようとするが、サイズを指定するための整数値がオーバーフローして小さなメモリ領域しか確保できずサービスがクラッシュする。
実際にこの「Signer's name」のフィールドに正しいオフセットを指定すると、DNSサーバはクラッシュせずクライアントPCに応答が返ってくることが確認できた。
評価結果のまとめ
以上の検証した結果から以下の事項を確認することができた。
・本脆弱性の攻撃にはTCPによるDNS通信が発生する。
・DNSレコードタイプに「SIG」を指定する。
・被攻撃側のDNSサーバは巨大なサイズのレスポンスを受信する。
・攻撃パケットを確認すると「Signer's name」のフィールドの値が壊れて表示される。
対策
通信経路上の攻撃検知
検証結果から内部DNSサーバと外部DNSサーバの通信経路上のパケットにおいて、以下の条件に該当するパケットを監視することで攻撃を検知することが可能であると考えられる。
・DNSのパケットサイズ(DNSパケットの先頭2バイトの値)が65,280byteを超えるサイズであり、レコードタイプがSIGもしくはRRSIG
※今回の検証ではDNSレコードタイプがSIGの場合のみ確認したが、本脆弱性の発見者であるCheckPoint社によるとRRSIGでも同様の脆弱性があるとしている。
DNSサーバにおいて攻撃を無効にする対策
本脆弱性の対策としては、マイクロソフトより以下のページにセキュリティパッチが公開されているので、本セキュリティパッチを適用することが最善の方法である。 何らかの理由によりセキュリティパッチが適用できない場合は、同ページに回避策としてレジストリを設定する回避策が提示されているので、本設定を入れることで回避することが可能となる。
https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/CVE-2020-1350
本脆弱性に対応済みかどうかを確認するスクリプトもgithubに公開されている。 管理されているサーバが対応されているかわからない場合は、以下のサイトのスクリプトを利用して確認してみるとよいだろう。
https://github.com/T13nn3s/CVE-2020-1350/blob/master/CVE-2020-1350-checker.ps1
本スクリプトを実行すると、メニューが表示され「1」を押すと脆弱性に対応済みかどうかチェックしてくれる。 何も対策していない環境で実行した結果が以下の図である。「You're vulnerable」と表示され対策されてないことが確認できる。
参考情報
[1] SIGRed (check point research)
https://research.checkpoint.com/2020/resolving-your-way-into-domain-admin-exploiting-a-17-year-old-bug-in-windows-dns-servers/
サイバーセキュリティ研究所 北島