はじめに

Windowsカーネルチームのコア優先順位は、オペレーティングシステム、アプリケーション、およびユーザーを安全に保つことです。多くのオペレーティングシステムのように、Windowsは大きなコードベース、ドライバの生態系、および複雑な依存関係のセットを持ちます。毎日、多くの悪意のある俳優が脆弱性を見つけようとします。これらの脆弱性を修正するために、マイクロソフトは歴史的にセキュリティ修正のグループをセキュリティパッチとして知られているものに組み合わせました。

Windows の更新

伝統的に、セキュリティパッチは、火曜日に知られている毎月の2番目の火曜日に展開されています。これらのパッチは、OS内のさまざまなセキュリティの脆弱性に対する修正として機能チームによって開発されています。これらのセキュリティパッチを提供することで、Windows OSをより安全にし、悪意のあるアクターが脆弱性を悪用する機会を排除することを目指しています。各パッチ内で、ユーザモード(アプリケーション)とカーネルモード(システム)バイナリの両方を更新することができ、通常これには再起動が必要です。

一部のシナリオでは、継続的または近くの可用性が必要です。たとえば、Azure Fleetに電力を供給するWindows Serverのインスタンスは高可用性を求められます。ただし、これらのオペレーティングシステムのインスタンスを安全にする必要があります。カーネルソフトリブートやVMの保存ホストアップデートの保存のようなテクノロジは、主要なOSリリースを変更しながらVMダウンタイムを最小限に抑えるためにすでに存在していますが、セキュリティパッチは十分に十分に適用されます。このテクニックでもダウンタイムに影響を与えます。

更新はなぜ再起動を必要とするのですか?

通常、システム全体からのバイナリは、パッチが適用されるとアクセスして変更されます。再起動がほとんど常に必須であるため、更新されなければならないバイナリが通常1つ以上のプロセスに積極的にマッピングされるため、そのコードが現在実行されている可能性があるためです。 win32k.sysまたはntdll.dllのような特定のカーネルお​​よびユーザーモードバイナリは、常にメモリにロードされ、Explorer.exeのような他のものは、アクティブなユーザーセッションがあるときにロードされます。これらのようなバイナリが更新の一部としてパッチされている場合は、パッチを正常にインストールするには再起動が必要です。更新プログラムがNTカーネルまたは追加のコアコンポーネントをターゲットにすると、コードが実行されている間にそれらのバイナリをアンロードできないため、常に再起動が必要です。伝統的に、パッチ全体を1つの修正が必要であっても、他のすべてのパッチは再起動を必要としなかったので、マシンはまだ再起動することができます。パッチが遅れるという現在のセキュリティ問題

セキュリティパッチは、マイクロソフトから解放されるとすぐにWindows OSに適用されることを意図しています。多くの場合、ユーザーとシステム管理者はインストールを完了すると頻繁に必要とされる再起動のため、パッチのインストールを遅らせます。このパッチ適用の遅れ、一見便利な一方で、実際にはセキュリティ問題です。Fireeye Mandiant Threat Intelligenceレポートには、2018年と2019年にパッチが解放された後に42%の脆弱性が発生したことがわかります。さらに、内部MSRCデータは、2020年には、パッチがすでに解放された後に公共の概念実証の脆弱性の約75%が悪用されたことを示しています。パッチが適用されたときにパッチが発行されたときの時間を制限または排除することによって、悪用された脆弱性の総数を減らすための実質的な機会があります。ホットパッチとは何ですか?

HotPatchingは、オペレーティングシステムが「オンザフライ」への能力です。ホットパッチプロセスは、コードを実行しているアプリケーション、ライブラリ、またはドライバには見えません。これは、ホットパッチエンジンがいくつかの制約を尊重しなければならないことを意味します。これは、この記事の後半で説明されます。ホットパッチは、再起動を必要とせずにOSがセキュリティパッチをインストールすることができ、マシンの可用性を犠牲にすることなくセキュリティの向上を確実にします。 Windowsカーネルの技術を利用することで、更新をユーザーに直接影響させることなく適用できます。サーバーシナリオでは、HotPatchingを使用すると、VMSを再起動する必要なしに管理者がゲストVMを更新でき、ダウンタイムを削減できます。 HotPatchingは、ユーザーに再起動が少ないセキュリティアップデートの未来を持たせることを目的とした最初のテクニックの1つです。ホットパッチは私達の顧客のための新機能です、それはAzureホストOSでしばらく使用されています。内部Azure管理者は、データを収集し、ホットチャット自体を改善するのに十分な長さで、Azureホストマシンに再起動のないセキュリティ更新プログラムを提供しています。 HotPachingは、再起動する必要なしにシステム上のバイナリを更新する戦闘テスト方法です。

ホットパッチアーキテクチャ

HotPatchは、NTカーネル、セキュアカーネル、NTDLLモジュールのさまざまな部分に実装されています。エンジンのアーキテクチャで覗く前に、システムがどのようにバイナリを動的にパッチすることができるかを説明する必要があります。

HotPatchingは機能レベルで機能します。つまり、関数は個別にパッチが適用され、個々のファイルまたはコンポーネントではありません。関数レベルのホットパッチは、ベースイメージに属する未パッチのない関数のすべての呼び出しをホットパッチイメージに属する適切な機能にリダイレクトすることによって機能します。 USERMODE実行可能ファイル(EXESおよびDLL)、システムドライバ、さらにはハイパーバイザーのセキュア・カーネルバイナリなど、このテクニックを使用して、多くの種類のバイナリをパッチできます。ホットパッチ画像は累積的であると見なされます。つまり、各ホットパッチ画像は、同じベースイメージをターゲットとする他のすべての以前のホットパッチ画像からの変更を含みます。複数のホットパッチ画像を同じベース画像に適用することができ、同様の方法でロールバックすることができる。最新バージョンのHotPatchは、図1に示すWOW64.Patchイメージで実行されている32ビットコードを含むX64アーキテクチャとARM64アーキテクチャの両方をサポートしています。特に、ホットパッチテーブル(画像ロード構成ディレクトリによってインデックスされている)は、予想されるエンジンバージョン、パッチテーブルのサイズ、パッチシーケンス番号、および互換性のある基本画像記述子の配列のようなパッチ画像を記述するすべての情報を含む。 。

図1.ホットパッチ画像フォーマット。

各パッチ画像は特定のベース画像用に設計されています。互換性のあるベースイメージは、チェックサムとタイムタイムスタンプを介して識別されます。ベースイメージに記述子の同じチェックサムとタイムタイムスタンプがない場合、パッチエンジンはパッチを適用することを拒否します。この場合、パッチは内部リストに追加され、正しいベースイメージが後でロードされている場合にのみ適用されます(この手順は「遅延アプリケーション」と呼ばれます。)パッチを適用するためのエンジンによって実行される操作は、ホットパッチ記述子の配列HotPatch Descriptorは、各レコードが指定されたパッチの種類(関数パッチ、グローバルシンボルパッチ、間接呼び出し、CFG呼び出しターゲットなど)をエンジンに指示します。それはヘッダーと1つ以上のHotPatchレコードで構成されています。各レコードは、ソース関数のRVAとターゲット関数のRVAなどのディスクリプタの型に依存するパッチのパラメータと、元のオプコードバイトを指定します。

Hotpatch Engine

HotPatchエンジンは、オペレーティングシステムのさまざまな部分で、ほとんどNTとSecureカーネルに実装されています。前の段落で導入されたエンジンは、ハイパーバイザー、セキュアカーネル、およびそのモジュール、NTカーネルドライバ、およびユーザーモードプロセスのさまざまな種類の画像をサポートしています。 HotPatchエンジンには、安全なカーネルが実行される必要があります。

画像にパッチを適用するには、NTカーネルはMiloadHotPatch内部関数で始まるいくつかのステップを取り、これはシステムアドレス空間内のパッチイメージを一時的にマッピングし、最初の分析を実行し、その目標を検索して検索して検索して検索することを実行します。 PEデータ構造(図1に示した)。パッチが設計されているターゲット画像のチェックサムとタイムスタンプが見つかった後、NTカーネルは、対応するベース画像がシステムにロードされているかどうかを判断します(ベースイメージはハイパーバイザーまたはセキュアのような安全な画像にすることもできます。カーネルであるので、このステップもセキュアカーネルを呼び出す必要があります。互換性のある画像が検出されたとき、NTカーネルは、ベースイメージの種類によって少し異なる手順を使用してターゲットベースイメージにパッチを適用し始めます。 (ユーザーモードライブラリまたはプロセス、カーネルドライバ、または安全なイメージ)。一般に、HotPatch Engineは、(図2に示すように)基本画像と同じアドレス空間にパッチイメージをマッピングします。ユーザーモードパッチの場合、パッチイメージはベースイメージがロードされている各プロセスにマッピングされます。

HotPatch Engineはセッションドライバもサポートしています。セッションドライバは、ユーザログオンセッションに関連付けられているカーネルモードアドレス空間に存在するドライバである(セッションアドレススペースは1つの特定のルートページテーブルエントリによって生成され、メモリマネージャによる要求に応じてオンデマンドに接続されます。アクティブセッションで)。つまり、特定のセッションでは、別のセッションに存在しないドライバがマッピングされることができることを意味します。 HotPatch Engineは、NTカーネル初期化のフェーズ1で作成された「ホットパッチ」プロセスのおかげで、システム内のすべてのセッションに接続することができます。この最小限のプロセスは、どのセッションにも属していないという特徴を持っています。このように、ホットパッチエンジンは、システム内の任意のセッションに一時的に添付され、ドライバが現在ロードされているセッションにのみパッチアプリケーションを実行することができます.Windows上のホットパッチでサポートされているさまざまなアドレススペース。

HotPatchイメージがマッピングされると、カーネル内のパッチエンジンは、HotPatchレコードによって説明されているようにバックワードパッチアプリケーションを実行することによってパッチを適用し始めます。

パッチをパッチして、パッチ画像内のパッチを与えられた機能のいずれかのCalleesをパッチして、ベースイメージの対応する機能にジャンプします。その理由は、すべての非パッチコードが元の基本画像から実行されるようにすることです。例えば、元の基本画像およびパッチ画像パッチに関数Bを関数bと呼び出すが機能bに関数Bを呼び出すと、パッチエンジンはパッチ画像内の関数Bを更新して元の基本画像内の関数bにジャンプする。

適切な基本画像内の対応するグローバル変数を指すために、HotPatch関数でグローバル変数への必要な参照をパッチします。

適切なインポートアドレステーブル(IAT)は、元のベースイメージから対応するIATエントリをコピーすることによってホットパッチイメージ内の参照を、次に元のベースイメージに必要な機能をパッチして対応する機能にジャンプすることで、フォワードパッチアプリケーションを実行します。パッチ画像。元のベースイメージ内の任意の関数に対してこれが行われると、その関数のすべての新しい呼び出しはホットパッチイメージから新しいパッチ付き機能コードを実行します。 HotPatchされた関数が戻ると、元の関数の呼び出し元に戻ります。

説明された手順は、カーネルドライバの場合、セキュアカーネルによって実行されているが、非常に単純化されている。ホットパッチプロセスに適切な同期が必要です。パッチアプリケーションを経て、プロセッサーは元の命令を実行できるはずです。安全なカーネルはハイパーガードと対話することができることに注意してください。これにより、保護されたPatchGuardイメージを正しくパッチすることができます。

ホットパッチアドレステーブル(HPAT)

関数にパッチを適用するとき、HotPatch Engineは、コードの実行をベースからパッチ内容に転送するために必要なトランポリンを保存できるようにする必要があります。 Trampolineはさまざまな理由で古い未パッチの機能に保存できません。現在実行されているコードが無効な指示を起こす可能性があり、古い関数のコードに十分なスペースが存在するという保証もありません。さらに、パッチエンジンはパッチのアプリケーションと戻り値(元に戻す)の両方をサポートしているため、元の置き換えられたバイトをどこかに保存する必要があることを意味します。ターゲット関数への実行を転送するためのTrampolineコードは、ホットポッチアドレステーブルコードページ(HPATと略される)に配置されます。システムが最初に起動すると、Windows LoaderはHPAT領域のサイズを決定します。これはデータの組み合わせで構成されています。コードページ(retpolineがx64で有効になっているARM64とシナリオをサポートするため)。 HotPatchが有効になっている場合、各ブートドライバはPEイメージの最後にあるHPATページを予約してメモリにロードされます(RetPolineコードページの前に、Windows上のRetPolineに関する情報があります.WindowsのRetPoline 2の軽減 – マイクロソフトTech Community)。 「予約済み」という用語は、実際の物理メモリが消費されていないことを意味することに注意してください。これはユーザーモードバイナリの場合と同様に処理されます。

パッチがベース画像に適用されると、ベースとパッチ画像の両方のHPATページは有効な物理ページにマッピングされます。機能が初めてパッチされると、Patch EngineはそれのHPATエントリを割り当て、コードとデータスロットをトランポリンコードとターゲットアドレスに埋めます。関数の後続のパッチはターゲットアドレスを更新します。元の関数のコードのプロローグには単一の命令のみが置き換えられます。上書きされたオペコードは、パッチが元に戻された場合に置き換えられるべきUNDOテーブルに保存されます。図3はこのプロセスを要約しています。図3.ホットパッチ関数のコードフロー。

Windows Server 2022 – 新しいホットパッチ機能

今後のWindows Server 2022リリースには、より広い変更セットに適用可能なホットパッチを作成する以下の改善が含まれています。

パッチ画像は、他のバイナリから新しい機能をインポートできるようになりました。

Hotpatch Engineは現在ARM64をサポートするようになりました。

パッチエンジンは、「__patchmainCallout__」機能を介してパッチイメージにエクスポートされたパッチコールバックをサポートするようになりました。コールバックを使用すると、パッチアプリケーション(前述の)が完了したパッチアプリケーションの一方または両方のフェーズが完了した後、パッチイメージが初期化ステップ(メモリを割り当て、新しいグローバルなどを初期化するなど)を実行できます。

HotpatchはRetpolineと互換性があります。新しいRetPolineディスパッチ関数(内部で \”__guard_retpoline_jump_hpat\”)がHPATコードエントリから呼び出され、Specter V2側チャネル攻撃に対して脆弱なことなく、コードの実行をターゲットパッチ関数に安全に転送できます。

結論

HotPatchは、セキュリティパッチを適用するとき、またはOSに小さな機能を追加するときに停止時間を排除するために、Azure FleetとWindows Server Azure Editionによって使用される強力な機能です。パッチが適用されている関数の制限は、(関数署名など)存在しますが、それらのほとんどはエンジンの新しいバージョンでアドレス指定されています。 HotPatch機能へのアクセスを取得できますか?

Hotpatchベースのセキュリティ更新プログラムは、Auzure Auzure Framework内のAzure Cloud内のWindows Server 2019およびWindows Server 2022 Azure Editionイメージを実行しているお客様が利用できます。このページに記載されています。私たちは、Hotpatchベースのセキュリティアップデートを幅広いWindowsの顧客にもたらすことに取り組んでいます。

Andrea Allievi&Hotpatchチーム。

出典: https://techcommunity.microsoft.com/..S/BA-P/2959541

By admin

Leave a Reply

Your email address will not be published.