エクスプロイト&脆弱性
脆弱性「PrintNightmare」を悪用する攻撃手口を解説
本ブログ記事では、PrintNightmare用エクスプロイトおよびパッチ開発に関する時系列について概説すると共に、脆弱性「PrintNightmare」を悪用した攻撃手口の流れを解説し、印刷スプーラーサービスなどのシステム内に見られる重大なセキュリティ上の欠陥(バグ)がもたらすリスクを軽減するための推奨事項をお伝えします。
PrintNightmareは、Microsoft Windowsの印刷スプーラーの脆弱性「CVE-2021-1675」「CVE-2021-34527」「CVE-2021-34481」「CVE-2021-36958」です。これは、印刷スプーラーサービスにおいてリモートおよびローカルの両方で任意のコードが実行される脆弱性であり、同サービスを実行しているすべてのWindowsのバージョンに影響します。多くのリサーチャは、異なる実装(TCPまたはSMB上)に基づくさまざまなProof of Concept(PoC、概念実証型エクスプロイト)を考案しました。Print System Asynchronous Remote Protocol(MS-PAR)のさまざまな関数呼び出しを用いてRpcAsyncAddPrinterDriverを悪用することで、サーバまたはワークステーション上でPrintNightmareが悪用される可能性があります。また、一方でPrint System Remote Protocol(MS-RPRN)を悪用することで、PrintNightmareはRpcAddPrinterDriverExを悪用してimpacketを実装する可能性があります。
本ブログ記事では、PrintNightmare用エクスプロイトおよびパッチ開発に関する時系列について概説すると共に、脆弱性「PrintNightmare」を悪用した攻撃手口の流れを解説し、印刷スプーラーサービスなどのシステム内に見られる重大なセキュリティ上の欠陥(バグ)がもたらすリスクを軽減するための推奨事項をお伝えします。
■「Print Nightmare」脆弱性のタイムライン
PrintNightmareに関する時系列は以下の通りです。
1. 2021年6月8日:2021年6月のセキュリティアップデートの一環として、印刷スプーラーサービスにおける特権昇格(elevation of privilege、EOP)として特定されたバグに対処するための修正プログラム(パッチ)がリリースされる。この脆弱性は、「CVE-2021-1675」としてタグ付けされる。
2. 6月21日:上記のバグが、リモートコード実行(Remote Code Execution、RCE)および特権の昇格の両方の脆弱性に分類される。
3. 6月29日:リモートコード実行および特権昇格に関するさまざまな概念実証(Proof of Concept、PoC)を作成した外部リサーチャは、PrintNightmareと全く同じ内容を発見していたことに気付けなかったと同時に、これらのバグが2021年6月のセキュリティアップデートの一環として既に緩和されているものと勘違いし、これらの概念実証を誤って一般公開してしまう。後にこれらのバグがまだ緩和されていないと知ったリサーチャは自身の公開した概念実証を削除したが、これらの情報はすでにコピーされており、最終的には検索エンジンにキャッシュされてしまう。
4. 7月1日:ゼロデイ脆弱性とみられる新たな脆弱性に「CVE-2021-34527」が割り当てられる。
5. 7月6日:Microsoftは、CVE-2021-34527による影響を緩和するために緊急パッチをリリースしたが、リモートコード実行の一部しか防ぐことができず、具体的には、「\\server\share\」のようなパスの実装からDLLファイルをブロックするだけであった。
6. 7月7日:外部リサーチャがCVE-2021-34527におけるバイパス機能を報告する。報告内容には、パスを示す汎用名前付け規則(Universal Naming Convention、UNC)形式の「\\」ではなく「\??\UNC\」の使用によりパッチを回避する可能性があるとする情報が含まれる。
7. 7月15日:Microsoftは、印刷スプーラーサービスに新たな特権の昇格の脆弱性が見つかったことを公表し、CVE-2021-34481を割り当てる。
8. 8月10日:Microsoftは、CVE-2021-34481に関する情報を更新すると共に、この脆弱性に対処するためのパッチをリリースする。
図1:PrintNightmare用エクスプロイトおよびパッチ開発に関する時系列
次の節では、すでに一般公開されているさまざまな実装や概念実証のほかに、PrintNightmareに関する弊社の見解を詳しく説明します。
■「Print Nightmare」脆弱性の解説:印刷スプーラーサービス
印刷スプーラーサービスを有効にすることで、クライアントやサーバは印刷に関連するタスクを実行できるようになります。印刷スプーラーは、プリントサーバ上で印刷クライアントに対して開いている印刷キューを共有します。印刷スプーラーサービスは、印刷クライアント上でアプリケーションに対して印刷スプーラーAPIを開き、アプリケーションの印刷出力を受け取ったのち、共有設定されている印刷キューまたはプリントサーバに送信します。
図2:印刷スプーラー(Print Spooler)のプロパティ(ローカルコンピュータ)
トレンドマイクロは、印刷スプーラーサービスの詳細を表示するためにWindows SysinternalsのProcess Explorerを使用し、バイナリ(「spoolsv.exe」)が最上位権限の一つであるSYSTEM特権で実行されていることを確認しました(図2)。印刷スプーラーサービスでは過去に脆弱性における難題が見つかっており、悪用されるとシステムコンテキスト内で任意のコード実行が可能となります。この脆弱性は、印刷スプーラーがどのようにプリンタドライバを読み込むかに焦点を絞っています。印刷スプーラーサービス自体が最上位権限で実行されるため、任意のコード実行も最上位権限で実行されます。
公認情報システム監査人(Certified Information Systems Auditor、CISA)は、脆弱性「PrintNightmare」が攻撃者によって積極的に悪用されていると指摘しています。ネットワークベースで実行されるこの攻撃は、低い特権を持つユーザによって実行される可能性があります。これは、ドメインコントローラやプリントサーバなどの多くの端末上で印刷スプーラーサービスがデフォルトで無効化されていないことが要因の一つとなります。攻撃者はPrintNightmareを悪用することでシステムコンテキスト内での任意のコード実行が可能となるため、特権を昇格させるための常套手段として利用している可能性があります。
■脆弱性「PrintNightmare」を悪用した攻撃手口の流れ
トレンドマイクロは、脆弱性「PrintNightmare」が悪用される可能性を示唆する痕跡がいくつか存在することを観測しました。本節では、PrintNightmareを悪用した攻撃に対抗するための今後の参考として、PrintNightmareを悪用した攻撃手口の流れを詳説します。
図3:脆弱性「PrintNightmare」を悪用した攻撃手口の流れ
印刷スプーラーサービスを悪用する手口は、以下のように分けることができます。
1. 攻撃者によって印刷スプーラーサービスに内在する脆弱性が悪用される。
2. 攻撃者が管理するSMBファイル共有フォルダ上に存在する悪意のあるDLLファイルが被害者の端末によってアクセスされる。
3. 悪意のあるDLLファイルがディスクに書き込まれる。
4. 書き込まれたDLLファイルが印刷スプーラーサービスによって読み込まれ、実行される。
5. DLLファイルの形式が不適切な場合、印刷スプーラーサービスの動作が停止する。
6. DLLファイルのコードに基づいて、コマンド&コントロール(遠隔操作)あるいは特権の昇格が実行される。
印刷スプーラーサービスのイベントログがデフォルトで有効になっていない場合、管理者やユーザは以下のPowerShellコマンドを使って有効化することが推奨されます。
$logs = Get-LogProperties 'Microsoft-Windows-PrintService/Operational' $logs.Enabled = $true Set-LogProperties -LogDetails $logs |
さらに管理者は、「アプリケーションとサービス」ログに移動して、[ Admin ]イベントおよび[ Operational ]イベントの両方を有効化することで、悪用の試みを検出することもできます。
図4:ログを有効化することで、イベントビューアを用いてイベントを監視できるようになる
トレンドマイクロはPrintNightmareが悪用された際に、脆弱な端末上で記録された次のアクティビティを観測しました。攻撃者が管理するSMBファイル共有フォルダから悪意のあるDLLファイルが取り出され、標的端末のディスクに書き込まれます。DLLファイルがプロセス「spoolsv.exe」のメモリ内に注入されると、プロセス監視ツール「Process Monitor」上で「Load Image」(画像の読み込み)という操作が観測されます。DLLファイルがプロセス内に読み込まれると、悪意のあるコードが実行されます。
図5:攻撃者が管理するSMBファイル共有フォルダから悪意のあるDLLファイルが取り出される様子
図6:標的ホストコンピュータ内で悪意のあるDLLファイルが作成された時の様子
この攻撃は2つのステージで構成されています。
A. ステージ0
1. SMBファイル共有フォルダ内に存在するDLLファイルのパスが、「pDataFile」という値を用いて「RpcAddPrinterDriver」を1回だけ呼び出す。
2. パス「%windir%\System32\spool\drivers\x64\3\」内でDLLファイルが検索される。
3. 「%windir%\System32\spool\drivers\x64\3\New\<name_of_dll>.dll」にて新たなファイルハンドルが開かれる。
4. 「WriteFile」の操作が完了すると、パス名が「%windir%\System32\spool\drivers\x64\3\<name_of_dll>.dll」に変更される。
5. 最終的にDLLファイルは上記の名前が変更されたパスに常駐する。
図7:ステージ0では、「WriteFile」の操作が完了すると、名前が変更されたパス内にDLLファイルが常駐する
A. ステージ1
1. ステージ0の完了後、DLLファイルは「%windir%\System32\spool\drivers\x64\3\」というパスにすでに常駐している。
2. 印刷スプーラーサービス内にDLLファイルを読み込むために、「RpcAddPrinterDriver」呼び出しを実行し、アップロードされたDLLファイルへのローカルパスとして「pConfigFile」を指定する。
3. プロセス「spoolsv.exe」内にDLLファイルが読み込まれると、「Load Image」の操作が観測される。
図8:印刷スプーラーサービス内にDLLファイルが読み込まれた時の様子
図9:ステージ1で観測されたDLLファイルが、プロセス「spoolsv.exe」内に読み込まれた時の様子
トレンドマイクロはProcess Explorerを使用して、プロセスが生成された順序を示すプロセスの親子関係を確認しました(図10)。「spoolsv.exe」が悪意のあるDLLファイルを読み込むと、rundll32がDLLファイルを実行します。DLLファイルのコード(今回の場合は攻撃者にリバースシェルを与えます)に基づいて、「spoolsv.exe」から「rundll32.exe」が生成され、「rundll32.exe」からは「cmd.exe」が生成されます。解析者やITチームはプロセスの親子関係を確認することで特定のアクティビティがどこから発生したのかを理解することができます。これは、脅威探索の際に関連するプロセスを絞り込むのにも役立ちます。
図10:親プロセス「spoolsv.exe」を階層表示した時の様子
印刷スプーラーサービス内にDLLファイルを読み込もうとすると、プリンタサービスのイベントログに以下のイベントIDが観測されます。
1. DLLファイルが不適切な場合、イベントソース「Microsoft-Windows-PrintService/Operational」からイベントID 808が観測されます。
図11では、不適切なDLLファイルへのパスが詳細に表示されており、印刷スプーラーが悪意のあるDLLファイルの読み込みに失敗したことを示しています。このイベントIDは、PrintNightmareが悪用された可能性を示す確信度の高い痕跡です(ステージ1)。
図11:イベントID 808
2. 印刷スプーラー内に新たなプリンタドライバが追加または更新されると、イベントID 316が観測されます。図12ではDLLファイルの名前が詳細に確認できると共に、このイベントにおいてPrintNightmareの悪用が成功したことと失敗したことの両方が記録されています(ステージ0)。
図12:イベントID:316
■脆弱性「PrintNightmare」の被害に遭わないためには
PrintNightmareは、不規律な情報開示から公式パッチの回避機能の開示に至るまで、外部リサーチャによる不注意が発端となっています。これらの概念実証はすでに「Metasploit Framework(MSF)」などのフレームワークや「Mimikatz」などのツールに反映されています。また、本記事で解説した攻撃経路にはリモートコード実行およびローカル特権昇格の両方の機能が含まれており、ユーザによる操作を必要とせずに低い特権を持つユーザのコンテキストから起動できることから、PrintNightmareを悪用する手口は、特権の昇格またはラテラルムーブメント(横展開)を試みる攻撃者にとっての常套手段となることが推測されます。
印刷スプーラーサービスは、ほとんどのWindowsのバージョンにてデフォルトで有効になっており、ほとんどの企業ネットワーク環境内ではポートが開いたままとなっているため、攻撃者に悪用される可能性が高くなります。Active Directory(AD)環境内に侵害されたエンドポイント(PC端末)が存在する場合、攻撃者は印刷スプーラーサービスを実行しているすべてのシステム(ドメインコントローラとプリントサーバを含む)上で特権を取得できてしまいます。
PrintNightmareを悪用した脅威の被害を防ぐために、以下の対応を行うようにして下さい。
- Microsoftから提供されている、PrintNightmareの脆弱性を修正するパッチを適用する。
- パッチ適用ができない場合、印刷スプーラーサービスを一時的に無効にする。
- 印刷スプーラーサービスのイベントログや各種ログ監視機能を有効にして、攻撃の兆候を監視できるようにする。
■トレンドマイクロの対策
「Trend Micro Vision One™」は、XDR(Extended Detection and Response)ソリューションを超える付加価値と新たなメリットを提供し、企業が「より多くを把握し、迅速に対応する」という目的を実現する脅威防御のプラットフォームです。メール、エンドポイント、サーバ、クラウドワークロード、ネットワークといった複数のセキュリティレイヤーにまたがる情報を収集し、自動的に相関させる深く幅広いXDR機能を提供する「Trend Micro Vision One™」は、自動化された防御機能によって攻撃の大半を防ぐことが可能となります。
「Trend Micro Hybrid Cloud Security」として提供されるセキュリティソリューションは、クラウドネイティブシステムとその多様なレイヤーを保護するのに役立ちます。ソリューションとして提供される製品群は継続的インテグレーションおよび継続的デリバリー(CI / CD)パイプラインとアプリケーションの自動保護を提供するクラウドビルダー向けのセキュリティサービスプラットフォーム「Trend Micro Cloud One™」を利用しています。また、セキュリティの問題をいち早く特定して解決し、DevOpsチームの問題解決速度を改善するのにも役立ちます。Trend Micro Cloud One™には、以下が含まれています。
- 「Trend Micro Cloud One™ Workload Security」:データセンター、クラウド、 コンテナを保護する多層防御・脆弱性対策を提供するクラウド型セキュリティ
- 「Trend Micro Cloud One™ Container Security」:コンテナイメージのスキャン、アドミッションコントロール、コンテナの実行時保護をまとめて実現
- 「Trend Micro Cloud One™ File Storage Security」:クラウドファイル/オブジェクトストレージのためのセキュリティ
- 「Trend Micro Cloud One™ Network Security」:マルチクラウド環境のための強力なネットワークレイヤのセキュリティ
- 「Trend Micro Cloud One™ Application Security」:コンテナ、サーバレスなどに構築された最新のアプリケーションおよびAPI向けセキュリティ
- 「Trend Micro Cloud One™ Conformity」:クラウドインフラストラクチャの継続的なセキュリティ、コンプライアンス対応状況の確認および可視化
参考記事:
- 「Detecting PrintNightmare Exploit Attempts using Trend Micro Vision One and Cloud One」
by Nitesh Surana
記事構成:岡本 勝之(セキュリティエバンジェリスト)
高橋 哲朗(スレットマーケティンググループ)
翻訳:益見 和宏(Core Technology Marketing, Trend Micro™ Research)