
UEFI shim loader
shim は、実行されると別のアプリケーションを開いて実行しようとする単純な EFI アプリケーションです。最初に標準の EFI LoadImage() および StartImage() 呼び出しを介してこれを試みます。これらの呼び出しが失敗した場合(たとえば、Secure Boot が有効で、バイナリが適切な鍵で署名されていない場合など)、組み込みの証明書に対してバイナリを検証します。これが成功し、バイナリまたは署名鍵が禁止されていない場合、shim はバイナリを再配置して実行します。
shim は、セカンドステージブートローダーが同様のバイナリ検証を実行できるようにするプロトコルもインストールします。このプロトコルは shim.h ヘッダーファイルに記述されている GUID を持ち、単一のエントリーポイントを提供します。64ビットシステムでは、このエントリーポイントは MSABI ではなく SysV ABI で呼び出されることを想定しているため、これへの呼び出しはラップしないでください。
バージョン 16.1 以降、shim はシステムテーブルをオーバーライドし、LoadImage()/StartImage()/UnloadImage()/Exit() 関数の独自バージョンをインストールします。これにより、セカンドステージはシステムテーブルからそれらを単純に呼び出すことができ、shim がファーストステージであるかどうかに関係なく、セカンドステージに shim 固有のコードを必要とせずに動作します。
このプロトコルがインストールされている場合、署名付き UKI Unified Kernel Images は、ネストされたカーネルが署名されていなくてもロードできます。UKI がロードおよび検証された後、shim は UKI に含まれるすべてのセクションの内部許可リスト(allowlist)を構築するためです。そのようなセクションの1つからイメージがロードされると、拒否リスト(denylist)(執筆時点では DBX/MOKX/SBAT)に対して検証されますが、許可リスト(allowlist)(DB/MOK ハッシュ/署名)に対してはチェックされません。外側のイメージはすでに検証されており、内側のイメージはそれらの署名またはハッシュによってカバーされているためです。さらに、二重測定を避けるため、内側のイメージは TPM で測定されません。
TPM チップが有効になっており、システムファームウェアがサポートしているシステムでは、shim はロード中のターゲットのダイジェストでさまざまな PCR を拡張します。完全なリストはファイル README.tpm にあります。
shim を使用するには、DER エンコードされた公開証明書を pub.cer などのファイルに配置し、make VENDOR_CERT_FILE=pub.cer でビルドするだけです。
いくつかのビルドオプションと、ビルドをカスタマイズするいくつかの方法が BUILDING に記載されています。
テスト計画 を参照し、何か失敗した場合はチケットを登録してください!
セキュリティインシデントまたは脆弱性に関連して開発者に連絡する必要がある場合は、[email protected] までメールしてください。