CryptGenRandom

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 29 decembrie 2019; verificările necesită 2 modificări .

CryptGenRandom este o funcție de generator de numere pseudoaleatoare, sigură  criptografic . Este inclus în Interfața de programare a aplicațiilor criptografice a Microsoft . Microsoft recomandă utilizarea acestuia în toate programele Win32 care necesită generarea de numere aleatorii. În 2007, o lucrare de la Universitatea Ebraică a evidențiat probleme în implementarea CryptGenRandom sub Windows 2000 (presupunând că criptoanalistul a avut acces la mașină). Mai târziu, Microsoft a stabilit că aceste probleme au fost prezente și în Windows XP , iar în Windows Vista nu au mai fost observate. Aceste erori au fost remediate odată cu lansarea Windows XP Service Pack 3 la mijlocul anului 2008. [unu]

Fundal

API-ul Win32 acceptă pe deplin metode de protecție împotriva atacurilor criptografice, inclusiv TLS și semnătura digitală . Acest suport se bazează pe biblioteci Windows native pentru sarcini criptografice, cum ar fi generarea de chei pentru algoritmii RSA sau AES . Aceste biblioteci folosesc un generator de numere pseudo-aleatoare puternic criptografic. CryptGenRandom este generatorul standard de acest tip pentru mediul de dezvoltare Win32.

Algoritm

Microsoft folosește o implementare a CryptGenRandom bazată pe o funcție încorporată „RtlGenRandom”. [2] În 2007, a fost publicată doar o schiță generală a funcționării acestui algoritm:

[ RtlGenRandom ] funcționează așa cum este specificat în FIPS 186-2 Anexa 3.1 folosind SHA-1 ca funcție G. Sursele de entropie sunt:

[omis: listă lungă de articole și contoare de informații de nivel scăzut] Sursa: Writing Secure Code, Ediția a II-a. isbn=0-7356-1722-8  (engleză) .

Securitate

Stabilitatea criptografică a generatoarelor de numere aleatoare este foarte importantă, deoarece astfel de generatori sunt direct implicați în crearea cheilor dinamice. Cheile care sunt necesare din mers (de exemplu, cheile de sesiune AES TLS pentru a securiza sesiunile HTTPS pe site-urile bancare) sunt de asemenea calculate folosind acești generatori. Astfel, predictibilitatea comportamentului generatoarelor vă permite direct să preziceți valorile cheilor generate. Deoarece CryptGenRandom este, de fapt, generatorul standard în mediul Win32, securitatea sa este critică pentru utilizatorii Windows.

Caracteristicile algoritmului CryptGenRandom nu au fost publicate oficial. Ca orice algoritm nepublicat de generare de numere aleatoare, CryptGenRandom poate fi teoretic vulnerabil datorită utilizării unor algoritmi învechiți sau, de exemplu, utilizării mai multor contoare de entropie monotoni care pot fi folosite de un criptoanalist cu acces la sistem.

Criptanaliză (Universitatea Ebraică)

În 2007, Leo Dorrendorf, împreună cu un grup de oameni de știință de la Universitatea Ebraică și Universitatea din Haifa, au publicat rezultatele criptoanalizei CryptGenRandom , dezvăluind vulnerabilități semnificative în implementarea algoritmului sub Windows 2000. [3]

Pentru a exploata aceste vulnerabilități, un atacator ar trebui să compromită un program care rulează care utilizează acest generator de numere aleatorii. Toate deficiențele CryptGenRandom depind de sifonarea biților de stare a generatorului. Dacă un atacator este capabil să efectueze acest atac, atunci cu un grad ridicat de probabilitate poate sparge orice generator de numere aleatoare (de exemplu, el poate pur și simplu să repete valorile de ieșire ale generatorului sau să le corecteze direct în memorie prin valori deja cunoscute). Cu toate acestea, oamenii de știință de la Universitatea Ebraică au descoperit că un criptoanalist trebuie să cunoască o singură dată biții de stare pentru a da o lovitură gravă la adresa securității CryptGenRandom. Un atacator poate folosi apoi informațiile biților de stare pentru a prelua numerele generate de algoritm în timpul rulărilor anterioare și, astfel, poate obține acces la informații potențial sensibile, cum ar fi numerele de card de credit deja trimise. Acest lucru este posibil deoarece CryptGenRandom folosește codul de flux RC4 , care este reversibil dacă există cel puțin o stare cunoscută. S-a observat că CryptGenRandom rulează în modul utilizator , permițând oricărei persoane cu acces la nivel de utilizator la sistemul de operare să obțină informații despre starea CryptGenRandom pentru acel proces, de exemplu folosind o depășire a tamponului . În cele din urmă, CryptGenRandom actualizează rareori sursele pentru a calcula entropia. Problema este exacerbată de faptul că fiecare proces Win32 are propria instanță de stări CryptGenRandom. O astfel de independență a proceselor nu face decât să mărească timpul de utilizare neautorizată a sistemului după un hack cu succes. Analiza efectuată de un grup de oameni de știință condus de Dorrendorf este, de fapt, prima lucrare publicată despre funcționarea unui generator de numere aleatoare criptografic puternic sub Windows.

Criterii comune

Windows 2000, XP și Windows 2003 , inclusiv implementările CryptGenRandom() și FIPSGenRandom(), au trecut cu succes testele EAL4+. Verificarea de securitate a algoritmilor a relevat conformitatea deplină cu standardele EAL4 cerute, documentația este disponibilă pe portalul Common Criteria . Din aceasta putem concluziona că sistemul de verificare dovedit EAL4 funcționează bine în majoritatea cazurilor, dar nu include o criptoanaliza mai profundă.

Verificări FIPS

Următoarele implementări ale generatoarelor de numere aleatoare Microsoft au fost testate cu succes: Windows Vista (Certificat 321) Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (Certificat 316) Windows 2003 Enhanced DSS și Diffie-Hellman Cryptographic Provider (dssenh.dll) (Cryptographic Provider) 314) Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (Certificat 313) Windows CE și Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (Certificat 292) Windows CE și Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (Certificat 286) ) Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (Certificat 66)

Aceste teste sunt „destinate să verifice conformitatea cu diverse specificații aprobate ale generatoarelor de numere aleatorii, și nu să evalueze nivelul de siguranță a produsului. […] Prin urmare, verificarea nu ar trebui interpretată ca o evaluare sau aprobare a siguranței generale a produsului.” Din aceasta putem concluziona că astfel de verificări pot ocoli unele caracteristici ale generatoarelor de numere aleatorii (de exemplu, utilizate de un grup de oameni de știință de la Universitatea Ebraică). [patru]

Cod sursă

Există o serie de utilități pentru accesarea codului sursă al programelor Microsoft (de obicei protejate de EULA), dar nu este posibil să partajați chiar acest cod publicului.

Dezasamblare

Bibliotecile pentru platformele Windows pot fi dezasamblate folosind instrumente precum IDA Pro și objdump . De asemenea, spre deosebire de majoritatea furnizorilor de software cu sursă închisă, Microsoft oferă simboluri de depanare pentru binarele sale. Drept urmare, aceste fișiere sunt adesea evaluate de practici terțe. Atacul lui Dorrendorf menționat mai sus s-a bazat tocmai pe astfel de confruntări.

Mijloace alternative

Nivel API

Dezvoltatorii Windows au mai multe mijloace alternative de accesare a funcțiilor CryptGenRandom. Aceste opțiuni invocă același algoritm, au același nivel de securitate, dar pot avea și alte beneficii.

Folosind RtlGenRandom

„Din punct de vedere istoric, le-am spus întotdeauna dezvoltatorilor să nu folosească funcții precum rand() pentru a genera chei și parole. Este mult mai bine să folosiți funcții precum CryptGenRandom, care sunt generatoare de numere aleatoare puternice din punct de vedere criptografic. Problema cu utilizarea CryptGenRandom este legată de necesitatea de a conecta CryptoAPI (CryptAcquireContext și altele asemenea), care, totuși, este acceptabilă dacă utilizați deja alte funcții de la CryptoAPI. În mod implicit, pe Windows XP, CryptGenRandom apelează funcția ADVAPI32!RtlGenRandom, care nu necesită ca întregul set CryptAPI să fie inclus. De fapt, noua funcție Whidbey CRT rand_s() apelează RtlGenRandom. [5]

Folosind RNGCryptoServiceProvider

Programatorii .Net ar trebui să utilizeze clasa RNGCryptoServiceProvider. [6]

Limbaje de programare

Vezi și

Note

  1. Microsoft confirmă că XP conține o eroare a generatorului de numere aleatorii Arhivat la 22 iunie 2008.
  2. Funcția RtlGenRandom (Windows) . Consultat la 22 decembrie 2011. Arhivat din original la 14 octombrie 2008.
  3. Dorrendorf, Leu; Zvi Gutterman, Benny Pinkas. Criptanaliză a generatorului de numere aleatorii al sistemului de operare Windows (pdf). Arhivat din original pe 6 septembrie 2012.
  4. Copie arhivată (link nu este disponibil) . Data accesului: 22 decembrie 2011. Arhivat din original la 26 ianuarie 2007. 
  5. Jurnalul web al lui Michael Howard: Număr aleatoriu securizat criptografic pe Windows fără a utiliza CryptoAPI . Consultat la 22 decembrie 2011. Arhivat din original pe 28 decembrie 2005.
  6. Redirecționare pierdută Arhivată din original pe 8 septembrie 2006.
  7. http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Arhivat 9 aprilie 2016 la Wayback Machine Visual C++ Developer Center, rand_s
  8. Copie arhivată (link nu este disponibil) . Consultat la 22 decembrie 2011. Arhivat din original la 14 septembrie 2008.   Referință bibliotecă Python, modul OS

Link -uri