CryptGenRandom

CryptGenRandom — функція криптографічно стійкого генератора псевдовипадкових чисел. Вона включена в Microsoft's Cryptographic Application Programming Interface. Microsoft рекомендує використовувати її у всіх Win32-додатках, де потрібна генерація випадкових чисел. У 2007 році в роботі з Єврейського університету були вказані проблеми в реалізації CryptGenRandom на операційній системі Windows 2000 (припускаючи наявність доступу до машини у криптоаналітика). Пізніше в Microsoft встановили, що ці проблеми також присутні і в Windows XP, проблема була повністю вирішена у Windows Vista. Ці помилки були виправлені з виходом Windows XP Service Pack 3 в середині 2008 року.[1]

Передумови

[ред. | ред. код]

Win32 API повністю підтримує методи захисту від криптографічних атак, включаючи TLS і цифровий підпис. Ця підтримка заснована на рідних для Windows бібліотеках для вирішення таких криптографічних завдань, як генерація ключів для алгоритму RSA або AES. Ці бібліотеки використовують криптографічно стійкий генератор псевдовипадкових чисел. CryptGenRandom є стандартним генератором подібного роду для середовища розробки під Win32.

Алгоритм

[ред. | ред. код]

Microsoft використовують одну реалізацію CryptGenRandom, засновану на деякій вбудованій функції «RtlGenRandom».[2] В 2007 році був оприлюднений лише загальний начерк роботи цього алгоритму:

[RtlGenRandom] працює, як зазначено в FIPS 186-2, додаток 3.1, використовуючи SHA-1 як G-функцію. Джерелами для ентропії є:

  • ID поточного процесу.
  • ID поточної гілки виконання.
  • Число тактів з моменту останнього завантаження.
  • Поточний час.
  • Різні високоточні лічильники.
  • Хеш-функції MD4 від персональних даних користувача, таких як логін, ім'я комп'ютера, та ін.
  • Високоточні внутрішньопроцесорні лічильники, такі, як RDTSC, RDMSR, RDPMC.

[опущено: довгий список основних інформаційних елементів і лічильників] Джерело: Writing Secure Code, Second Edition. isbn=0-7356-1722-8.

Безпека

[ред. | ред. код]

Криптографічна стійкість генераторів випадкових чисел дуже важлива, оскільки такі генератори безпосередньо беруть участь у створенні динамічних ключів. Ключі, потреба в яких виникає «на льоту» (наприклад, сеансові ключі AES TLS для захисту HTTPS сесій на банківських сайтах), також обчислюються з допомогою цих генераторів. Таким чином передбачуваність поведінки генераторів безпосередньо дозволяє предбачити значення створюваних ключів. Оскільки CryptGenRandom є, фактично, стандартним генератором в середовищі Win32, то його захищеність критично важлива для користувачів Windows.

Особливості алгоритму CryptGenRandom офіційно не опубліковані. Як і будь-який неопублікований алгоритм генерації випадкових чисел, CryptGenRandom може бути теоретично вразливим через використання застарілих алгоритмів або, наприклад, використання декількох монотонних лічильників для підрахунку ентропії, які можуть бути використані криптоаналітиком при наявності доступу до системи.

Криптоаналіз (Єврейський університет)

[ред. | ред. код]

У 2007 році Лео Дорредорф спільно з групою вчених з Єврейського університету і Хайфського університету опублікував результати криптоаналізу CryptGenRandom, виявивши значні уразливості в реалізації алгоритму під Windows 2000.[3]

Для того, щоб скористатися цими уразливостями, зловмисникові необхідно здійснити атаку на запущену програму, яка використовує цей генератор випадкових чисел. Всі недоліки CryptGenRandom залежать від перетікання бітів станів генератора. Якщо зловмисник в змозі виконати цю атаку, то з великою часткою ймовірності він може зламати будь-який генератор випадкових чисел (наприклад, він може просто повторювати вихідні значення генератора або виправляти їх безпосередньо в пам'яті на вже відомі величини). Тим не менше вчені з Єврейського університету встановили, що криптоаналітику необхідно всього лише один раз дізнатися біти станів для того, щоб завдати серйозного удару по безпеці CryptGenRandom. Після цього зловмисник може використовувати інформацію про біти станів для отримання чисел, згенерованих алгоритмом під час попередніх запусків, і тим самим отримати доступ до потенційно важливої інформації, наприклад, до вже відправлених номерів кредитних карт. Це можливо у зв'язку з тим, що CryptGenRandom використовують потоковий шифр RC4, який є оборотним в разі хоча б одного відомого стану.

Було помічено, що CryptGenRandom працює в режимі користувача, що дозволяє будь-кому, хто має доступ до операційної системи на рівні користувача, отримати інформацію про стан CryptGenRandom для цього процесу, наприклад, використовуючи переповнення буфера. Нарешті, CryptGenRandom досить рідко оновлює джерела для обчислення ентропії. Проблема посилюється тим фактом, що кожен Win32-процес має свій власний примірник станів CryptGenRandom. Така незалежність процесів тільки збільшує час несанкціонованого використання системи після успішного злому. Аналіз групи вчених під керівництвом Дорредорфа по суті є першою опублікованою роботою про функціонування криптостойкого генератора випадкових чисел під Windows.

Windows 2000, XP і Windows 2003, включаючи реалізації CryptGenRandom() і FIPSGenRandom(), успішно пройшли тести EAL4+. Перевірка безпеки алгоритмів виявила повну відповідність необхідним нормам EAL4, документація доступна на порталі Common Criteria. Звідси можна зробити висновок про те, що система повірки EAL4 працює добре в більшості випадків, але не включає в себе більш глибокий криптоаналіз.

FIPS-перевірки

[ред. | ред. код]

Наступні реалізації генераторів випадкових чисел Microsoft були успішно протестовані: Windows Vista (сертифікат 321), Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (сертифікат 316), Windows 2003 Enhanced DSS and Diffie-Hellman Cryptographic Provider (dssenh.dll) (сертифікат 314), Windows 2003 Kernel Mode Cryptographic Module (fips.sys) (сертифікат 313), Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертифікат 292), Windows CE and Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертифікат 286), Windows CE Enhanced Cryptographic Provider (rsaenh.dll) (сертифікат 66)

Ці тести призначені для перевірки відповідності різним затвердженим специфікаціям генераторів випадкових чисел, а не для оцінки рівня безпеки продукції. Таким чином, перевірка не повинна бути витлумачена як оцінка чи схвалення загальної безпеки продукції. Звідси можна зробити висновки про те, що такі перевірки можуть оминати деякі особливості генераторів випадкових чисел (наприклад, використовувані групою вчених з Єврейського університету).[4]

Вихідний код

[ред. | ред. код]

Існує цілий ряд утиліт для отримання доступу до вихідного коду програм компанії Microsoft (зазвичай захищені EULA), але неможливо поділитися цим самим кодом із широким загалом людей.

Розбирання (Disassembly)

[ред. | ред. код]

Бібліотеки для платформ Windows можна розібрати за допомогою таких інструментів, як IDA Pro і objdump. Крім того, на відміну від більшості постачальників програм з закритим вихідним кодом, Microsoft надає символи відлагодження для своїх бінарних файлів. В результаті ці файли часто оцінюють сторонні практики. Згадана вище атака Дорредорфа базувалась саме на таких розборках.

Альтернативні засоби

[ред. | ред. код]

API-рівень

[ред. | ред. код]

Розробники Windows мають декілька альтернативних засобів доступу до функцій CryptGenRandom. Ці варіанти викликають той же алгоритм, мають той же рівень безпеки, але, можливо, мають і інші переваги.

Використання RtlGenRandom

[ред. | ред. код]

«Історично, ми завжди говорили розробникам не використовувати такі функції, як rand(), для генерації ключів і паролів. Набагато краще використовувати функції CryptGenRandom, які є криптографічно стійкими генераторами випадкових чисел. Проблема з використанням саме CryptGenRandom пов'язана з необхідністю підключення CryptoAPI (CryptAcquireContext і подібні), що, втім, прийнятно, якщо інші функції CryptoAPI вами вже використовуються. За умовчанням в Windows XP CryptGenRandom викликає функцію ADVAPI32!RtlGenRandom, яка не вимагає підключення всього набору CryptAPI. Насправді нова функція Whidbey CRT rand_s() викликає RtlGenRandom.[5]

Використання RNGCryptoServiceProvider

[ред. | ред. код]

Програмісти, які користуються .Net, повинні використовувати клас RNGCryptoServiceProvider.[6]

Мови програмування

[ред. | ред. код]
  • рекомендується використовувати функцію rand_s з бібліотеки Microsoft З++ (заснована на RtlGenRandom).[7]
  • функція os.urandom() [Архівовано 17 лютого 2018 у Wayback Machine.] мови Python в операційних системах Windows викликає CryptGenRandom.[8]

Дивись також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Microsoft confirms that XP contains random number generator bug. Архів оригіналу за 22 червня 2008. Процитовано 25 квітня 2018. [Архівовано 2008-06-22 у Wayback Machine.]
  2. RtlGenRandom Function (Windows). Архів оригіналу за 14 жовтня 2008. Процитовано 25 квітня 2018.
  3. Dorrendorf, Leo. Cryptanalysis of the Random Number Generator of the Windows Operating System (PDF). Архів оригіналу (pdf) за 6 вересня 2012.
  4. Архівована копія (PDF). Архів оригіналу (PDF) за 26 січня 2007. Процитовано 25 квітня 2018.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання) [Архівовано 2007-01-26 у Wayback Machine.]
  5. Michael Howard’s Web Log : Cryptographically Secure Random number on Windows without using CryptoAPI. Архів оригіналу за 28 грудня 2005. Процитовано 25 квітня 2018.
  6. Lost redirect. Архів оригіналу за 8 вересня 2006. Процитовано 25 квітня 2018. [Архівовано 2006-09-08 у Wayback Machine.]
  7. http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx [Архівовано 9 квітня 2016 у Wayback Machine.] Visual C++ Developer Center, rand_s
  8. http://docs.python.org/lib/os-miscfunc.html [Архівовано 14 вересня 2008 у Wayback Machine.] Python Library Reference, OS module

Посилання

[ред. | ред. код]