Podpisywanie sterowników

Czasem zdarzy sie, ze ktos ma system w wersji x64. Jezeli to serwer Windows 2008R2, to nie bardzo mial wybór, a jezeli to inny system – prawdowpodobnie ktos swiadomie sie na 64 bity zdecydowal. I bardzo dobrze, obiema rekami popieram taka decyzje. Slyszy sie jednak czesto (a w zasadzie, czyta na forach), ze 64 bity to same klopoty. Aplikacje jakos dadza sobie rade, ale bedzie ogromny problem ze sterownikami. W praktyce ten problem wcale nie okazuje sie taki wielki, co nie oznacza jednak, ze nie istnieje. I staje taki odwazny i glodny nowosci uzytkownik wersji x64 przed sytuacja: system x64, sterownik udalo sie znalezc (Microsoft uzywa zwykle wdziecznego przykladu sterownika do tostera) tyle, ze wbudowane w systemy x64 mechanizmy nie pozwalaja na uzycie sterownika, który nie jest podpisany.

_sign2a

Typowa rada na wszelkich forach brzmi: wylacz weryfikacje podpisywania sterowników.

Chcac taka rade szczerze skomentowac, musialbym ograniczyc siedo zdania "ta rada jest glupia". Tak jak glupia rada jest sugestia, zeby zrezygnowac z zamykania drzwi od mieszkania, gdy mamy tylko dwa klucze a z wejscia potrzebuja skorzystac trzy osoby. Nie rozwalajmy systemowych mechanizmów zabezpieczen, tylko dlatego ze sterownik nie spelnia ich wymagan. Nie rezygnujmy z systemu przepustek dlatego, ze do firmy przyszedl nowy pracownik, który przepustki nie ma! Przeciez w takiej sytuacji, w normalnym zyciu pierwszym odruchem jest wystawienie przepustki dla nowego. A nie "równianie w dól". Jezeli trzy osoby musza skorzystac z drzwi – dorobimy trzeciej klucz. Normalne, naturalne i zwykle calkiem proste.

W systemach x64 nie jest wcale trudniej. Mamy kilkadziesiat podpisanych cyfrowo sterowników i jeden, który podpisany nie jest. Skad bierze sie w takiej sytuacji chory pomysl, zeby wylaczyc kontrole podpisów!? Nie prosciej podpisac ten jeden sterownik i nadal cieszyc sie bezpiecznym systemem?

Wbrew obiegowej opinii, podpisanie sterownika nie jest wcale trudne i moze to zrobic kazdy, a nie tylko jego twórca. Majac pobrany sterownik, wystarczy:

  • Utworzyc certyfikat. Na przyklad narzedziem makecert z parametrami –r –pe –ss –n
  • Dodac certyfikat. Do root i do trustedpublisher. Certmgr z parametrami –add –s –r zrobi to idealnie.
  • Utworzyc plik *.cat dla sterownika. Mozna uzyc do tego narzedzia Inf2cat. Jezeli sterownik ma dzialac w systemie Windows 7, jako parametr trzeba podac /os:7_X64. Operacja ta moze wymagac pooszukiwania z data w pliku inf, ale inf2cat wyraznie o tym napisze.
  • Podpisac plik *.cat. Tutaj najlepiej sprawdzi sie signtool.exe w polaczeniu z certyfikatem wygenerowanym na poczatku prac. Udane podpisanie sprawi, ze we wlasciwosciach pliku *.cat pojawi sie dodatkowa zakladka z informacjami na temat podpisu.

 _sign1

Gotowe! Sterownik zostal podpisany cyfrowo i w tym momencie, jakakolwiek próba jego podmienienia zostanie natychmiast przez system wykryta i zasygnalizowana.
Wszystkie uzyte narzedzia sa w systemie albo w bezplatnym pakiecie WinDDK. Nic tylko uzywac.

Oczywiscie instalacja tak podpisanego sterownika przebiega bez zadnego problemu i po zainstalowaniu widac, ze jest on podpisany.

_sign4

A tak swoja droga, do szanownych programistów mam dwie uwagi:

  1. Powinniscie nauczyc sie uzywac UMDF, zamiast z kazdym drobiazgiem pchac sie do jadra systemu. Prosciej, bezpieczniej, klienci beda szczesliwsi a problem podpisywania przestanie byc tak dotkliwy.
  2. Jezeli juz musicie do jadra, to podpisujcie swoje sterowniki, zamiast kazac robic to userom, albo sugerowac im, ze powinni wylaczyc kontrole podpisów w calym systemie.

Autor: Grzegorz Tworek [MVP]

PS. Powyzszy przepis powinien byc nieco inny dla sterowników ustawionych na start w trybie boot (Start Type = 0) ale to tylko formalna uwaga, bo nie takich przypadków dotycza troski typowego uzytkownika.