2011-10-25 2 views
4

내가 함께 일하는 팀은 우리 소프트웨어를 타사의 가상화 소프트웨어와 호환 가능하게 만드는 과제에 직면했습니다. 이 소프트웨어는 커널 드라이버를 사용하여 Windows 기본 레지스트리 API (ZwCreateKey 등)의 연결을 수행합니다. Ntdll에서 호출을 연결하여 작동합니다. 우리의 소프트웨어 또한 상당히 낮은 수준이며 일부 상황에서는 실제 레지스트리에 접속하지 않아도됩니다.왜 커널 모드에서 ZwCreateKey를 호출하면 Windows 보안을 우회하는 것처럼 보입니까?

우리는 우리 자신의 커널 드라이버를 사용하여 ZwCreateKey 등으로 전화를 할 가능성을 모색하고 있습니다. 이것은 본질적으로 NT 레거시 드라이버와 자체 고유 레지스트리 기능을 제공하는 사용자 모드 라이브러리를 만드는 것을 의미합니다. 라이브러리와 드라이버는 매우 간단합니다. 우리는 단순히 IOCTL을 사용하여 드라이버에 ZwCreateKey 등의 모든 매개 변수를 전달한 다음 커널 버전의 호출을 호출하고 결과를 반환합니다.

이 접근법은 잘 작동했으며 이제 가상화 될 때 실제 레지스트리를 읽고 쓰는 시스템이있는 것으로 보입니다. 유일한 문제는 우리의 새로운 시스템이 Windows 레지스트리를 레지스트리 개체로 간주한다는 것입니다.

ZwCreateKey은과 같이 액세스 마스크를 취

NTSTATUS ZwCreateKey(
    __out  PHANDLE KeyHandle, 
    __in  ACCESS_MASK DesiredAccess, 
    __in  POBJECT_ATTRIBUTES ObjectAttributes, 
    __reserved ULONG TitleIndex, 
    __in_opt PUNICODE_STRING Class, 
    __in  ULONG CreateOptions, 
    __out_opt PULONG Disposition 
); 

나의 이해는 우리가 커널 모드에서 실행하고 있지만, 우리는 여전히 사용자의 토큰의 문맥을했다이었다. 이것은 ZwCreateKey의 커널 버전이 액세스 마스크 테스트가 실패 할 경우 사용자가 가지게 될 것처럼 실패 할 것입니다. 실제로 일어나는 것은 제한된 토큰으로도 드라이버가 호출 될 때 제한된 사용자가 호출 할 때 HKLM의 제한된 부분에 키를 생성 할 수 있다는 것입니다. 뭐라 구요? ACL을 수행해야합니까? 커널 모드에서 우리 자신의 권한을 제한하기 위해 무언가를해야합니까? 어떤 도움을 많이 주셨습니다.

답변

7

설명을 보려면 this을 확인하십시오. 기본적으로 사용자 모드 (Ntdll)의 Nt/Zw는 동일한 작업입니다. 먼저 실제로 작업을 수행하기 전에 광범위한 검사를 수행합니다. 커널 모드 구성 요소 (예 : 드라이버)에서 오는 정보가 기본적으로 신뢰할 수 있다고 가정하기 때문에 커널 모드에서 Zw 기능을 호출 할 때 (장치 드라이버와 마찬가지로) 이러한 검사는 생략됩니다.

+1

Ahah 예, PreviousMode가 문제가 될 수 있습니다. – Benj

+0

Windows 내부 친구 Alex Ionescu는 이전 모드 (http://www.alex-ionescu.com/BH08-AlexIonescu.pdf)를 다룹니다. 그는 모든 시스템 호출 근본적으로 내가하고있는 일)은 이전 모드를 설정하고 이전 모드의 주문을 "위험"으로 설정하지 않아야합니다. 매우 극적이고 우수한 조언 :-) – Benj

관련 문제