Udostępnij przez


Problemy z zabezpieczeniami obiektów i widoków sekcji

Sterowniki tworzące sekcje i widoki, które nie mają być udostępniane trybowi użytkownika, muszą używać następującego protokołu podczas pracy z sekcjami i widokami:

  • Sterownik musi użyć uchwytu jądra podczas otwierania uchwytu do obiektu sekcji. Sterowniki mogą upewnić się, że uchwyt jest uchwytem jądra, tworząc go w procesie systemowym lub określając atrybut OBJ_KERNEL_HANDLE dla uchwytu. Aby uzyskać więcej informacji, zobacz Obsługa obiektów.

  • Widok musi być mapowany tylko z wątku systemowego. (W przeciwnym razie widok jest dostępny z procesu, w którym tworzony jest jego kontekst). Sterownik może upewnić się, że widok jest mapowany z procesu systemowego, korzystając z systemowego wątku roboczego do wykonania operacji mapowania. Aby uzyskać więcej informacji, zobacz Wątki procesów roboczych systemu i Kontekst wątku sterownika.

Sterowniki, które udostępniają widok procesowi trybu użytkownika, muszą używać następującego protokołu podczas pracy z sekcjami i widokami:

  • Sterownik, a nie proces trybu użytkownika, musi utworzyć obiekt sekcji i mapować widoki.

  • Jak wspomniano wcześniej, sterownik musi używać uchwytu jądra, gdy otwiera uchwyt do obiektu sekcji. Sterowniki mogą upewnić się, że uchwyt jest uchwytem jądra, tworząc go w procesie systemowym lub określając atrybut OBJ_KERNEL_HANDLE dla uchwytu. Aby uzyskać więcej informacji, zobacz Obsługa obiektów.

  • Widok jest mapowany w kontekście wątku procesu, który udostępnia widok. Sterownik najwyższego poziomu może zagwarantować, że widok jest mapowany w bieżącym kontekście procesu, wykonując operację mapowania w procedurze wysyłania, na przykład DispatchDeviceControl. Procedury wysyłania sterowników niższego poziomu są uruchamiane w dowolnym kontekście wątku, a tym samym nie mogą bezpiecznie mapować widoku w procedurze wysyłania. Aby uzyskać więcej informacji, zobacz Kontekst wątku sterownika.

  • Wszystkie dostępy do pamięci widoku w obrębie sterownika muszą być zabezpieczone blokami try/except. Złośliwa aplikacja w trybie użytkownika może cofnąć mapowanie widoku lub zmienić stan ochrony widoku. Albo jedno, albo drugie spowodowałoby awarię systemu, chyba że byłoby chronione przez blok try-except. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków.

Sterownik musi również zweryfikować zawartość widoku w razie potrzeby. Autor sterownika nie może zakładać, że tylko zaufany komponent trybu użytkownika ma dostęp do widoku.

Sterownik, który musi współużytkować obiekt sekcji z aplikacją trybu użytkownika (która musi mieć możliwość tworzenia własnych widoków), musi użyć następującego protokołu:

  • Sterownik, a nie proces trybu użytkownika, musi utworzyć obiekt sekcji. Sterowniki nigdy nie muszą używać uchwytu, który został przekazany z trybu użytkownika.

  • Przed przekazaniem dojścia do trybu użytkownika sterownik musi wywołać metodę ObReferenceObjectByHandle, aby uzyskać odwołanie do obiektu sekcji. Zapobiega to usunięciu obiektu sekcji przez zamknięcie uchwytu przez złośliwą aplikację. Odwołanie do obiektu powinno być przechowywane w rozszerzeniu urządzenia sterownika.

  • Gdy sterownik nie korzysta już z obiektu sekcji, musi wywołać obiekt ObDereferenceObject , aby zwolnić odwołanie do obiektu.

W systemach z systemem Microsoft Windows Server 2003 z dodatkiem Service Pack 1 (SP1) i nowszymi wersjami tylko sterowniki trybu jądra mogą otwierać plik \Device\PhysicalMemory. Jednak sterowniki mogą zdecydować się na przekazanie dojścia do aplikacji użytkownika. Aby zapobiec problemom z zabezpieczeniami, tylko aplikacje użytkowników, którym ufa sterownik, powinny mieć dostęp do \Device\PhysicalMemory.