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.
Common Criteria
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() мови Python в операційних системах Windows викликає CryptGenRandom.[8]
Дивись також
Примітки
- Microsoft confirms that XP contains random number generator bug. Архів оригіналу за 22 червня 2008. Процитовано 25 квітня 2018.
- RtlGenRandom Function (Windows)
- Dorrendorf, Leo. Cryptanalysis of the Random Number Generator of the Windows Operating System (pdf). Архів оригіналу за 6 вересня 2012.
- Архівована копія. Архів оригіналу за 26 січня 2007. Процитовано 25 квітня 2018.
- Michael Howard’s Web Log : Cryptographically Secure Random number on Windows without using CryptoAPI. Архів оригіналу за 28 грудня 2005. Процитовано 25 квітня 2018.
- Lost redirect. Архів оригіналу за 8 вересня 2006. Процитовано 25 квітня 2018.
- http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Visual C++ Developer Center, rand_s
- http://docs.python.org/lib/os-miscfunc.html Архівовано 14 вересня 2008 у Wayback Machine. Python Library Reference, OS module