IUM(격리된 사용자 모드) 프로세스

Windows 10 VSM(가상 보안 모드)이라는 새로운 보안 기능을 도입했습니다. VSM은 Hyper-V 하이퍼바이저 및 SLAT(두 번째 수준 주소 변환)를 활용하여 VTL(가상 신뢰 수준)이라는 모드 집합을 만듭니다. 이 새로운 소프트웨어 아키텍처는 한 VTL에서 실행되는 프로세스가 다른 VTL의 메모리에 액세스하지 못하도록 하는 보안 경계를 만듭니다. 이 격리의 이점에는 암호 해시 및 Kerberos 키와 같은 자산을 보호하면서 커널 악용으로부터의 추가 완화가 포함됩니다.

다이어그램 1은 각각 CPU 링 0 및 링 3에서 실행되는 커널 모드 및 사용자 모드 코드의 기존 모델을 보여 줍니다. 이 새 모델에서 기존 모델에서 실행되는 코드는 VTL0에서 실행되며 더 높은 권한의 VTL1에 액세스할 수 없습니다. 여기서 보안 커널 및 격리된 사용자 모드(IUM)는 코드를 실행합니다. VTL은 계층 구조이므로 VTL1에서 실행되는 모든 코드는 VTL0에서 실행되는 코드보다 더 권한이 있습니다.

VTL 격리는 부팅 시 SLAT(두 번째 수준 주소 변환)를 사용하여 메모리를 할당하는 Hyper-V 하이퍼바이저에 의해 만들어집니다. 시스템이 실행될 때 이를 동적으로 계속하여 보안 커널이 비밀을 포함하는 데 사용되므로 VTL0으로부터 보호가 필요하다고 지정하는 메모리를 보호합니다. 두 VTL에 대해 별도의 메모리 블록이 할당되면 적절한 액세스 권한이 있는 VTL1 및 VTL0에 전용 메모리 블록을 할당하여 VTL1에 대한 보안 런타임 환경이 만들어집니다.

다이어그램 1 - IUM 아키텍처

다이어그램 1 - ium 아키텍처

Trustlet

트러스트렛(신뢰할 수 있는 프로세스, 보안 프로세스 또는 IUM 프로세스라고도 함)은 VSM에서 IUM 프로세스로 실행되는 프로그램입니다. VTL0 링 0에서 실행되는 Windows 커널로 마샬링하여 시스템 호출을 완료합니다. VSM은 VTL1에서 실행되는 작은 보안 커널을 포함하는 작은 실행 환경을 만듭니다(커널과 VTL0에서 실행되는 드라이버에서 격리됨). 명확한 보안 이점은 VTL0 커널에서 실행되는 드라이버에서 VTL1의 trustlet 사용자 모드 페이지를 격리하는 것입니다. VTL0의 커널 모드가 맬웨어에 의해 손상되더라도 IUM 프로세스 페이지에 액세스할 수 없습니다.

VSM을 사용하도록 설정하면 LSASS(로컬 보안 기관) 환경이 트러스트렛으로 실행됩니다. LSASS는 암호 해시 및 Kerberos 키와 같은 중요한 보안 데이터를 처리하는 동안 로컬 시스템 정책, 사용자 인증 및 감사를 관리합니다. VSM의 보안 이점을 활용하기 위해 LSAISO.exe(LSA 격리)라는 트러스트렛은 VTL1에서 실행되며 RPC 채널을 통해 VTL0에서 실행되는 LSASS.exe 통신합니다. LSAISO 비밀은 VSM 표준 모드에서 실행되는 LSASS로 보내기 전에 암호화되며 LSAISO 페이지는 VTL0에서 실행되는 악성 코드로부터 보호됩니다.

다이어그램 2 – LSASS Trustlet 디자인

다이어그램 2 – lsass trustlet 디자인

IUM(격리된 사용자 모드) 영향

VTL1 코드를 디버그하는 기능을 억제하여 IUM 프로세스에 연결할 수 없습니다. 여기에는 메모리 덤프의 사후 디버깅 및 라이브 디버깅을 위한 디버깅 도구 연결이 포함됩니다. 또한 권한 있는 계정 또는 커널 드라이버가 DLL을 IUM 프로세스에 로드하거나, 스레드를 삽입하거나, 사용자 모드 APC를 제공하려는 시도도 포함됩니다. 이러한 시도는 전체 시스템의 불안정을 초래할 수 있습니다. Trustlet의 보안을 손상시키는 Windows API는 예기치 않은 방법으로 실패할 수 있습니다. 예를 들어 Trustlet에 DLL을 로드하면 VTL0에서 사용할 수 있지만 VTL1에서는 사용할 수 없습니다. 대상 스레드가 Trustlet에 있는 경우 QueueUserApc가 자동으로 실패할 수 있습니다. CreateRemoteThread, VirtualAllocEx 및 Read/WriteProcessMemory와 같은 다른 API도 Trustlet에 사용할 때 예상대로 작동하지 않습니다.

아래 샘플 코드를 사용하여 IUM 프로세스에 코드를 연결하거나 삽입하려는 함수를 호출하지 않도록 합니다. 여기에는 trustlet에서 코드를 실행하기 위해 APC를 큐에 대기시키는 커널 드라이버가 포함됩니다.

설명

IsSecureProcess의 반환 상태 성공하면 SecureProcess _Out_ 매개 변수를 검사하여 프로세스가 IUM 프로세스인지 확인합니다. IUM 프로세스는 시스템에서 "보안 프로세스"로 표시됩니다. TRUE의 부울 결과는 대상 프로세스가 IUM 형식임을 의미합니다.

NTSTATUS
IsSecureProcess(
   _In_ HANDLE ProcessHandle,
   _Out_ BOOLEAN *SecureProcess
   )
{
   NTSTATUS status;

       // definition included in ntddk.h  
   PROCESS_EXTENDED_BASIC_INFORMATION extendedInfo = {0};
 
   PAGED_CODE(); 
  
   extendedInfo.Size = sizeof(extendedInfo);

   // Query for the process information  
   status = ZwQueryInformationProcess(
                  ProcessHandle, ProcessBasicInformation, &extendedInfo,
                  sizeof(extendedInfo), NULL);

   if (NT_SUCCESS(status)) {
      *SecureProcess = (BOOLEAN)(extendedInfo.IsSecureProcess != 0);
   }
 
          return status;
}

WDK for Windows 10 "Windows 드라이버 키트 - Windows 10.0.15063.0"에는 PROCESS_EXTENDED_BASIC_INFORMATION 구조체에 대한 필수 정의가 포함되어 있습니다. 구조체의 업데이트된 버전은 새 IsSecureProcess 필드를 사용하여 ntddk.h에 정의됩니다.

typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
    SIZE_T Size;    // Ignored as input, written with structure size on output
    PROCESS_BASIC_INFORMATION BasicInfo;
    union {
        ULONG Flags;
        struct {
            ULONG IsProtectedProcess : 1;
            ULONG IsWow64Process : 1;
            ULONG IsProcessDeleting : 1;
            ULONG IsCrossSessionCreate : 1;
            ULONG IsFrozen : 1;
            ULONG IsBackground : 1;
            ULONG IsStronglyNamed : 1;
            ULONG IsSecureProcess : 1;
            ULONG IsSubsystemProcess : 1;
            ULONG SpareBits : 23;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;