セキュア 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 を呼び出すと、MemoryOverwriteRequestControlLock と MemoryOverwriteRequestControl の両方のアクセス モードが読み取り専用に変更されます。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
}