おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

【私家訳】新しくモダンでセキュアなWindows向け印刷体験

このブログはMicrosoftJohnathan Norman氏による

techcommunity.microsoft.com

の非公式私家訳です。それとも誰か訳してるのかなあ。

The 機械翻訳をちょこちょこ手を入れた品質なので、まあそこのところは許してくだせえ。


過去1年間、MORSEチームはWindows Printチームと協力して、Windows Print Systemの近代化に取り組んできました。この新しいデザインは、Windows Printスタックに対する20年以上で最大の変更の1つです。目標は、互換性を最大化し、ユーザーを第一にする、より現代的で安全な印刷システムを構築することでした。私たちはこの新しいプラットフォームをWindows Protected Print Mode(WPP)と呼んでいます。ユーザーはSecure-by-Defaultであるべきだと考えています。これが、WPPが最終的にWindowsのデフォルトでオンになる理由です。

最近、Windowsでのサードパーティドライバのサービスを終了する計画を発表しました。ドライバから離れることで、印刷スタックを大幅に改善することができました。この記事では、ドライバレス印刷を採用する場合について説明し、互換性に関する洞察を提供し、Windows保護印刷モードによって提供されるセキュリティの改善をプレビューします。

この変更の背後にある最大の動機の1つはセキュリティです。Windowsの印刷システムは攻撃者の主要なターゲットでした。スプーラは高い特権で実行され、ネットワークからコードをロードする必要がありますが、これは低摩擦と高いセキュリティでは実現が困難です。Stuxnetと「印刷の悪夢」(Print Nightmare)では印刷バグが関与しており、MSRCに報告されたすべてのWindowsケースの9%を占めています。印刷スタックのセキュリティ保護は、主にサードパーティ製ドライバの使用が原因で困難です。WPPはすべてのサードパーティ製ドライバをブロックし、さまざまな新しいセキュリティ保護を実装しています。

これらの変更をある文脈に置くために、MORSEはWindows Printの過去のMSRCケースの分析を行い、これらの変更が役立つかどうかを評価しました。私たちが見つけたのは、Windows Protected Print Modeがこれらの脆弱性の半分以上を軽減したということです。

設定を変更すると不便に感じる人もいることはわかっていますが、全体的なユーザセキュリティにとってはそれが最善であると考えています。

ドライバー問題

印刷ドライバのセキュリティモデルは、共有責任アプローチに依存しており、Windows印刷スタックとサードパーティドライバはそれぞれ、脆弱性の導入を回避しながら、機能を提供し、セキュリティの約束を実施する役割を果たす必要があります。これはWindowsの他のサブシステムと同様ですが、印刷は特に困難なシナリオです。なぜなら、私たちとお客様の両方が、プロセスを可能な限り摩擦のないものにしたいと考えているからです。セキュリティ、利便性、および古いデバイスとの下位互換性のバランスをとることは困難です。ここにいくつかの例があります。

印刷の悪夢(Print Nightmare)

この脆弱性は、認証されたリモートユーザがRPCコールRpcAddPrinterDriverを使用して印刷ドライバをインストールし、リモートロケーションにあるドライバファイルを指定することを可能にする認証バイパスバグの結果でした。攻撃者が選択したファイルはDLLとしてロードされ、高度な特権を持つスプーラプロセスで実行され、攻撃者にSYSTEM特権を事実上付与しました。

この脆弱性の修正は、Point and Printと呼ばれる設計上の機能が存在するという事実によって複雑になりました。Point and Printでは、プリントサーバからクライアントへのドライバのインストールをスムーズに行うことができます。リモートサーバは、クライアント上の適切な構成(レジストリ設定)を前提として、クライアント上のadminプロンプトなしでドライバをインストールできます。修正が行われると、V3ドライバのユーザーは、多くの場合、大規模な環境で、プリンタを使用しようとしたときに突然Adminログインプロンプトが表示されるようになりました。V4ドライバのユーザーでは、この問題は発生しませんでした。V4モデルは、この脆弱性が発生した2021年の9年前の2012年に導入されましたが、ほとんどのプリンタは依然としてV3ドライバを使用していました。これは、ドライバベースのモデルのいくつかの課題を物語っています。

互換性

印刷ドライバの課題の1つは、その古さです。一部の印刷ドライバは数十年前のものであり、Control Flow Guard(CFG)、Control Flow Enforcement Technology(CET)、Arbitrary Code Guard(ACG)、およびMicrosoftが長年にわたって実装してきたその他の多くの保護など、最新のセキュリティ緩和策と互換性がありません。これらの保護は多くの場合、「オール・オア・ナッシング」です。つまり、保護を有効にするには、参加するすべてのバイナリが互換性を持つための手順を実行する必要があります。すべての印刷メーカーがこれらのドライバを更新するために必要な手順を実行しているわけではないため、印刷サービスは現在、これらの最新の不正利用緩和策の恩恵を受けていません。

過剰なアクセス許可

サードパーティからコードを読み込むには、セキュリティの観点からいくつかの課題があります。読み込むコードを確実に読み込む必要があるだけでなく、そのコードによってアプリケーションの動作が予期しない方法で変更される可能性があります。たとえば、ドライバは複雑な解析ロジックをサポートしているため、スプーラや関連する印刷プロセスを完全に制御できるバグが発生する可能性があります。多くのユーザーは、印刷ドライバが一般的な管理者アカウントよりも強力なSYSTEMとして実行されることを理解していません。そのため、ドライバのバグは攻撃者にとって非常に有用です。

ドライバに脆弱性が発見された場合、Microsoftサードパーティに依存してドライバを更新します。発行元が存在しなくなった場合、または古い製品がサポートされていないと考えられる場合、脆弱性に対処する明確な方法はありません。

IPPの基礎

インターネットプリンティングプロトコル(IPP)は、HTTPベースのプロトコルであり、HTTPに期待される多くの認証方法をサポートします。各IPP要求はHTTP POSTメッセージであり、プリンタはipps://printer.example.com/ipp/printなどのURIを使用して識別されます。IPPは、プリンタに期待されるすべての一般的な操作をサポートします。

ドライバレス印刷では、PWG RasterやPDFなどの公開標準に基づく限られた数のプリンタドキュメント言語(PDL)がサポートされています。これにより、オペレーティングシステムが変換のために処理する必要がある形式の固有の数が制限され、コードが大幅に簡素化されます。クライアント側のレンダリングは、プリンタに送信される最終的なドキュメントを生成するために使用されます。

LPR/LPDとは異なり、IPPは組み込みの暗号化をサポートしています。このサポートは、Web上でHTTPSを使用する場合に現在使用されている暗号化と同様です。アクセス制御と認証もプロトコルの一部です。セキュリティ上の利点を目的としたものではありませんが、IPPドライバレス仕様は少数のPDLをサポートしており、クライアントが必要とする複雑な解析の量を制限しています。現在、ドライバは40種類以上のPDLを実装しており、脆弱性が発生する可能性があります。

WindowsにおけるIPP印刷の今日の状況

Windows Print Teamは、以前からIPP印刷をより多くのユーザーに提供するために取り組んできました。現在、印刷ドキュメントを表示すると、通知が表示されます

この通知は、ユーザーが可能な場合はIPPに切り替えることを奨励し、業界パートナーがIPPベースの印刷に切り替えることを奨励することを目的としています。カスタム機能が必要な場合があり、ベンダーは印刷サポートアプリ(PSA)を作成することでサポートを拡張できます。現在のWindowsでのIPP印刷は、ドライバベースの印刷と並行して動作し、ユーザーはどちらの構成も選択できます。IPP印刷システムのいくつかのコンポーネントと、セキュリティの利点と欠点について説明します。

印刷サポートアプリ(PSA; Printer Support App)

PSAを使用すると、プリンタOEMおよびIHVは、既存のIPPサポートを拡張して特定のニーズに対応できます。すべてのプリンタが同じ機能と構成オプションをサポートしているわけではありません。PSAを使用すると、ユーザーが期待するエクスペリエンスを損なうことなく、カスタマイズされたユーザーエクスペリエンスを実現できます。

これらのアプリケーションは、Win32アプリケーションよりも制限されているUniversal Windows Application Platform(UWP)を利用します。ユーザーは、アプリケーションが使用できるアクセス許可をより詳細に制御でき、更新の管理はMicrosoftストアを通じて自動的に行われます。Windowsは、プリンタのハードウェアIDに基づいて、ユーザーに適切なPSAが存在する場合は、自動的にインストールします。

Point and Print

Point and Printは、ユーザーがドライバを提供せずにリモートプリンタに接続できるようにする機能であり、必要なすべてのドライバがクライアントにインストールされています。Point and PrintはIPPでも使用できますが、動作が異なります。ドライバをインストールする必要はなくなりましたが、プリンタを設定するには基本的な構成が必要です。このプロセスは、IPPでは次のように動作します。

  1. WindowsクライアントとサーバがRPCを介して接続する
  2. サーバとクライアントの両方が内蔵のMicrosoft IPPドライバを使用
  3. サーバーはIPPを使用してプリンタと通信する
  4. PSAがインストールされる(使用可能な場合)

セキュリティ

現在、WindowsでのIPPベースの印刷では、サードパーティのドライバが不要になり、印刷をサポートするためにインストールされたサードパーティのコードはAppContainer内で実行されるため、ユーザーのリスクが制限されます。暗号化はすべての通信でサポートされており、サポートされるPDLの数が限られているため、解析の複雑さは大幅に軽減されます。これは、ドライバの使用を必要とするモデルに比べて意味のある改善です。

ただし、現在でも、IPPベースの印刷はドライバベースの印刷と並行して実行されます。たとえば、Point and Printは、サーバーの要件に応じて、ドライバをインストールするか、現在の構成にIPPプリンタをインストールします。このアプローチは互換性のリスクを最小限に抑える一方で、セキュリティを向上させるために行うことができる変更を大幅に制限します。

現在、WindowsでのIPP印刷は、セキュリティの観点からすでに大きな前進となっており、ユーザーには可能な限り切り替えることをお勧めします。また、管理者には、このアクションを組織全体で優先することもお勧めします。

Windows保護印刷モード(Windows Protected Print Mode; WPP

WPPは、Mopria認定のプリンタのみがサポートされている既存のIPP印刷スタックに基づいて構築されており、サードパーティのドライバを読み込む機能を無効にします。これにより、Windowsの印刷セキュリティを大幅に向上させることができます。我々の目標は、最終的に最も安全な既定の構成を提供し、ユーザーがプリンタに互換性がないことを発見した場合にいつでも従来の(ドライバベースの)印刷に戻す柔軟性を提供することです。

ユーザーがWPPモードを有効にすると、通常のスプーラ操作は、WPPの改善を実装した新しいスプーラに委ねられます。これらの変更のいくつかを見てみましょう。

限定された/安全な印刷設定

WPPでは、多くの従来の構成が無効になりました。Windowsに対する一般的な攻撃では、プリンタポートがダイナミックリンクライブラリ(DLL)であるという事実が悪用され、攻撃者はこれを悪用して悪意のあるコードを読み込みます。また、攻撃者はシンボリックリンクを使用してスプーラを騙し、悪意のあるコードを読み込ませますが、これはもはや不可能です。IPPを使用する場合にのみ意味のある値に構成を制限するように更新された多くの従来のAPIがあります。これにより、攻撃者がスプーラを利用してシステム上のファイルを変更する機会が制限されます。

モジュールのブロック

モジュールの読み込みを可能にするアプリケーションプログラミングインターフェイスは、新しいモジュールが読み込まれないように変更されます。たとえば、AddPrintProviderWやその他の呼び出しを行うと、悪意のあるモジュールが読み込まれる可能性があります。また、IPPに必要なMicrosoft署名付きバイナリのみが読み込まれるように制限されます。

ユーザーごとのXPSレンダリング

XPSレンダリングは、WPPのSYSTEMの代わりにユーザーとして実行されます。現在、Windowsのほとんどの印刷ジョブにはXPS変換が含まれており、このタスク(PrintFilterPipelineSVC)を処理するプロセスが多くのメモリ破損の脆弱性の原因となっています。他の問題と同様に、このプロセスをユーザーとして実行することで、これらのバグの影響を最小限に抑えることができます。

共通スプーラタスクの低い権限

ドライバを削除すると、スプーラプロセスによって実行される一般的なタスクを実行し、それらをユーザーとして実行されているプロセスに移動することもできます。これらのプロセスにメモリ破損の脆弱性がある場合、その影響はユーザーだけが実行できるアクションに限定されます。

新しいスプーラワーカープロセスには、SeTcbPrivilege、SeAssignPrimaryTokenPrivilegeなどの多くの特権を削除する新しい制限付きトークンがあり、SYSTEM ILで実行されなくなりました。

今後削除する予定のSeImpersonatePrivilegeは保持されています。

バイナリ緩和

サードパーティのバイナリを削除することで、Microsoftが長年にわたって投資してきたバイナリ緩和策の多くを有効にできるようになりました。WPPのプロセスは、多くの新しいバイナリ緩和策で実行されます。以下にいくつかのハイライトを示します。

  • Control Flow Enforcement Technology(CFG、CET) -リターン指向プログラミング(ROP)ベースの攻撃を軽減するのに役立つハードウェアベースの軽減。
  • 子プロセスの作成を無効にする-子プロセスの作成はブロックされます。これにより、攻撃者がスプーラでコードを実行した場合に、新しいプロセスを生成できなくなります。
  • Redirection Guard-プリントスプーラを標的とすることが多い多くの一般的なパスリダイレクト攻撃を防止します。
  • Arbitrary Code Guard-プロセス内での動的なコード生成を防ぎます。

これらの保護により、脆弱性が発見された場合にそれを悪用することがより困難になります。

Point and Print

前述したように、Point and Printは通常、ドライバの読み込みとIPPプリンタの構成を許可します。一部のユーザーはIPPプリンタだけの環境を持っている場合がありますが、悪意のある攻撃者はプリンタのふりをしてユーザーをだましてドライバをインストールさせることができます。WPPは、Point and Printがサードパーティのドライバをインストールすることを防ぎ、このリスクを軽減します。

よりよいトランスポートのセキュリティ

プリンタはさまざまなトランスポートプロトコルを使用しており、トランスポート暗号化は常に使用されるわけではありません。多くの場合、トラフィックが暗号化されているかどうかはユーザーには不明であり、これを判断するのは困難です。IPPは、現在Webブラウザで使用されているような強力な暗号化をサポートしています。WPPは、トラフィックが暗号化されている場合にユーザーに明確にし、可能な場合は暗号化を有効にするようユーザーに促します。

Windows Secure by Designへの継続的な投資

ご覧のように、ドライバベースの印刷から離れることは、ユーザーに多くのメリットをもたらし、Microsoftは印刷システムに多くの意味のある改善を行うことができます。数十年前に確立された既存のドライバベースのシステムは、多くのサードパーティMicrosoftすべてがその役割を果たすことに依存しており、現代の脅威には遅すぎることが証明されています。

IP Pベースの印刷は十分にサポートされており、切り替えるユーザーは攻撃を受ける可能性を減らすことができます。Windows保護印刷モードに切り替えるユーザーは、攻撃者から安全であることをさらに保証します。WPPは現在Insiderビルドにあり、この機能を試してフィードバックを提供することで、テストにご協力いただければ幸いです。ユーザーは、ここに記載されている手順に従ってこの機能を有効にできます。

これは初期リリースです。多くの機能は不完全であり、フィードバックに基づいて変更される可能性があります。たとえば、今日ではUIがなく、多くのセキュリティ改善がまだ進行中です。時間の経過とともに、これらの改善は、WPPの改善に取り組むInsider Buildsに引き続き展開されます。

また、Windows Protected Print ModeはWindows Insider Preview Bounty Programの対象となり、セキュリティ研究者がバグを特定して報告することを奨励しています。