2025/11/22 22:03 Windows ARM64 Internals: Deconstructing Pointer Authentication

やっほー、ロボ子!今日のニュースはWindowsのPAC(Pointer Authentication Code)の実装とセキュリティ対策についてじゃ。

PACですか、博士。ARMアーキテクチャのメモリ保護機能のことですね。ポインタの整合性を検証する技術と理解しています。

そうそう!まさにそれじゃ。ポインタに暗号署名を付与して、不正なアクセスを防ぐんだぞ。64ビットプロセッサだと、未使用のビットに署名を格納するらしい。

なるほど。Windowsでは、どのようにPACを有効にしているんですか?

`ntoskrnl.exe`のエントリポイント`KiSystemStartup`でPACのサポートを判断して初期化するみたいじゃな。Windowsブートローダーから渡される情報で、PACのサポート状況や初期署名鍵を取得するらしいぞ。

ふむふむ。WinDbgで署名鍵の値を確認できるんですね。`rdmsr`コマンドを使うと。

その通り!そして、Windows 11 24H2や25H2プレビュービルドでは、フィーチャーフラグで制御されているみたいじゃ。レジストリキーでもオーバーライドできるらしい。

`SystemPointerAuthInformation`クラスでPACのサポート状況を照会できるのも便利ですね。

じゃろ?ユーザーモードプロセスごとにPACを有効化できるのもポイントじゃ。カーネルモードはグローバル署名鍵を共有するみたいじゃけど。

プロセス作成時に`EPROCESS->Flags3.SystemProcess`が設定されていない場合、PACが自動的に有効になるんですね。

そう!でも、ユーザーモードプロセスではPACを無効化できないらしいぞ。ちょっと面白い仕様じゃな。

エクスプロイト緩和策としてのPACは、具体的にどのように機能するんですか?

Windowsはリターンアドレスの署名と認証にPACを使っているんじゃ。コンパイラフラグでリターンアドレスの署名を有効/無効にできるみたいじゃな。

`pacibsp`や`autibsp`命令で署名と検証を行うんですね。リターンアドレスが不正な値で破損した場合、エラーが発生してアプリケーションがクラッシュすると。

その通り!カーネルモードだと`KERNEL_SECURITY_CHECK_FAILURE`が発生するぞ。恐ろしいの。

セキュアカーネルとPACの関係についても教えてください。

カーネルのPAC署名鍵はHVCIによって保護されていて、セキュアカーネルのHyperGuardが不正な変更を監視しているんじゃ。ハイパーバイザーがPAC署名鍵レジスタを管理する仕組みじゃな。

なるほど。HyperGuardはARM64固有の拡張機能を使用して、PACキーシステムレジスタへの変更をインターセプトするんですね。

そういうこと!まとめると、ARMベースのWindowsはPACのおかげで、ユーザーモードとカーネルモードの両方でセキュリティが強化されているってわけじゃ。

将来的にはMTE(Memory Tagging Extension)と組み合わせることで、さらにセキュリティが向上する可能性があるんですね。

そうじゃ!メモリ破損エクスプロイトのコストを大幅に上げられるらしいぞ。ところでロボ子、PACって何の略か知ってるか?

Pointer Authentication Code、ですよね?

ぶっぶー! 正解は「ぱっくんちょ、あーん、ちょーだい」の略じゃ!

博士、それは違います!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。