다음을 통해 공유


ELAM 드라이버 요구 사항

드라이버 설치는 일반적인 INF 처리를 통해 드라이버를 등록하는 온라인 및 오프라인 설치에 기존 도구를 사용해야 합니다. 샘플 ELAM 드라이버 코드는 다음을 참조하세요. https://github.com/Microsoft/Windows-driver-samples/tree/main/security/elam

AM 드라이버 설치

드라이버 설치 호환성을 보장하기 위해 ELAM 드라이버는 다른 모든 부팅 시작 드라이버와 유사한 부팅 시작 드라이버로 자신을 보급합니다. INF는 시작 유형을 SERVICE_BOOT_START(0)로 설정합니다. 이는 드라이버가 부팅 로더에 의해 로드되고 커널 초기화 중에 초기화되어야 했음을 나타냅니다. ELAM 드라이버는 그룹을 "조기 출시"로 보급합니다. 이 그룹의 드라이버에 대한 초기 시작 동작은 다음 섹션에 설명된 대로 Windows에서 구현됩니다.

다음은 ELAM 드라이버 INF의 드라이버 설치 섹션의 예입니다.

[SampleAV.Service]
DisplayName    = %SampleAVServiceName%
Description    = %SampleAVServiceDescription%
ServiceType    = 1       ; SERVICE_KERNEL_DRIVER
StartType      = 0       ; SERVICE_BOOT_START
ErrorControl   = 3       ; SERVICE_ERROR_CRITICAL
LoadOrderGroup = “Early-Launch”

AM 드라이버는 디바이스를 소유하지 않으므로 AM 드라이버를 레거시로 설치해야 드라이버가 레지스트리에 서비스로만 추가됩니다. (AM 드라이버가 일반 PNP 드라이버로 설치된 경우 레지스트리의 열거형 섹션에 추가되므로 PDO 참조가 있으므로 드라이버를 언로드할 때 원치 않는 동작이 발생합니다.)

또한 ELAM 드라이버의 INF 파일에 SignatureAttributes 섹션 을 포함해야 합니다.

백업 드라이버 설치

ELAM 드라이버가 실수로 손상된 경우 복구 메커니즘을 제공하기 위해 ELAM 설치 관리자는 백업 위치에 드라이버 복사본도 설치합니다. 이렇게 하면 WinRE가 클린 복사를 검색하고 설치를 복구할 수 있습니다.

설치 관리자는 에 저장된 BackupPath 키에서 백업 파일 위치를 읽습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\EarlyLaunch

그런 다음 설치 관리자는 백업 복사본을 regkey에 지정된 폴더에 배치합니다.

AM 드라이버 초기화

Windows 부팅 로더인 Winload는 Windows 커널로 전달하기 전에 모든 부팅 시작 드라이버와 해당 종속 DLL을 메모리에 로드합니다. 부팅 시작 드라이버는 디스크 스택이 초기화되기 전에 초기화해야 하는 디바이스 드라이버를 나타냅니다. 이러한 드라이버에는 디스크 스택 및 볼륨 관리자, 운영 체제 디바이스용 파일 시스템 드라이버 및 버스 드라이버가 포함됩니다.

AM 드라이버 콜백 인터페이스

ELAM 드라이버는 콜백을 사용하여 PnP 관리자에게 모든 부팅 시작 드라이버 및 종속 DLL에 대한 설명을 제공하고 모든 부팅 이미지를 알려진 양호한 이진, 알려진 잘못된 이진 또는 알 수 없는 이진 파일로 분류할 수 있습니다.

기본 운영 체제 정책은 알려진 잘못된 드라이버 및 DLL을 초기화하지 않는 것입니다. 정책을 구성할 수 있으며 부팅 증명의 일부로 Winload에 의해 측정됩니다.

PnP는 AM 드라이버에서 제공하는 정책 및 분류를 사용하여 각 부팅 이미지를 초기화할지 여부를 결정합니다.

레지스트리 콜백

초기 실행 드라이버는 레지스트리 또는 부팅 드라이버 콜백을 사용하여 각 부팅 시작 드라이버에 대한 입력으로 사용되는 구성 데이터를 모니터링하고 유효성을 검사할 수 있습니다. 구성 데이터는 Winload에 의해 로드되고 부팅 드라이버 초기화 시 사용할 수 있는 시스템 레지스트리 하이브에 저장됩니다.

참고

ELAM 레지스트리 하이브에 대한 변경 내용은 시스템이 부팅되기 전에 삭제됩니다. 따라서 ELAM 드라이버는 레지스트리에 쓰는 대신 표준 ETW(Windows용 이벤트 추적) 로깅을 사용해야 합니다.

이러한 콜백은 ELAM 드라이버의 수명 동안 유효하며 드라이버가 언로드될 때 등록이 취소됩니다. 자세한 내용은 다음의 정보를 참조하세요.

부팅 드라이버 콜백

IoRegisterBootDriverCallbackIoUnRegisterBootDriverCallback을 사용하여 BOOT_DRIVER_CALLBACK_FUNCTION 등록 및 등록 취소합니다.

이 콜백은 모든 부팅 시작 드라이버가 초기화되고 콜백 기능이 더 이상 작동하지 않는 경우를 포함하여 Windows에서 ELAM 드라이버로의 상태 업데이트를 제공합니다.

콜백 유형

BDCB_CALLBACK_TYPE 열거형은 두 가지 유형의 콜백에 대해 설명합니다.

  • ELAM 드라이버에 대한 상태 업데이트를 제공하는 콜백(BdCbStatusUpdate)
  • 이미지를 초기화하기 전에 AM 드라이버에서 부팅 시작 드라이버 및 종속 DLL을 분류하는 데 사용하는 콜백(BdCbInitializeImage)

두 콜백 형식에는 콜백과 관련된 추가 정보를 제공하는 고유한 컨텍스트 구조가 있습니다.

상태 업데이트 콜백의 컨텍스트 구조에는 Windows 설명선에 대해 설명하는 단일 열거형 형식이 포함되어 있습니다.

이미지 초기화 콜백의 컨텍스트 구조는 로드된 각 이미지에 대한 해시 및 인증서 정보를 포함하는 더 복잡합니다. 또한 구조체에는 AM 드라이버가 드라이버의 분류 유형을 저장하는 출력 매개 변수인 필드가 포함됩니다.

상태 업데이트 콜백에서 반환된 오류는 치명적인 오류로 처리되고 시스템 버그 검사 발생합니다. 이렇게 하면 ELAM 드라이버가 AM 정책 외부에서 상태에 도달하는 시기를 나타내는 기능을 제공합니다. 예를 들어 AM 런타임 드라이버가 로드되고 초기화되지 않은 경우 조기 실행 드라이버는 준비-언로드 콜백에 실패하여 WINDOWS가 AM 드라이버가 로드되지 않고 상태가 되지 않도록 할 수 있습니다.

이미지 초기화 콜백에서 오류가 반환되면 이미지를 알 수 없는 것으로 처리됩니다. 알 수 없는 드라이버가 초기화되거나 OS 정책에 따라 초기화를 건너뛰게 됩니다.

맬웨어 서명

맬웨어 서명 데이터는 AM ISV에 의해 결정되지만 최소한 승인된 드라이버 해시 목록을 포함해야 합니다. 서명 데이터는 Winload에 의해 로드되는 HKLM 아래의 새로운 "조기 실행 드라이버" 하이브에 레지스트리에 저장됩니다. 각 AM 드라이버에는 서명 BLOB(Binary Large Object)을 저장할 고유 키가 있습니다. 레지스트리 경로 및 키의 형식은 다음과 같습니다.

HKLM\ELAM\<VendorName>\

키 내에서 공급업체는 값을 자유롭게 정의하고 사용할 수 있습니다. 측정 부팅으로 측정되는 세 가지 정의된 이진 Blob 값이 있으며 공급업체는 각각 다음을 사용할 수 있습니다.

  • 측정
  • 정책
  • Config

ELAM 하이브는 성능을 위해 조기 실행 맬웨어 방지 프로그램을 사용한 후 언로드됩니다. 사용자 모드 서비스에서 서명 데이터를 업데이트하려는 경우 파일 위치 \Windows\System32\config\ELAM에서 hive 파일을 탑재해야 합니다. 예를 들어 UUID를 생성하고 문자열로 변환한 다음 하이브를 탑재할 고유 키로 사용할 수 있습니다. 이러한 데이터 BLOB의 스토리지 및 검색 형식은 ISV에 남아 있지만 AM 드라이버가 데이터의 무결성을 확인할 수 있도록 서명 데이터에 서명해야 합니다.

맬웨어 서명 확인

맬웨어 서명 데이터의 무결성을 확인하는 방법은 각 AM ISV에 남아 있습니다. CNG 암호화 기본 함수를 사용하여 맬웨어 서명 데이터에 대한 디지털 서명 및 인증서를 확인할 수 있습니다.

맬웨어 서명 실패

ELAM 드라이버가 서명 데이터의 무결성을 확인하고 해당 검사 실패하거나 서명 데이터가 없는 경우 ELAM 드라이버의 초기화는 여전히 성공합니다. 이 경우 각 부팅 드라이버에 대해 ELAM 드라이버는 각 초기화 콜백에 대해 "알 수 없음"을 반환해야 합니다. 또한 ELAM 드라이버는 시작되면 이 정보를 런타임 AM 구성 요소에 전달해야 합니다.

AM 드라이버 언로드

콜백 StatusType이 BdCbStatusPrepareForUnload인 경우 이는 모든 부팅 드라이버가 초기화되었으며 AM 드라이버가 언로드될 준비를 해야 한다는 것을 AM 드라이버에 나타냅니다. 언로드하기 전에 초기 시작 AM 드라이버는 콜백을 등록 취소해야 합니다. 콜백 중에는 등록 취소가 발생할 수 없습니다. 드라이버가 DriverEntry 중에 지정할 수 있는 DriverUnload 함수에서 발생해야 합니다.

맬웨어 보호의 연속성을 유지하고 적절한 핸드오프를 보장하려면 조기 시작 AM 드라이버가 언로드되기 전에 런타임 AM 엔진을 시작해야 합니다. 즉, 런타임 AM 엔진은 초기 시작 AM 드라이버에 의해 확인된 부팅 드라이버여야 합니다.

성능

드라이버는 다음 표에 정의된 성능 요구 사항을 충족해야 합니다.

시나리오

시작 시간

종료 시간

상한

초기화할 수 있도록 허용하기 전에 로드된 부팅 중요 드라이버를 평가합니다. 여기에는 상태 업데이트 콜백도 포함됩니다.

커널은 다시 맬웨어 방지 드라이버를 호출하여 로드된 부팅 중요 드라이버를 평가합니다.

맬웨어 방지 드라이버는 평가 결과를 반환합니다.

0.5ms

로드된 모든 부팅 중요 드라이버 평가

커널은 맬웨어 방지 드라이버를 다시 호출하여 첫 번째 로드된 부팅 중요 드라이버를 평가합니다.

맬웨어 방지 드라이버는 마지막 부팅 중요 드라이버에 대한 평가 결과를 반환합니다.

50ms

공간(드라이버 + 메모리의 구성 데이터)

해당 없음

해당 없음

128kB

드라이버 초기화

ELAM 드라이버에서 부팅 드라이버를 평가한 후 커널은 ELAM에서 반환한 분류를 사용하여 드라이버를 초기화할지 여부를 결정합니다. 이 결정은 정책에 따라 결정되며 다음의 레지스트리에 저장됩니다.

HKLM\System\CurrentControlSet\Control\EarlyLaunch\DriverLoadPolicy

도메인에 가입된 클라이언트의 그룹 정책 통해 구성할 수 있습니다. 맬웨어 방지 솔루션은 비관리형 시나리오에서 최종 사용자에게 이 기능을 노출하려고 할 수 있습니다. DriverLoadPolicy에 대해 정의된 값은 다음과 같습니다.

PNP_INITIALIZE_DRIVERS_DEFAULT 0x0  (initializes known Good drivers only)
PNP_INITIALIZE_UNKNOWN_DRIVERS 0x1  
PNP_INITIALIZE_BAD_CRITICAL_DRIVERS 0x3 (this is the default setting)
PNP_INITIALIZE_BAD_DRIVERS 0x7

부팅 실패

초기화 정책으로 인해 부팅 드라이버를 건너뛰는 경우 커널은 목록에서 다음 부팅 드라이버를 초기화하려고 계속 시도합니다. 건너뛴 부팅 드라이버가 부팅에 중요했기 때문에 드라이버가 모두 초기화되거나 부팅이 실패할 때까지 계속됩니다. 디스크 스택이 시작된 후 충돌이 발생하면 크래시 덤프가 있으며 누락된 드라이버에 대한 정보를 포함하는 이유 또는 크래시에 대한 몇 가지 정보가 포함됩니다. WinRE에서 실패의 원인을 확인하고 수정을 시도하는 데 사용할 수 있습니다.

ELAM 및 측정된 부팅

ELAM 드라이버가 정책 위반(예: 루트킷)을 감지하는 경우 즉시 Tbsi_Revoke_Attestation 호출하여 시스템이 양호한 상태임을 나타내는 PCR을 무효화해야 합니다. 함수는 측정된 부팅에 문제가 있는 경우(예: 시스템에 TPM이 없는 경우) 오류를 반환합니다.

Tbsi_Revoke_Attestation 커널 모드에서 호출할 수 있습니다. PCR[12]을 지정되지 않은 값으로 확장하고 TPM에서 이벤트 카운터를 증가합니다. 두 작업 모두 필요하므로 여기에서 만든 모든 따옴표에서 트러스트가 끊어집니다. 따라서 측정된 부팅 로그는 TPM이 전원이 공급되는 남은 시간 동안 TPM의 현재 상태를 반영하지 않으며 원격 시스템은 시스템의 보안 상태에 대한 신뢰를 형성할 수 없습니다.