CryptGenRandom
CryptGenRandom to przestarzała , kryptograficznie bezpieczna funkcja generatora liczb pseudolosowych , która jest zawarta w Microsoft CryptoAPI . W Win32 Microsoft zaleca jego użycie wszędzie tam, gdzie potrzebne jest generowanie liczb losowych. Artykuł z Uniwersytetu Hebrajskiego z 2007 roku sugerował problemy z bezpieczeństwem w implementacji CryptGenRandom w systemie Windows 2000 (zakładając, że atakujący ma kontrolę nad maszyną). Microsoft później przyznał, że te same problemy występują w systemie Windows XP , ale nie w systemie Vista . Firma Microsoft wydała poprawkę dotyczącą błędu w systemie Windows XP z dodatkiem Service Pack 3 w połowie 2008 roku.
Tło
Win32 API obejmuje kompleksową obsługę bezpieczeństwa kryptograficznego, w tym natywną obsługę TLS (za pośrednictwem interfejsu API SCHANNEL ) i podpisywanie kodu . Możliwości te są oparte na natywnych bibliotekach systemu Windows do operacji kryptograficznych, takich jak generowanie kluczy RSA i AES . Biblioteki te z kolei opierają się na kryptograficznie bezpiecznym generatorze liczb pseudolosowych (CSPRNG). CryptGenRandom to standard CSPRNG dla środowiska programistycznego Win32.
Metoda operacji
usług kryptograficznych udostępniani przez firmę Microsoft współużytkują tę samą implementację CryptGenRandom, obecnie opartą na wewnętrznej funkcji o nazwie RtlGenRandom . Od 2007 roku opublikowano tylko ogólny zarys algorytmu :
[ RtlGenRandom ] generuje zgodnie z FIPS 186-2 dodatek 3.1 z SHA-1 jako funkcją G. I z entropią z:
- Bieżący identyfikator procesu (GetCurrentProcessID).
- Bieżący identyfikator wątku (GetCurrentThreadID).
- Liczba taktów od czasu rozruchu (GetTickCount).
- Bieżący czas (GetLocalTime).
- Różne bardzo precyzyjne liczniki wydajności (QueryPerformanceCounter).
- Skrót MD4 bloku środowiska użytkownika, który zawiera nazwę użytkownika, nazwę komputera i ścieżkę wyszukiwania. [...]
- Precyzyjne wewnętrzne liczniki procesora, takie jak RDTSC, RDMSR, RDPMC
[ pominięto: długie listy niskopoziomowych pól informacyjnych systemu i liczników wydajności ]
Bezpieczeństwo
Bezpieczeństwo CSPRNG kryptosystemu jest istotne, ponieważ jest źródłem materiału klucza dynamicznego. Klucze potrzebne „w locie”, takie jak klucze sesyjne AES TLS, które chronią HTTPS ze stronami banków, pochodzą z CSPRNG. Jeśli te liczby pseudolosowe są przewidywalne, przewidywalne są również klucze sesyjne. Ponieważ CryptGenRandom jest de facto standardem CSPRNG w środowiskach Win32, jego bezpieczeństwo ma kluczowe znaczenie dla użytkowników systemu Windows.
Specyfika algorytmu CryptGenRandom nie została oficjalnie opublikowana. Podobnie jak w przypadku każdego nieopublikowanego algorytmu generowania liczb losowych, może on być podatny na słabości teoretyczne, w tym stosowanie przestarzałych algorytmów i poleganie na entropii na kilku monotonicznie rosnących licznikach, które mogą być szacowane lub kontrolowane do pewnego stopnia przez atakującego z lokalnym dostępem do systemu.
Kryptoanaliza
Kryptoanaliza CryptGenRandom, opublikowana w listopadzie 2007 roku przez Leo Dorrendorfa i innych z Uniwersytetu Hebrajskiego w Jerozolimie i Uniwersytetu w Hajfie , wykazała znaczące słabości w implementacji algorytmu Windows 2000 .
Aby wykorzystać tę lukę, osoba atakująca musiałaby najpierw skompromitować program obsługujący generator liczb losowych. Słabości w dokumencie polegają na tym, że atakujący wysysa bity stanu z generatora. Atakujący, który byłby w stanie przeprowadzić ten atak, zazwyczaj byłby już w stanie pokonać dowolny generator liczb losowych (na przykład może po prostu obwąchać wyjścia generatora lub ustawić je w pamięci na znane wartości). Jednak zespół z Uniwersytetu Hebrajskiego zauważa, że atakujący musi tylko raz ukraść bity stanu, aby uporczywie naruszać zabezpieczenia instancji CryptGenRandom. Mogą również wykorzystać zebrane informacje do określenia losowych liczb, które zostały wygenerowane w przeszłości, potencjalnie kompromitujących informacji, takich jak numery kart kredytowych, które zostały już wysłane.
Ataki gazety opierają się na fakcie, że CryptGenRandom używa szyfru strumieniowego RC4 , który można uruchomić wstecz, gdy znany jest jego stan. Wykorzystują również fakt, że CryptGenRandom działa w trybie użytkownika , umożliwiając każdemu, kto uzyska dostęp do systemu operacyjnego na poziomie użytkownika, na przykład wykorzystując przepełnienie bufora , uzyskanie informacji o stanie CryptGenRandom dla tego procesu. Wreszcie, CryptGenRandom rzadko odświeża swoje ziarno z entropii . Problem ten pogarsza fakt, że każdy proces Win32 ma swoją własną instancję stanu CryptGenRandom; chociaż oznacza to, że kompromis jednego procesu nie naraża przejściowo każdego innego procesu, może również wydłużyć żywotność każdej udanej przerwy.
Ponieważ szczegóły algorytmu CryptGenRandom nie są publiczne, zespół Dorrendorfa wykorzystał narzędzia inżynierii wstecznej , aby zobaczyć, jak działa algorytm. Ich artykuł jest pierwszym opublikowanym zapisem działania kryptograficznego generatora liczb losowych systemu Windows [ potrzebne źródło ] .
wspólne kryteria
Systemy Windows 2000, XP i 2003 pomyślnie przeszły testy EAL4+, w tym implementacje CryptGenRandom() i FIPSGenRandom(). Dokumentacja Security Target jest dostępna na portalu Common Criteria i wskazuje zgodność z wymaganiami EAL4. W rezultacie można wyciągnąć kilka wniosków na temat bezpieczeństwa algorytmu; EAL4 mierzy produkty pod kątem najlepszych praktyk i określonych celów bezpieczeństwa, ale rzadko obejmuje dogłębną analizę kryptograficzną.
Walidacja FIPS
Firma Microsoft uzyskała walidację swoich implementacji RNG w następujących środowiskach:
- Implementacje Windows Vista RNG (certyfikat 321)
- Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (certyfikat 316)
- Windows 2003 Enhanced DSS and Diffie-Hellman Cryptographic Provider (dssenh.dll) (certyfikat 314)
- Moduł kryptograficzny trybu jądra systemu Windows 2003 (fips.sys) (certyfikat 313)
- Windows CE i Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certyfikat 292)
- Windows CE i Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certyfikat 286)
- Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (certyfikat 66)
Testy te są „zaprojektowane raczej w celu sprawdzenia zgodności z różnymi zatwierdzonymi specyfikacjami RNG niż zapewnienia miary bezpieczeństwa produktu. […] Dlatego walidacji nie należy interpretować jako oceny lub potwierdzenia ogólnego bezpieczeństwa produktu”. W rezultacie można wyciągnąć kilka wniosków na temat bezpieczeństwa algorytmu; Oceny FIPS niekoniecznie sprawdzają kod źródłowy lub oceniają sposób generowania nasion RNG.
Alternatywy
Poziom API
Deweloperzy systemu Windows mają kilka alternatywnych sposobów uzyskiwania dostępu do funkcji CryptGenRandom; te alternatywy odwołują się do tego samego algorytmu i mają te same cechy bezpieczeństwa, ale mogą mieć inne zalety.
Używając RtlGenRandom
W przeszłości zawsze mówiliśmy programistom, aby nie używali funkcji takich jak rand do generowania kluczy, identyfikatorów jednorazowych i haseł, zamiast tego powinni używać funkcji takich jak CryptGenRandom, która tworzy kryptograficznie bezpieczne liczby losowe. Problem z CryptGenRandom polega na tym, że musisz pobrać CryptoAPI (CryptAcquireContext i tym podobne), co jest w porządku, jeśli używasz innych funkcji kryptograficznych.
W domyślnej instalacji systemu Windows XP i nowszych CryptGenRandom wywołuje funkcję o nazwie ADVAPI32!RtlGenRandom, która nie wymaga ładowania wszystkich elementów CryptAPI. W rzeczywistości nowa Whidbey CRT, rand_s, wywołuje RtlGenRandom.
Korzystanie z RNGCryptoServiceProvider
Programiści korzystający z platformy .NET powinni używać klasy RNGCryptoServiceProvider.
Korzystanie z interfejsu API kryptografii: następna generacja (CNG)
CNG jest długoterminowym zamiennikiem przestarzałego Crypto API. Zapewnia równoważną funkcję BCryptGenRandom , a także dedykowane funkcje do generowania kluczy.
Języki programowania
- funkcja biblioteki Microsoft C++ rand_s używa RtlGenRandom i jest zalecana przez firmę Microsoft do bezpiecznych aplikacji.
- funkcja Pythona urandom w module os , który używa /dev / urandom w systemach typu Unix , wywołuje CryptGenRandom w systemach Windows.
- Dostawca Java JCA „SunMSCAPI” dostępny z dystrybucjami OpenJDK i Oracle środowiska JRE w systemie Windows zapewnia implementację SecureRandom o nazwie algorytmu Windows-PRNG. Ta klasa przekazuje wszystkie zapytania dotyczące bajtów losowych lub początkowych, a także ustawia dodatkowe bajty początkowe na natywny CryptGenRandom.
Zobacz też
- Wywołania systemowe dostarczające entropię - przybliżony odpowiednik CryptGenRandom w OpenBSD i jądrze Linuksa
- /dev/random – źródło losowości w większości jąder uniksopodobnych
- Atak generatora liczb losowych