Udostępnij za pośrednictwem


Obsługa personifikacji klienta w sterownikach UMDF 1.x

Ostrzeżenie

UMDF 2 jest najnowszą wersją UMDF i zastępuje UMDF 1. Wszystkie nowe sterowniki UMDF powinny być zapisywane przy użyciu funkcji UMDF 2. Do usługi UMDF 1 nie są dodawane żadne nowe funkcje, a obsługa UMDF 1 na nowszych wersjach systemu Windows 10 jest ograniczona. Sterowniki uniwersalne systemu Windows muszą używać funkcji UMDF 2.

Zarchiwizowane przykłady UMDF 1 można znaleźć w Windows 11, wersja 22H2 - Maj 2022 aktualizacja przykładów sterowników.

Aby uzyskać więcej informacji, zobacz Wprowadzenie do usługi UMDF.

Sterowniki UMDF są zwykle uruchamiane na koncie usługi lokalnej i nie mogą uzyskiwać dostępu do plików lub zasobów, które wymagają poświadczeń użytkownika, takich jak pliki chronione lub inne chronione zasoby. Sterownik UMDF zwykle działa na poleceniach i danych przepływających między aplikacją kliencką a urządzeniem. W związku z tym większość sterowników UMDF nie uzyskuje dostępu do chronionych zasobów.

Jednak niektóre sterowniki mogą wymagać dostępu do chronionego zasobu. Na przykład sterownik UMDF może załadować oprogramowanie układowe do urządzenia z pliku zapewnianego przez aplikację kliencką. Plik może mieć listę kontroli dostępu (ACL), która uniemożliwia nieautoryzowanym użytkownikom modyfikowanie pliku i przejmowanie kontroli nad urządzeniem. Niestety ta lista ACL uniemożliwia również sterownikowi UMDF uzyskiwanie dostępu do pliku.

Platforma zapewnia możliwość personifikacji, która umożliwia sterownikom personifikację klienta sterownika i uzyskanie praw dostępu klienta do chronionych zasobów.

Włączanie trybu podszywania się

Zarówno pakiet instalacyjny sterownika UMDF, jak i aplikacja kliencka muszą włączyć możliwość podszywania się w ramach frameworku w następujący sposób:

  • Plik INF pakietu instalacyjnego sterownika UMDF musi zawierać dyrektywę UmdfImpersonationLevel i ustawić maksymalny dozwolony poziom podszywania się. Personifikacja jest włączona tylko wtedy, gdy plik INF zawiera dyrektywę UmdfImpersonationLevel. Aby uzyskać więcej informacji na temat ustawiania poziomu personifikacji, zobacz Określanie dyrektyw WDF w plikach INF.

  • Aplikacja kliencka musi ustawić dozwolony poziom imitacji dla każdego uchwytu pliku. Aplikacja używa ustawień jakości usług (QoS) w funkcji Microsoft Win32 CreateFile, aby ustawić dozwolony poziom personifikacji. Aby uzyskać więcej informacji na temat tych ustawień, zapoznaj się z parametrem dwFlagsAndAttributes w dokumentacji CreateFile dostępnej w zestawie SDK systemu Windows.

Obsługa personifikacji dla żądania we/wy

Sterownik UMDF i struktura obsługują personifikację żądania we/wy w następującej sekwencji:

  1. Sterownik wywołuje metodę IWDFIoRequest::Impersonate, aby określić wymagany poziom podszywania się oraz funkcję wywołania zwrotnego IImpersonateCallback::OnImpersonate.

  2. Platforma sprawdza żądany poziom personifikacji. Jeśli żądany poziom jest większy niż poziom, na który zezwala pakiet instalacyjny sterownika UMDF i aplikacja kliencka, żądanie personifikacji kończy się niepowodzeniem. W przeciwnym razie framework personifikuje klienta i natychmiast wywołuje funkcję wywołania zwrotnego OnImpersonate.

Funkcja OnImpersonate wywołania zwrotnego musi wykonywać tylko operacje wymagające żądanego poziomu personifikacji, takie jak otwarcie chronionego pliku.

UMDF nie zezwala, aby funkcja wywołania zwrotnego sterownika OnImpersonate wywoływała jakiekolwiek z metod obiektów frameworku. Zapewnia to, że sterownik nie uwidacznia poziomu podszywania się przed innymi funkcjami wywołania zwrotnego sterownika lub innymi sterownikami.

Uwaga W wersjach od 1.0 do 1.7 UMDF, IWDFIoRequest::Impersonate przyznaje najwyższy poziom personifikacji, na który zezwala aplikacja kliencka i plik INF, nawet jeśli poziom personifikacji żądany przez sterownik jest niższy. W wersjach UMDF 1.9 i nowszych metoda Personifikuj przyznaje tylko poziom personifikacji, którego żąda sterownik.

Przekazywanie poświadczeń w dół stosu sterowników

Gdy sterownik otrzyma żądanie we/wy typu WdfRequestCreate, sterownik może przekazać żądanie w dół stosu sterowników do sterownika trybu jądra. Sterowniki trybu jądra nie mają możliwości podszywania się, które IWDFIoRequest::Impersonate zapewnia sterownikom opartym na UMDF.

W związku z tym, jeśli chcesz, aby sterownik trybu jądra odbierał poświadczenia klienta (zamiast poświadczeń procesu hosta sterownika ), sterownik musi ustawić flagę WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT podczas wywoływania polecenia IWDFIoRequest::Send, aby wysłać żądanie utworzenia do docelowego obiektu we/wy. Metoda Send zwraca kod błędu, jeśli próba podszywania się zakończy się niepowodzeniem, chyba że sterownik dodatkowo ustawia flagę WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE.

Sterownik nie musi wywoływać IWDFIoRequest::Impersonate przed wysłaniem żądania do obiektu docelowego we/wy.

Jeśli sterowniki niższego poziomu również przesyłają żądanie, poziom personifikacji klienta przechodzi w dół stosu sterowników.

Zmniejszanie zagrożeń bezpieczeństwa

Aby zmniejszyć prawdopodobieństwo ataku eskalacji uprawnień, należy wykonać następujące kroki:

  • Staraj się unikać personifikacji.

    Aby na przykład uniknąć użycia personifikacji w celu otwarcia pliku, którego musi użyć sterownik, aplikacja kliencka może otworzyć plik i użyć operacji we/wy, aby wysłać zawartość pliku do sterownika.

  • Użyj najniższego poziomu personifikacji wymaganego przez sterownik.

    Ustaw poziom personifikacji w pliku INF sterownika tak niski, jak to możliwe. Jeśli sterownik nie wymaga personifikacji, nie dołączaj dyrektywy UmdfImpersonationLevel w pliku INF.

  • Zminimalizuj możliwości wykorzystania kierowcy przez osobę atakującą.

    Funkcja zwrotna OnImpersonate powinna zawierać niewielką sekcję kodu, która wykonuje tylko operację wymagającą imitacji. Jeśli na przykład sterownik uzyskuje dostęp do chronionego pliku, wymaga personifikacji tylko wtedy, gdy otworzy dojście do pliku. Nie wymaga personifikacji do odczytu ani zapisu w pliku.