Podpisywanie kodu w systemach Windows – User Mode

Podpisywanie kodu w systemach Windows – User Mode

Wykorzystanie podpisu cyfrowego w celu zapewnienia autentyczności i integralności aplikacji w systemach Windows realizowane jest poprzez mechanizm Microsoft Authenticode. Jeżeli chcesz dowiedzieć się jakie są najnowsze wymagania odnośnie podpisywania aplikacji w systemach operacyjnych firmy z Redmond ten wpis jest dla Ciebie.

Nieznany wydawca

Certyfikaty do podpisywania kodu (ang. code signing certificates) jak sama nazwa wskazuje służą do cyfrowego podpisywania różnego rodzaju kodu; aplikacji desktopowych czy sterowników systemowych. Użycie takiego certyfikatu chroni aplikację przed nieuprawnionymi próbami jej modyfikacji, a jej odbiorca może w prosty sposób potwierdzić jej pochodzenie (informacja o autorze podpisu zapisana jest w certyfikacie). Często do takiego podpisu dołączany jest znacznik czasu, pochodzący z niezależnego systemu znakowania czasem, pozwalający na jednoznaczne i niezaprzeczalne określenie daty i godziny jej podpisania. Podpisywanie kodu jest dzisiaj bardzo powszechną praktyką, zwłaszcza jeżeli chodzi o programy działające pod kontrolą najpopularniejszej rodziny systemów operacyjnych – Windows. Próba uruchomienia na tych systemach niepodpisanych cyfrowo programów kończy się serią ostrzeżeń o nieznanym oprogramowaniu pochodzącą z różnych mechanizmów zabezpieczających takich jak UAC (ang. User Account Control) czy SmartScreen.

Przed przejściem do kolejnej części muszę krótko wspomnieć o trybach w jakich działać mogą aplikacje w systemach Microsoftu. Otóż, programy w systemach Windows mogą być wykonywane w trybie użytkownika (ang. user mode) lub w trybie jądra systemu (ang. kernel mode). Różnice polegają na sposobie przydzielania przestrzeni adresowych (pamięci) i tym samym na uprawnieniach jakie zyskują aplikacje. Na przykład, gdy aplikacja wykonywana w user mode nieoczekiwanie ulegnie awarii to nie wpłynie to niekorzystnie na inne wykonywane aplikacje. W kernel mode jest przeciwnie. Z uwagi na współdzielenie – z innymi aplikacjami czy samym systemem operacyjnym – pamięci, nieoczekiwana awaria ma wpływ na całość działania Windowsa.

Wpis, który czytasz dotyczy tych pierwszych, czyli aplikacji uruchamianych w trybie użytkownika, z którymi de facto mamy do czynienia częściej.

Podpisywanie kodu w 2016

Być może niektórzy z Was zauważyli, że od nowego roku, znaczna cześć uruchamianych programów podpisanych cyfrowo nie jest poprawnie weryfikowana przez Windowsa. Wiąże się to z blokowaniem uruchomienia aplikacji i odstraszającymi użytkownika komunikatami, podobnie jak ma to miejsce w przypadku niepodpisanych aplikacji:

Filtr Windows SmartScreen uniemożliwił uruchomienie nierozpoznanej aplikacji. Uruchomienie tej aplikacji może narazić komputer na zagrożenie.

20160203-smart_screen_warning_1

Kliknij, aby powiększyć.

Podpis pliku jest uszkodzony lub nieważny.

Filtr SmartScreen zgłosił plik jako niebezpieczny.

20160203-smart_screen_warning

Kliknij, aby powiększyć.

Jak temu zaradzić? Otóż, głównym czynnikiem determinującym to czy Windows poprawnie zweryfikuje program i pozwoli na jego bezproblemowe uruchomienie jest algorytm podpisu certyfikatu, który jest wykorzystywany do podpisywania kodu. Precyzując, istotna jest funkcja skrótu która została użyta w procesie wyliczenia podpisu. Już chyba mało kogo zdziwi, że gorsze traktowanie przewidziane jest dla algorytmu SHA-1 (ang. Secure Hash Algorithm), a premiowany jest SHA-256. Poniżej znajdziecie zestawienie tego jaka funkcja skrótu z algorytmu podpisu certyfikatu do podpisywania kodu jest akceptowana na poszczególnych systemach w tym roku oraz jak zmieni się to w roku kolejnym (stan na dzisiaj):

20160203-authenticode_user_mode

Kliknij, aby powiększyć.

Uwaga do powyższej tabeli: systemy Windows Vista i Windows 7 nie posiadają domyślnego wsparcia dla funkcji skrótu SHA-256, żeby móc z niej skorzystać w systemie zainstalowane muszą być właściwe aktualizacje – odpowiednio dla Visty i 7.

Należy pamiętać, że funkcja skrótu wykorzystywana jest nie tylko do podpisania samego certyfikatu, ale także podczas podpisywania aplikacji. W tym przypadku Microsoft, przynajmniej nie razie, nie stawia określonych wymagań i dopuszczalne jest użycie zarówno SHA-1 jak i SHA-256. Można się jednak spodziewać, że stan taki może ulec zmianie. W celu zabezpieczenia się na taką ewentualność warto podpisać program dwukrotnie (opcja ta działa tylko dla plików formatu Portable Executable np.: exe, dll), przy użyciu różnych funkcji skrótu. Dodatkowym plusem podwójnego podpisu aplikacji jest zapewnienie kompatybilności ze starszymi wersjami Windowsa (np. XP). Poniżej przykład jak można dokonać tego za pomocą narzędzia Signtool:

signtool sign /f certyfikat.pfx /p hasło_do_certyfikatu /tr adres_serwera_znacznika_czasu /fd SHA1 program.exe

signtool sign /as /f certyfikat.pfx /p hasło_do_certyfikatu /tr adres_serwera_znacznika_czasu /fd SHA256 program.exe

Przełącznik /as pozwala na dodanie podpisu do już istniejącego, natomiast /fd (działa dopiero od systemu Windows 7) określa algorytm funkcji skrótu jaki zostanie użyty do utworzenia podpisu. W poleceniach celowo podałem także przełącznik /tr (działa dopiero od systemu Windows 7), który pozwala na podanie adresu serwera znacznika czasu. Dołączenie do podpisu tokena czasowego pozwoli na poprawną weryfikację aplikacji nawet w momencie, gdy certyfikat podpisujący straci ważność. Warto poszukać serwera znacznika czasu, który wydaje znaczniki czasu w oparciu o funkcję skrótu SHA-256. Dzięki temu eliminujemy kolejny punkt w którym Windows może przyczepić się do naszej aplikacji. Aby uzyskać znacznik czasu SHA-256 najlepiej wygenerować żądanie, które tę funkcję skrótu wykorzystuje. W narzędziu Signtool do definicji algorytmu funkcji skrótu dla podpisu żądania służy przełącznik /td (działa dopiero od systemu Windows 7):

signtool sign /as /f certyfikat.pfx /p hasło_do_certyfikatu /tr adres_serwera_znacznika_czasu /td SHA256 /fd SHA256 program.exe

Należy pamiętać, że przełącznik /td może zostać użyty tylko wtedy jeżeli wcześniej użyliśmy przełącznika /tr. Jeżeli szukacie darmowych serwerów znaczników czasu, tutaj przygotowałem małą listę.

Sprawdzenia tego czy oba podpisy dodały się poprawnie można dokonać poprzez zakładkę Podpisy cyfrowe, we właściwościach podpisanego pliku. Efekt powinien być podobny do tego:

20160203-dual_signing

Podsumowanie

Jeżeli więc piszesz aplikacje pod Windowsa i nie chcesz, żeby były one blokowane, zacznij od wymiany certyfikatu do podpisywania kodu na taki, który został podpisany przy pomocy SHA-256. Większość Urzędów Certyfikacji posiada takie w swojej ofercie i oferuje darmową wymianę. Następnie wystarczy już tylko, że podpiszesz swoją aplikację przy użyciu nowego certyfikatu. Co ważne, podczas wymiany certyfikatu warto zwrócić uwagę na to czy certyfikat/y pośredni/e z jego ścieżki certyfikacyjnej (nie dotyczy to certyfikatu głównego znajdującego się na samej górze) zostały wystawione przy użyciu funkcji skrótu SHA-256.

Na koniec jeszcze jedna uwaga dotycząca wspomnianego wcześniej mechanizmu SmartScreen. Może zdarzyć się, że mimo wykonania wszystkich powyższych wskazówek ostrzeżenie o nierozpoznanej aplikacji nadal będzie pojawiało się podczas próby uruchomienia Waszego programu. Dzieje się tak dlatego, że filtr SmartScreen budując reputację danej aplikacji nie opiera swojego działania wyłącznie na weryfikacji podpisu cyfrowego (chyba, że podpisaliśmy aplikację przy użyciu certyfikatu EV Code Signing). Sprawdzana jest także m.in. liczba pobrań danej aplikacji oraz ilość zgłoszeń dotyczących złośliwego oprogramowania; weryfikowany jest także sam adres spod którego daną aplikację pobieramy. Zbiór praktyk, które pomagają w ustanowieniu dobrej reputacji znajdziecie na stronach Microsoftu.

Komentarze

  1. Kr

    W tabeli jest że Win8/8.1?/10 wymaga aktualizacji aby obsługiwać SHA256, a czy aby na pewno?
    Wygląda jakby to był błąd który powstał przy użyciu metody Copiego Pastiego ;)

    1. Kryptosfera Autor wpisu

      Racja, aktualizacja KB2949927 została zastąpiona przez KB3033929. Zaktualizowałem link we wpisie, dzięki.

  2. Marcio

    Przydatny artykuł! Nie zauważyłem nawet, że miałem podpisaną aplikację tylko SHA-1 :)
    Ale oczywiście SmartScreen i tak krzyczy aby najlepiej nie uruchamiać podpisanej cyfrowo aplikacji :( Microsoft niestety jak zawsze wie lepiej …

Skomentuj Marcio Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *