CryptGenRandom

CryptGenRandom är en föråldrad kryptografiskt säker pseudoslumptalsgeneratorfunktion som ingår i Microsoft CryptoAPI . I Win32- program rekommenderar Microsoft att det används överallt där det behövs generering av slumptal. En artikel från 2007 från Hebrew University antydde säkerhetsproblem i Windows 2000- implementeringen av CryptGenRandom (förutsatt att angriparen har kontroll över maskinen). Microsoft erkände senare att samma problem finns i Windows XP , men inte i Vista . Microsoft släppte en fix för buggen med Windows XP Service Pack 3 i mitten av 2008.

Bakgrund

Win32 API inkluderar omfattande stöd för kryptografisk säkerhet, inklusive inbyggt TLS- stöd (via SCHANNEL API ) och kodsignering . Dessa funktioner är byggda på inbyggda Windows-bibliotek för kryptografiska operationer, såsom RSA- och AES- nyckelgenerering. Dessa bibliotek förlitar sig i sin tur på en kryptografiskt säker pseudoslumptalsgenerator ( CSPRNG). CryptGenRandom är standard-CSPRNG för Win32-programmeringsmiljön.

Arbetssätt

Microsoft-tillhandahållna kryptografileverantörer delar samma implementering av CryptGenRandom, för närvarande baserad på en intern funktion som kallas RtlGenRandom . Endast en allmän översikt över algoritmen hade publicerats från och med 2007:

[ RtlGenRandom ] genererar enligt FIPS 186-2 bilaga 3.1 med SHA-1 som G-funktion. Och med entropi från:

  • Det aktuella process-ID (GetCurrentProcessID).
  • Aktuellt tråd-ID (GetCurrentThreadID).
  • Antalet tick sedan starttid (GetTickCount).
  • Aktuell tid (GetLocalTime).
  • Olika högprecisionsprestandaräknare (QueryPerformanceCounter).
  • En MD4- hash av användarens miljöblock, som inkluderar användarnamn, datornamn och sökväg. [...]
  • Interna CPU-räknare med hög precision, såsom RDTSC, RDMSR, RDPMC

[ utelämnad: långa listor med systeminformationsfält på låg nivå och prestandaräknare ]

säkerhet

Säkerheten för ett kryptosystems CSPRNG är betydande eftersom det är ursprunget för dynamiskt nyckelmaterial. Nycklar som behövs "i farten", som AES TLS-sessionsnycklar som skyddar HTTPS- sessioner med bankwebbplatser, kommer från CSPRNG. Om dessa pseudoslumptal är förutsägbara är sessionsnycklar också förutsägbara. Eftersom CryptGenRandom är de facto-standarden CSPRNG i Win32-miljöer, är dess säkerhet avgörande för Windows-användare.

Detaljerna för CryptGenRandoms algoritm har inte publicerats officiellt. Som med alla opublicerade slumptalsgenereringsalgoritmer kan den vara mottaglig för teoretiska svagheter inklusive användningen av föråldrade algoritmer och ett beroende av entropiinsamling på flera monotont ökande räknare som kan uppskattas eller kontrolleras i en omfattning av en angripare med lokal åtkomst till systemet.

Kryptanalys

En kryptoanalys av CryptGenRandom, publicerad i november 2007 av Leo Dorrendorf och andra från Hebrew University of Jerusalem och University of Haifa , fann betydande svagheter i Windows 2000- implementeringen av algoritmen.

För att dra fördel av sårbarheten måste en angripare först äventyra programmet som kör slumptalsgeneratorn. Svagheterna i tidningen beror alla på att en angripare tar ut tillståndsbitarna ur generatorn. En angripare som är i stånd att utföra denna attack skulle vanligtvis redan vara i en position att besegra alla slumptalsgeneratorer (till exempel kan de helt enkelt sniffa generatorns utgångar eller fixa dem i minnet till kända värden). Det hebreiska universitetets team noterar dock att en angripare bara behöver stjäla tillståndsbitarna en gång för att ständigt bryta mot säkerheten för en CryptGenRandom-instans. De kan också använda informationen de samlar in för att fastställa tidigare slumpmässiga siffror som har genererats, vilket potentiellt äventyrar information, som kreditkortsnummer, som redan har skickats.

Tidningens attacker är baserade på det faktum att CryptGenRandom använder strömchifferet RC4 , som kan köras baklänges när dess tillstånd är känt. De utnyttjar också det faktum att CryptGenRandom körs i användarläge , vilket gör att alla som får tillgång till operativsystemet på användarnivå, till exempel genom att utnyttja ett buffertspill , kan få CryptGenRandoms tillståndsinformation för den processen. Slutligen uppdaterar CryptGenRandom sitt frö från entropi sällan. Detta problem förvärras av det faktum att varje Win32-process har sin egen instans av CryptGenRandom-tillståndet; även om detta innebär att en kompromiss av en process inte transitivt äventyrar alla andra processer, kan det också öka livslängden på ett framgångsrikt avbrott.

Eftersom detaljerna i CryptGenRandom-algoritmen inte är offentliga, använde Dorrendorfs team reverse engineering- verktyg för att urskilja hur algoritmen fungerar. Deras uppsats är det första publicerade dokumentet om hur Windows kryptografiska slumptalsgenerator fungerar [ citat behövs ] .

Vanliga kriterier

Windows 2000, XP och 2003 har alla framgångsrikt genomgått EAL4+-utvärderingar, inklusive implementeringarna CryptGenRandom() och FIPSGenRandom(). Säkerhetsmåldokumentationen finns tillgänglig på Common Criteria-portalen och indikerar överensstämmelse med EAL4-kraven. Få slutsatser kan dras om algoritmens säkerhet som ett resultat; EAL4 mäter produkter mot bästa praxis och uttalade säkerhetsmål, men involverar sällan djupgående kryptoanalys.

FIPS-validering

Microsoft har erhållit validering av sina RNG-implementationer i följande miljöer:

  • Windows Vista RNG-implementationer (certifikat 321)
  • Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (certifikat 316)
  • Windows 2003 Enhanced DSS och Diffie-Hellman Cryptographic Provider (dssenh.dll) (certifikat 314)
  • Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (certifikat 313)
  • Windows CE och Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certifikat 292)
  • Windows CE och Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (certifikat 286)
  • Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (certifikat 66)

Dessa tester är "designade för att testa överensstämmelse med de olika godkända RNG-specifikationerna snarare än att ge ett mått på en produkts säkerhet. [...] Validering bör därför inte tolkas som en utvärdering eller ett stöd för den övergripande produktsäkerheten." Få slutsatser kan dras om algoritmens säkerhet som ett resultat; FIPS-utvärderingar inspekterar inte nödvändigtvis källkoden eller utvärderar hur RNG-frön genereras.

Alternativ

API-nivå

Windows-utvecklare har flera alternativa sätt att komma åt CryptGenRandom-funktionen; dessa alternativ åberopar samma algoritm och delar samma säkerhetsegenskaper, men kan ha andra fördelar.

Använder RtlGenRandom

Historiskt har vi alltid sagt till utvecklare att inte använda funktioner som rand för att generera nycklar, nonces och lösenord, snarare borde de använda funktioner som CryptGenRandom, som skapar kryptografiskt säkra slumptal. Problemet med CryptGenRandom är att du måste dra in CryptoAPI (CryptAcquireContext och sådant) vilket är bra om du använder andra kryptofunktioner.

På en standardinstallation av Windows XP och senare anropar CryptGenRandom en funktion som heter ADVAPI32!RtlGenRandom, som inte kräver att du laddar alla CryptAPI-grejer. Faktum är att den nya Whidbey CRT-funktionen, rand_s, anropar RtlGenRandom.

Använder RNGCryptoServiceProvider

Programmerare som använder .NET bör använda RNGCryptoServiceProvider Class.

Använda Cryptography API: Next Generation (CNG)

CNG är en långsiktig ersättning för det föråldrade Crypto API. Den tillhandahåller en likvärdig funktion BCryptGenRandom samt dedikerade funktioner för nyckelgenerering.

Programmeringsspråk

  • Microsoft C++-biblioteksfunktionen rand_s använder RtlGenRandom och rekommenderas av Microsoft för säkra applikationer.
  • Python - funktionen urandom i OS -modulen, som använder /dev/urandom Unix-liknande system, anropar CryptGenRandom på Windows-system.
  • Java JCA-leverantören "SunMSCAPI" tillgänglig med OpenJDK- och Oracle - distributioner av JRE på Windows tillhandahåller en SecureRandom-implementering med algoritmnamnet Windows-PRNG. Den här klassen vidarebefordrar alla frågor för slumpmässiga eller seed-bytes samt ställer in ytterligare seed-byte till inbyggda CryptGenRandom.

Se även

externa länkar