
CVE-2021-26943のレポートとエクスプロイト、ASUS UX360CA BIOSバージョン303におけるカーネルからSMMへのローカル権限昇格の脆弱性。
これは、ASUS UX360CA BIOSバージョン303におけるカーネルからSMMへのローカル権限昇格の脆弱性であるCVE-2021-26943に関するレポートとエクスプロイトです。この問題はバージョン304で修正されました。
UX360CA BIOSバージョン303には、ring0権限を持つ攻撃者がSMRAMを含むほぼ任意の物理メモリを上書きし、SMM内で任意のコードを実行できるようにする3つの脆弱なモジュールがあります。
これらのモジュールは以下のように識別できます:
| 名前 | GUID | SHA256 |
|---|---|---|
| UsbRt | 04EAAAA1-29A1-11D7-8838-00500473D4EB | 8A3DEAFD0A688DD4360A65C98E434180152EB43EB2C913C663F13D5709776781 |
| SdioSmm | EA343100-1A37-4239-A3CB-B92240B935CF | 4578E1E147D846BB925DF881A2A0A3C3F1E6CD2AE033A8B0F769E5EB42783A0A |
| NvmeSmm | E5E2C9D9-5BF5-497E-8860-94F81A09ADE0 | A9C762B13FC9C4156603D674C6DAEBC4369520D95ACB1D0FA976078D6F7F1003 |
これらのモジュールはAMI(BIOSベンダー)製であり、他のOEMのBIOSにも存在する可能性があります。
脆弱なモジュールと対応するSMIは、UsbRt(0x31)、SdioSmm(0x40)、NvmeSmm(0x42)です。これらのSMIハンドラはすべて、物理メモリアドレス0x40Eを読み取って処理対象のアドレスを取得し、エラー時にはそのアドレスがSMRAMであっても1バイト書き込みます。
たとえば、SdioSmmのSMIハンドラは次のようになります:
EFI_STATUS
EFIAPI
SdioSmm_SwSmi_40h(
EFI_HANDLE DispatchHandle,
CONST VOID *Context,
VOID *CommBuffer,
UINTN *CommBufferSize
)
{
// ...
struct_v0 *userControlled = *(0x10 * MEMORY[0x40E] + 0x104);
if ( EFI_ERROR(ValidateBufferIsOutsideSmram(userControlled, sizeof(struct_v0)))
|| userControlled->Offset0_FunctionCode >= 4 )
{
userControlled->Offset2 = 7;
}
else
{
// ...
}
return EFI_SUCCESS;
}
この問題は、Aptiocalypsisとして詳しく説明されているINTEL-SA-00057と同一であると思われます。ただし、UX360CA用のBIOSバージョン303にはこれらの修正は含まれていません。
これにより、物理メモリへの書き込みアクセスとOUT命令を持つ攻撃者(つまりring0権限)は、以下の手順でSMRAMの内容を上書きできます:
これは、以下のようにしてSMMでの任意コード実行を達成するために使用できます:
HKLM\HARDWARE\RESOURCEMAP\System Resources\Loader Reserved の .Raw 値の内容からUEFIランタイムコードの物理アドレス範囲を取得するSMMでの任意コード実行により、攻撃者は別のSMM脆弱性レポートで実証されているように、HVCIなどのカーネルやハイパーバイザーによるセキュリティ対策を回避し、SPIフラッシュ(BIOS)の内容を更新して永続性を確立できます。
添付のデモプロジェクトは、エクスプロイトの成功を実証し、SMMでのみアクセス可能なMSRの内容とEPTPの物理アドレスをダンプします。また、Hyper-VハイパーバイザーのCPUID VM-Exit処理コードを変更して、改変されたハイパーバイザーベンダー文字列を返すようにします。
PoCは、HVCIを有効にした場合と有効にしない場合の両方で、Windowsビルド18362.1256上でテストされています。
エクスプロイト成功の録画はYouTubeでご覧いただけます。

ターゲットシステムでは、
> bcdedit /set testsigning on
> sc create demo type= kernel binPath= C:\users\user\desktop\demo.sys
> sc start demo
[+] ReportSmramRange: TSEG implied SMRAM: 0x88400000 - 0x88800000
[-] ReportSmramRange: Exception occurred while accessing SMRR MSR : c0000096
[+] FindSystemManagementServiceTable: SMM core found at 0x87f1b390 in RT Code
[+] FindSystemManagementServiceTable: SMST found at 0x887fa710 in SMRAM
[+] ExploitSmm: Patched SMST->SmmLocateProtocol in SMRAM
[+] ExploitSmm: Placed SMM shell code
[+] ExploitSmm: Triggered SMM exploit
[+] DumpSmmExploitOuput: IA32_SMBASE = 0x887cd000
[+] DumpSmmExploitOuput: MSR_SMM_FEATURE_CONTROL = 0x1
[+] DumpSmmExploitOuput: MSR_SMM_MCA_CAP = 0xc00000000000000
[+] DumpSmmExploitOuput: EPT pointer = 0x10a72001e
[+] DumpSmmExploitOuput: Patched Hv address = 0x1004382f0
[+] ExploitSmm: Successfully executed shell code in SMM. Failing DriverEntry to unload itself
DriverEntry failed 0xc0000120 for driver \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\demo
修正は、以下に示すように、ユーザー制御の内容がSMRAM内を指す場合にそれをまったく使用しないことです。
{
// ...
struct_v0 *userControlled = *(0x10 * MEMORY[0x40E] + 0x104);
if (!EFI_ERROR(ValidateBufferIsOutsideSmram(userControlled, sizeof(struct_v0))))
{
if (userControlled->Offset0_FunctionCode < 7 )
{
// ...
}
else
{
userControlled->Offset2 = 7;
}
}
return EFI_SUCCESS;
}
この修正は、現在の業界のベストプラクティスに完全に従っており、SMRAMの破損につながるconfused deputy攻撃を防ぎます。
ただし、この修正はハイパーバイザーのメモリ領域を考慮していないことに注意してください。ハイパーバイザーがロードされている、または使用されている物理メモリアドレスを知っている攻撃者は、SMIにハイパーバイザーのコードやデータの上書きを要求して、ハイパーバイザーを破損させることが依然として可能です。
これは広く見られる、長年にわたって存在する、設計レベルにまで及ぶ問題です。
報告された問題は解決されましたが、多層防御戦略の実行という点ではいくつかの問題がありました。
たとえば、SMMページテーブルはフルの読み取り・書き込み・実行権限を持つアイデンティティマッピングであり、SMM_Code_Chk_En機能は利用できませんでした。これらにより、エクスプロイトは自明なものになりました。また、EDK2にあるように、SMM通信バッファがSmmIsBufferOutsideSmmValid()で検証されていないことにも気付きましたが、悪用可能なSMIは見つかりませんでした。
これらは、OEMや多くのBIOSバージョンに共通する問題であると私は考えています。どのOEMの古いモデルを使用している場合でも、そのBIOSは最新のBIOSバージョンであっても、あなたが望むほど安全である可能性は低いということを指摘しておきます。
これらの問題はそう遠くないうちに解決されることはないでしょうが、業界がSMMの特権を削減することによるアーキテクチャレベルの解決に取り組んでいるのを見るのは嬉しいことです。以下は、確認できる取り組みや記事の一部です:
主なハイライトは以下のとおりです。
最後に、コミュニケーションのループを緊密かつ透過的に保ってくれたASUSチームに心から感謝します❤ 全体的なプロセスは速くはありませんでしたが、フラストレーションを感じることはありませんでした。
Hv Tampered! を返す
> CheckHvVendor.exe
Executing CPUID(0x40000000) on CPU 0
Result: Hv Tampered!
Executing CPUID(0x40000000) on CPU 1
Result: Hv Tampered!
Executing CPUID(0x40000000) on CPU 2
Result: Hv Tampered!
Executing CPUID(0x40000000) on CPU 3
Result: Hv Tampered!