セキュア MOR の実装

MemoryOverwriteRequestControlLock 変数の動作と使用方法を説明します。

高度なメモリ攻撃を防ぐために、既にあるシステム BIOS のセキュリティ対策である MemoryOverwriteRequestControl の機能が強化され、ロックをサポートして新しい脅威に対抗するようなりました。

強化された対策を含む BIOS は初期ブート時にこの UEFI 変数を作成します。

VendorGuid: {BB983CCF-151D-40E1-A07B-4A17BE168292}

名前: MemoryOverwriteRequestControlLock

属性: NV+BS+RT

サイズ: 0x1 バイト

BIOS は MemoryOverwriteRequestControlLock を BDS (BOOT#### 処理) の前に 0x00 という値に初期化します。OS ローダーが 0x01 を指定して SetVariable を呼び出すと、MemoryOverwriteRequestControlLockMemoryOverwriteRequestControl の両方のアクセス モードが読み取り専用に変更されます。SetVariable の呼び出しでその他の値が指定されている場合、呼び出しは失敗し、EFI_INVALID_PARAMETER エラー コードが返されます。

オペレーティング システムは MemoryOverwriteRequestControlLock の存在を検出します。システムは、この例で示すように MemoryOverwriteRequestControlLock の値を 0x1 に設定することで、MemoryOverwriteRequestControl の現在の値をロックできます。

if (gSecretsInMemory) 
{
    SetVariable(MemoryOverwriteRequestControl, 0x11);
}
 
// check presence
status = GetVariable(MemoryOverwriteRequestControlLock, &value);  

if (SUCCESS(status)) 
{
    // if present, set to 0x01 to lock MOR to the current value, 
    // note that MemoryOverwriteRequestControlLock is also locked at this time

    SetVariable(MemoryOverwriteRequestControlLock, 0x01); 
} 
else 
{
    // warn user about potentially unsafe system
}

SoC プラットフォームのすべての Windows エディションに適用される UEFI 要件