MS UEFI関連証明書確認コマンド

仕組みはわかっとるしスクリプト流したいんじゃなくてシンプルに現状の確認をするワンライナーだけコピペしたいんじゃ、Windowsですませたいんじゃ。というときのコマンド集

管理者PowerShellにて動作させる。情報量多いときはCUIのウィンドウの横幅は思いっきり広げて文字を小さめ(ctrl+ホイール)にして。

現状確認

上のコマンドでレジストリを確認してこの説明にあるように UEFICA2023Status が Updated であればDBやKEKの追加およびブートマネージャの更新が完了していて、UEFICA2023Error が 空か0 であればエラーなし、WindowsUEFICA2023Capable が2であればすでに2023で署名されたboot managerで起動しているのだそうです。自動でこの状態になっていないから手動で更新する方法は後述

DBやKEKに新しい証明書(2023)があるか雑に確認したい

とはいえ本当かどうか確認します。それぞれTrueならば存在している。無い場合は早めに対応。精確に見たい場合は後述。secure bootが無効になっている場合はGet-SecureBootUEFIがこける。

雑ではなくてちゃんと証明書として扱って調べたい

任意のCNの証明書を作成するのはまともな署名なしでよければ誰でもできるので、まじめにやるならば雑に文字列をぶっこ抜くのではなくて各証明書などの確かな情報のfingerprintで特定します。

DBXに登録される可能性のあるTBSハッシュの算出がワンライナーにするには長すぎるので、以降あらかじめ一度だけこれ全体をタイトル行のコピーボタンでコピペして実行しておきます。

ブートマネージャ(.efi)が2023証明書で署名されているかを確認すべくNotAfter,fingerprint,Subjectを表示する

そして本当にブートマネージャーが2023証明書で署名されているのかを確認します。ブートマネージャ(EFI)があるパーティション(ESP)は

と実行して表示されるdevice partition=\Device以降が使えます。

上の例だとブートマネージャーは
“\\?\HarddiskVolume1\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI”
で扱えます。

あるいは「ディスクの管理(diskmgmt.msc)」のボリューム列などでESPのディスク番号とパーティション番号を調べて、ディスク番号0でパーティション番号1であればブートマネージャーは
“\\?\Harddisk0Partition1\EFI\Microsoft\Boot\bootmgfw.efi”
で扱えます。Windowsのブートマネージャ以外はフォルダ、ファイル名を変えます。
bcdedit /enum all
とすれば登録されているものが登場します。

まだであれば一度Get-CertFingerprints関数などをコピペで実行して登録しておき、続いて以下の$f=に対象をセットして実行します。見づらい場合はSelect-Objectの対象の順番を変えたり減らしたりするか、文字を小さくしたのちにウィンドウを大きくして実行します。

実行例

この例ではそろそろ署名ができなくなる証明書で.efi本体が署名されていることがわかり、その証明書がCN=Windows UEFI CA 2023でfingerprintもMS Secure Boot Objectsから算出したものと同じ証明書で署名されているので確かに更新済であることがわかります。ついでにブートローダー。こちらは今はブートマネージャーが許してくれるPCA 2011証明書での署名です。

このissueの説明のおかげembedded署名を取得してます。単に Get-AuthenticodeSignature するとカタログ署名がとれてしまうのだそうな。

DBやKEKに問題のPCA 2011証明書、ほかの2011証明書があるか雑に確認したい

それぞれTrueならば存在している。DBやKEKであればあったからどうということもなく。無ければ無いで2023証明書が存在していてブートマネージャーの起動以降は2011証明書を許してあげちゃうのでやはりどうということもなく。精確に見たい場合は後述

2011証明書が自動的にDBXに登録されるようになるのはいつか

MSのKB5025885(CVE-2023-24932 BlackLotus)のEmforcement Phaseのとこに6か月前には記載されるそうです。手動でPCA 2011をDBXに登録する方法は同じくKB5025885(CVE-2023-24932 BlackLotus)のMitigation deployment guidelinesに記載があります。DBXに登録されてもブートマネージャーは2023証明書で署名されているので実行され、実行されたブートマネージャーはPCA 2011も許してあげるのでブートローダー以降はPCA 2011でもOKという苦しいワークアラウンドで起動するそうです。なので例えばバックアップの中にあるPCA 2011証明書で署名されたブートマネージャーは起動しなくなりますが、ブートローダーやデバイスドライバはとりあえず動作します。あとSVNという概念が増えてます。

規格ではDBXは証明書のハッシュでも登録できるので、細かいこと言うとDBXはCNの文字列での存在チェックでは不十分です。前出の手順では証明書本体が登録されるようなので一応雑に確認できるようです。

ブートマネージャ(.efi)のPE Image Hashを計算したい

Windows Authenticode Portable Executable Signature Format 直docxのp.15を見てやり始めるものの車輪の再開発に無限の時間がかかりそうなので日和ります。ググるとSysinternalsのSigcheckを使うのが早そうなのでWinGetでインストールしてしまいます。

使ってみます。前述のようにHarddisk0やPartition1の数字はよきに変更。

実行例(DBXに証明書ではなく.efiで登録される場合はPE256の値で登録される/されているはず)

UEFI変数(DB, KEK, PK, DBX)をファイルにして真面目に調べたい

.eslを項目ごとにばらかしたい

NSAの esl-parser.ps1 をどこぞにおいて

などとすると db-0.cer, db-1.cer, db-2.cer, db-3.cer, db-4.cer, db-5.cer….. や dbx-0.hsh, dbx-2.hsh, dbx-3.hsh, dbx-4.hsh, dbx-5.hsh….. が出来上がります。

ただし esl-parser.ps1は EFI_SIGNATURE_DATA をあわせて見るとわかるように、161(0xa1) で EFI_CERT_X509_GUID { 0xa5c059a1, 0x94e4, 0x4aa7, { 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72 } } そして 38(0x26)で EFI_CERT_SHA256_GUID { 0xc1c41626, 0x504c, 0x4092, { 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 } } をひっかけているだけである一方、 仕様側は EFI_CERT_SHA512_GUID などのPE Imageハッシュや証明書TBSハッシュの別アルゴリズムなどのタイプも存在しているので、実在しているかは知りませんがDBXに存在しているかどうかのチェックは特に esl-parser.ps1 でエラーが表示された場合はタイプに合わせていろいろ改造する必要があります

証明書ファイルのNotAfterとfingerprintとCNをみたい

まだであれば一度Get-CertFingerprints関数などをコピペで実行して登録しておき

実行例

同様にMS Secure Boot Objectsにある証明書ファイルのfingerprintを表示させたい

実行例(fingerprintはこのページのような情報をそのままうのみにすることなく、自力で公式サイトの一次情報から算出する)

さらに証明書チェーンでNotAfterとfingerprintとCNをみたい

実行例

.hsh(SHA-256 fingerprint)を人が読めるようにしたい

実行例(DBXなのでblock listの表示) タイプがわかるように esl-parser.ps1 を改造してもよいかも。

新しい証明書(2023)をDBやKEKに追加するタスクを実行

管理者PowerShellにて動作させる。secure bootが有効じゃないとエラーが起きて先に進まない。
イベントID一覧:UEFICA2023ErrorEvent 状態遷移:セキュア ブート証明書の展開のサポート

例えば以下のようにエラーやステータスを確認して必要に応じて再起動する。イベントID: 1800は要再起動の意味。

AvailableUpdatesが0x4100の時は再起動して以下のように再度タスクだけ実行すると先に進みます。

UEFICA2023Status が Updated で UEFICA2023Error が 空か0 になれば完了。

記念に今ESPにある.efiのPE256を出力させてみます。前述のようにHarddisk0やPartition1の数字はよきに変更。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です