보안 MOR 구현
요약
- MorLock의 동작, 수정 버전 2
마지막으로 업데이트한 날짜
- 2020년 8월
적용 대상:
Windows 10
Windows 10의 Credential Guard 기능을 지원하려는 OEM 및 BIOS 공급업체.
공식 사양
추천 자료
개요
이 항목에서는 UEFI 변수, 수정 버전 2의 MemoryOverwriteRequestControlLock
동작 및 사용에 대해 설명합니다.
고급 메모리 공격을 방지하기 위해 기존 시스템 BIOS 보안 완화 MemoryOverwriteRequestControl 이 새로운 위협 방지를 위한 잠금을 지원하도록 개선되었습니다. 위협 모델은 호스트 OS 커널을 악의적으로 포함하도록 확장되므로 커널 권한 수준에서 실행되는 ACPI 및 UEFI 런타임 서비스는 신뢰할 수 없습니다. 보안 부팅 구현과 마찬가지로 MorLock은 호스트 OS 커널(예: 시스템 관리 모드, TrustZone, BMC 등)에 의해 변조될 수 없는 권한 있는 펌웨어 실행 컨텍스트에서 구현되어야 합니다. 인터페이스는 "Variable Services"라는 UEFI 사양 버전 2.5, 섹션 7.2에 설명된 UEFI 변수 서비스를 기반으로 합니다.
MorLock이라고 하는 이 완화는 모든 새 시스템에서 구현되어야 하며 신뢰할 수 있는 플랫폼 모듈이 있는 시스템으로 제한될 뿐만 아니라 구현되어야 합니다. 수정 버전 2는 특히 대형 메모리 시스템에서 부팅 성능 문제를 완화하기 위해 잠금 해제라는 새로운 기능을 추가합니다.
MOR 비트 상태를 설정하기 위한 ACPI _DSM 제어 방법(PC 클라이언트 작업 그룹 플랫폼 재설정 공격 완화 사양 버전 1.10(PDF 다운로드)의 섹션 6에 설명된 대로) 최신 BIOS 구현에서 이 _DSM 메서드를 제거하는 것이 좋습니다.
그러나 BIOS가 이 _DSM 메서드를 구현하는 경우 MorLock의 상태를 준수해야 합니다. 키가 있거나 없는 MorLock이 잠겨 있는 경우 이 _DSM 메서드는 MOR을 변경하지 못하고 "일반 실패"에 해당하는 값 1을 반환해야 합니다. MorLock 수정 버전 2의 잠금을 해제하기 위해 ACPI 메커니즘이 정의되지 않았습니다.
Windows 7 이후 Windows에서 이 _DSM 메서드를 직접 호출하지 않았으며 더 이상 사용되지 않는 것으로 간주합니다. 일부 BIOS 는 Windows가 ACPI _PTS 클린 종료의 MOR 자동 검색 구현으로 호출할 때 이 _DSM 메서드를 간접적으로 호출합니다(PC 클라이언트 작업 그룹 플랫폼 재설정 공격 완화 사양, 버전 1.10(PDF 다운로드)의 섹션 2.3에 설명된 대로).
이 ACPI _PTS MOR 자동 검색 구현은 보안이 부족하며 사용하지 않아야 합니다.
MemoryOverwriteRequestControlLock
향상된 완화를 포함하는 BIOS는 초기 부팅 중에 이 UEFI 변수를 만듭니다.
VendorGuid: {BB983CCF-151D-40E1-A07B-4A17BE168292}
이름: MemoryOverwriteRequestControlLock
특성: NV+BS+RT
데이터 매개 변수의 GetVariable 값: 0x0(잠금 해제됨), 0x1(키 없이 잠김), 0x2(키로 잠김)
데이터 매개 변수의 SetVariable 값: 0x0(잠금 해제됨); 0x1(잠겨 있음)
SetVariable을 사용하여 잠금
모든 부팅에서 BIOS는 BDS(부팅 디바이스 선택) 단계(DRIVER#, SYSPREP#, BOOT#, *RECOVERY*, ...) 전에 0x00(잠금 해제됨을 나타낸 것)의 단일 바이트 값으로 초기화 MemoryOverwriteRequestControlLock
됩니다. MemoryOverwriteRequestControl
및 MemoryOverwriteRequestControlLock
), BIOS는 변수의 삭제를 방지해야 하며 특성은 NV+BS+RT에 고정되어야 합니다.
Data에서 유효한 0이 아닌 값을 전달하여 SetVariable for MemoryOverwriteRequestControlLock
를 처음 호출하면 둘 다 MemoryOverwriteRequestControlLock
MemoryOverwriteRequestControl
에 대한 액세스 모드가 잠겨 있음을 나타내는 읽기 전용으로 변경됩니다.
수정 버전 1 구현은 1 바이트만 0x00 또는 0x01 허용합니다 MemoryOverwriteRequestControlLock
.
수정 버전 2는 공유 비밀 키를 나타내는 8 바이트 값을 추가로 허용합니다. SetVariable에 다른 값이 지정된 경우 상태 EFI_INVALID_PARAMETER 함께 호출이 실패합니다. 해당 키를 생성하려면 신뢰할 수 있는 플랫폼 모듈 또는 하드웨어 난수 생성기와 같은 고품질 엔트로피 소스를 사용합니다.
키를 설정한 후 호출자와 펌웨어는 모두 IA32/X64의 SMRAM 또는 보호된 스토리지가 있는 서비스 프로세서와 같이 기밀로 보호된 위치에 이 키의 복사본을 저장해야 합니다.
시스템 상태 가져오기
수정 버전 2에서 변수와 MemoryOverwriteRequestControl
변수가 잠겨 있는 경우 MemoryOverwriteRequestControlLock
상수 시간 알고리즘을 사용하여 등록된 키에 대해 SetVariable 호출(해당 변수의 경우)을 먼저 확인합니다. 두 키가 모두 있고 일치하는 경우 변수는 잠금 해제 상태로 다시 전환됩니다. 이 첫 번째 시도 후 또는 키가 등록되지 않은 경우 이 변수를 설정하려는 후속 시도는 무차별 암호 대입 공격을 방지하기 위해 EFI_ACCESS_DENIED 실패합니다. 이 경우 시스템 다시 부팅은 변수의 잠금을 해제하는 유일한 방법입니다.
운영 체제는 GetVariable을 호출하여 해당 상태와 존재 상태를 MemoryOverwriteRequestControlLock
검색합니다. 그러면 시스템에서 값을 0x1 설정 MemoryOverwriteRequestControlLock
하여 현재 값을 MemoryOverwriteRequestControl
잠글 수 있습니다. 또는 비밀 데이터가 메모리에서 안전하게 제거된 후 나중에 잠금 해제를 사용하도록 설정하는 키를 지정할 수 있습니다.
getVariable을 MemoryOverwriteRequestControlLock
호출하여 0x0, 0x1 또는 0x2 반환하여 잠금 해제됨, 키 없이 잠김 또는 키 상태로 잠겨 있음을 나타냅니다.
설정 MemoryOverwriteRequestControlLock
은 플래시에 커밋되지 않습니다(내부 잠금 상태만 변경). 변수를 가져오면 내부 상태가 반환되고 키를 노출하지 않습니다.
운영 체제의 사용 예:
if (gSecretsInMemory)
{
char data = 0x11;
SetVariable(MemoryOverwriteRequestControl, sizeof(data), &data);
}
// check presence
status = GetVariable(MemoryOverwriteRequestControlLock, &value);
if (SUCCESS(status))
{
// first attempt to lock and establish a key
// note both MOR and MorLock are locked if successful
GetRNG(8, keyPtr);
status = SetVariable(MemoryOverwriteRequestControlLock, 8, keyPtr);
if (status != EFI_SUCCESS)
{
// fallback to revision 1 behavior
char data = 0x01;
status = SetVariable(MemoryOverwriteRequestControlLock, 1, &data);
if (status != EFI_SUCCESS) { // log error, warn user }
}
}
else
{
// warn user about potentially unsafe system
}
// put secrets in memory
// … time passes …
// remove secrets from memory, flush caches
SetVariable(MemoryOverwriteRequestControlLock, 8, keyPtr);
MorLock 구현 흐름
이러한 순서도는 구현의 예상 동작을 보여 줍니다.
초기화
SetVariable 흐름
SetVariable에 대한 잠금 해제된 상태 흐름
SetVariable에 대한 잠긴 상태 흐름
GetVariable에 대한 흐름
참고 항목
SoC 플랫폼의 모든 Windows 버전에 적용되는 UEFI 요구 사항
PC 클라이언트 작업 그룹 플랫폼 재설정 공격 완화 사양, 버전 1.10(PDF 다운로드)
콜드 공격(및 기타 위협)으로부터 BitLocker 보호
EDKII에서 UEFI TPM2 지원을 통해 BIOS를 넘어 둘러보기