CryptGenRandom

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 29 december 2019; kontroller kräver 2 redigeringar .

CryptGenRandom är en kryptografiskt säker pseudo-  slumptalsgeneratorfunktion . Det ingår i Microsofts Cryptographic Application Programming Interface . Microsoft rekommenderar att du använder det i alla Win32- program som kräver generering av slumptal. 2007 påpekade ett dokument från Hebrew University problem med implementeringen av CryptGenRandom under Windows 2000 (förutsatt att kryptoanalytikern hade tillgång till maskinen). Senare fastställde Microsoft att dessa problem även fanns i Windows XP , och i Windows Vista observerades de inte längre. Dessa buggar fixades med lanseringen av Windows XP Service Pack 3 i mitten av 2008. [ett]

Bakgrund

Win32 API stöder fullt ut metoder för att skydda mot kryptografiska attacker, inklusive TLS och digital signatur . Detta stöd är baserat på inbyggda Windows-bibliotek för kryptografiska uppgifter som nyckelgenerering för RSA- eller AES- algoritmer . Dessa bibliotek använder en kryptografiskt stark pseudo-slumptalsgenerator. CryptGenRandom är standardgeneratorn av detta slag för utvecklingsmiljön Win32.

Algoritm

Microsoft använder en implementering av CryptGenRandom baserad på någon inbyggd "RtlGenRandom"-funktion. [2] Under 2007 publicerades endast en allmän översikt över funktionen av denna algoritm:

[ RtlGenRandom ] fungerar som specificerat i FIPS 186-2 Appendix 3.1 med SHA-1 som G-funktion. Källorna för entropi är:

[utelämnad: lång lista med informationsobjekt och räknare på låg nivå] Källa: Writing Secure Code, andra upplagan. isbn=0-7356-1722-8  (engelska) .

Säkerhet

Den kryptografiska stabiliteten hos slumptalsgeneratorer är mycket viktig, eftersom sådana generatorer är direkt involverade i skapandet av dynamiska nycklar. Nycklar som behövs i farten (till exempel AES TLS-sessionsnycklar för att säkra HTTPS- sessioner på bankwebbplatser) beräknas också med dessa generatorer. Således gör förutsägbarheten av generatorernas beteende direkt att du kan förutsäga värdena för de genererade nycklarna. Eftersom CryptGenRandom faktiskt är standardgeneratorn i Win32-miljön, är dess säkerhet avgörande för Windows-användare.

Funktioner i CryptGenRandom-algoritmen har inte publicerats officiellt. Liksom alla opublicerade slumptalsgenereringsalgoritmer kan CryptGenRandom vara teoretiskt sårbara på grund av användningen av föråldrade algoritmer eller till exempel användningen av flera monotona entropiräknare som kan användas av en kryptoanalytiker med tillgång till systemet.

Cryptanalysis (Hebrew University)

2007 publicerade Leo Dorrendorf, tillsammans med en grupp forskare från Hebrew University och University of Haifa, resultaten av CryptGenRandom cryptanalysis , som avslöjade betydande sårbarheter i implementeringen av algoritmen under Windows 2000. [3]

För att utnyttja dessa sårbarheter skulle en angripare behöva kompromissa med ett program som körs som använder denna slumptalsgenerator. Alla brister i CryptGenRandom beror på sifoneringen av generatortillståndsbitarna. Om en angripare kan utföra denna attack kan han med en hög grad av sannolikhet bryta vilken slumptalsgenerator som helst (till exempel kan han helt enkelt upprepa generatorns utdatavärden eller korrigera dem direkt i minnet med redan kända värden). Forskare från Hebrew University fann dock att en kryptoanalytiker bara behöver känna till statusbitarna en gång för att kunna utsätta ett allvarligt slag mot säkerheten för CryptGenRandom. En angripare kan sedan använda statusbitinformationen för att hämta siffrorna som genererats av algoritmen under tidigare körningar, och därigenom få tillgång till potentiellt känslig information, såsom kreditkortsnummer som redan skickats in. Detta är möjligt eftersom CryptGenRandom använder RC4 -strömchifferet , som är reversibelt om det finns minst ett känt tillstånd. CryptGenRandom har observerats köra i användarläge , vilket gör att alla med åtkomst till operativsystemet på användarnivå kan få information om tillståndet för CryptGenRandom för den processen, till exempel genom att använda ett buffertspill . Slutligen uppdaterar CryptGenRandom sällan källor för att beräkna entropi. Problemet förvärras av det faktum att varje Win32-process har sin egen instans av CryptGenRandom-tillstånd. Sådant oberoende av processer ökar bara tiden för obehörig användning av systemet efter ett lyckat hack. Analysen av en grupp forskare under ledning av Dorrendorf är i själva verket det första publicerade arbetet om hur en kryptografiskt stark slumptalsgenerator fungerar under Windows.

Common Criteria

Windows 2000, XP och Windows 2003 , inklusive implementeringarna CryptGenRandom() och FIPSGenRandom(), klarade EAL4+-testerna framgångsrikt. Säkerhetskontrollen av algoritmerna avslöjade full överensstämmelse med de erforderliga EAL4-standarderna, dokumentationen finns tillgänglig på Common Criteria- portalen . Av detta kan vi dra slutsatsen att det beprövade EAL4-verifieringssystemet fungerar bra i de flesta fall, men inte inkluderar djupare kryptoanalys.

FIPS kontrollerar

Följande implementeringar av Microsofts slumptalsgeneratorer har testats framgångsrikt: Windows Vista (Certificate 321) Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (Certificate 316) Windows 2003 Enhanced DSS och Diffie-Hellman Cryptographic Provider (dssenh.dll) (Certificate) 314) Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (Certificate 313) Windows CE och Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (Certificate 292) Windows CE och Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (Certificate 286) ) Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (Certificate 66)

Dessa tester är "avsedda att verifiera överensstämmelse med olika godkända specifikationer för slumptalsgeneratorer, och inte att bedöma nivån på produktsäkerhet. […] Därför bör verifiering inte tolkas som en bedömning eller godkännande av produktens övergripande säkerhet.” Av detta kan vi dra slutsatsen att sådana kontroller kan kringgå vissa funktioner hos slumptalsgeneratorer (till exempel som används av en grupp forskare från hebreiska universitetet). [fyra]

Källkod

Det finns ett antal verktyg för att komma åt källkoden för Microsoft-program (vanligtvis skyddad av EULA), men det är inte möjligt att dela just denna kod med allmänheten.

Demontering

Bibliotek för Windows-plattformar kan tas isär med hjälp av verktyg som IDA Pro och objdump . Till skillnad från de flesta programvaruleverantörer med sluten källkod tillhandahåller Microsoft felsökningssymboler för sina binärer. Som ett resultat utvärderas dessa filer ofta av tredje parts praxis. Dorrendorfs attack som nämnts ovan baserades just på sådana uppgörelser.

Alternativa medel

API-nivå

Windows-utvecklare har flera alternativa sätt att komma åt CryptGenRandom-funktioner. Dessa alternativ åberopar samma algoritm, har samma säkerhetsnivå, men kan också ha andra fördelar.

Använda RtlGenRandom

"Historiskt har vi alltid sagt till utvecklare att inte använda funktioner som rand() för att generera nycklar och lösenord. Det är mycket bättre att använda funktioner som CryptGenRandom, som är kryptografiskt starka slumptalsgeneratorer. Problemet med att använda CryptGenRandom är relaterat till behovet av att ansluta CryptoAPI (CryptAcquireContext och liknande), vilket dock är acceptabelt om du redan använder andra funktioner från CryptoAPI. Som standard på Windows XP anropar CryptGenRandom funktionen ADVAPI32!RtlGenRandom, vilket inte kräver att hela CryptAPI-uppsättningen inkluderas. Faktum är att den nya Whidbey CRT-funktionen rand_s() anropar RtlGenRandom. [5]

Använda RNGCryptoServiceProvider

.Net- programmerare bör använda klassen RNGCryptoServiceProvider. [6]

Programmeringsspråk

  • det rekommenderas att använda rand_s-funktionen från Microsoft C++-biblioteket (baserat på RtlGenRandom). [7]
  • Python os.urandom()- funktionen på Windows -operativsystem anropar CryptGenRandom. [åtta]

Se även

Anteckningar

  1. Microsoft bekräftar att XP innehåller bugg för slumptalsgenerator Arkiverad 22 juni 2008.
  2. RtlGenRandom Function (Windows) . Hämtad 22 december 2011. Arkiverad från originalet 14 oktober 2008.
  3. Dorrendorf, Leo; Zvi Gutterman, Benny Pinkas. Krypteringsanalys av slumptalsgeneratorn i Windows operativsystem (pdf). Arkiverad från originalet den 6 september 2012.
  4. Arkiverad kopia (länk ej tillgänglig) . Datum för åtkomst: 22 december 2011. Arkiverad från originalet den 26 januari 2007. 
  5. Michael Howards webblogg: Kryptografiskt säkert slumptal på Windows utan att använda CryptoAPI . Hämtad 22 december 2011. Arkiverad från originalet 28 december 2005.
  6. Förlorad omdirigering Arkiverad från originalet den 8 september 2006.
  7. http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Arkiverad 9 april 2016 på Wayback Machine Visual C++ Developer Center, rand_s
  8. Arkiverad kopia (länk ej tillgänglig) . Hämtad 22 december 2011. Arkiverad från originalet 14 september 2008.   Python Library Reference, OS-modul

Länkar