CryptGenRandom - CryptGenRandom

CryptGenRandom устарел [1] криптографически безопасный генератор псевдослучайных чисел функция, которая включена в Microsoft CryptoAPI. В Win32 программ, Microsoft рекомендует использовать его везде, где требуется генерация случайных чисел. В статье 2007 года из Еврейского университета предлагались проблемы безопасности в Windows 2000 реализация CryptGenRandom (при условии, что злоумышленник контролирует машину). Позже Microsoft признала, что те же проблемы существуют в Windows XP, но не в Vista. Microsoft выпустила исправление ошибки в Windows XP Service Pack 3 в середине 2008 года.[2]

Фон

В Win32 API включает всестороннюю поддержку криптографической безопасности, в том числе встроенную TLS поддержка (через SCHANNEL API) и подпись кода. Эти возможности построены на собственных библиотеках Windows для криптографических операций, таких как ЮАР и AES генерация ключей. Эти библиотеки, в свою очередь, полагаются на криптографически безопасный генератор псевдослучайных чисел (CSPRNG). CryptGenRandom является стандартным CSPRNG для среды программирования Win32.

Метод работы

Предоставленный Microsoft криптография провайдеры используют одну и ту же реализацию CryptGenRandom, в настоящее время основанную на внутреннем функция называется RtlGenRandom.[3] Только общий план алгоритм были опубликованы с 2007 г.:

[RtlGenRandom] генерируется, как указано в FIPS 186-2 приложение 3.1 с SHA-1 как G-функцию. И с энтропией от:

  • Идентификатор текущего процесса (GetCurrentProcessID).
  • Идентификатор текущего потока (GetCurrentThreadID).
  • Счетчик тиков с момента загрузки (GetTickCount).
  • Текущее время (GetLocalTime).
  • Различные высокоточные счетчики производительности (QueryPerformanceCounter).
  • An MD4 хэш блока среды пользователя, который включает имя пользователя, имя компьютера и путь поиска. [...]
  • Высокоточные внутренние счетчики ЦП, такие как RDTSC, RDMSR, RDPMC

[опущено: длинные списки низкоуровневых информационных полей системы и счетчиков производительности][4]

Безопасность

Безопасность CSPRNG криптосистемы важна, потому что это источник динамического ключевого материала. Ключи, необходимые «на лету», такие как ключи сеанса AES TLS, которые защищают HTTPS сеансы с веб-сайтами банков происходят из CSPRNG. Если эти псевдослучайные числа предсказуемы, то сессионные ключи также предсказуемы. Поскольку CryptGenRandom является стандартом де-факто CSPRNG в средах Win32, его безопасность критически важна для пользователей Windows.

Особенности алгоритма CryptGenRandom официально не опубликованы. Как и любой неопубликованный алгоритм генерации случайных чисел, он может быть подвержен теоретическим недостаткам, включая использование устаревших алгоритмов и зависимость от энтропия скопление на нескольких монотонно увеличивающихся счетчиках, которые могут оцениваться или контролироваться злоумышленником с локальным доступом к системе.

Криптоанализ

А криптоанализ CryptGenRandom, опубликованный в ноябре 2007 г. Лео Доррендорф и другими из Еврейский университет Иерусалима и Хайфский университет, обнаружил существенные недостатки в Windows 2000 реализация алгоритма.[5]

Чтобы воспользоваться этой уязвимостью, злоумышленнику сначала потребуется взломать программу, на которой запущен генератор случайных чисел. Все слабые места в статье зависят от того, что злоумышленник выкачивает биты состояния из генератора. Злоумышленник, способный выполнить эту атаку, обычно уже может победить любой генератор случайных чисел (например, он может просто прослушать выходные данные генератора или зафиксировать их в памяти на известных значениях). Тем не менее, команда Еврейского университета отмечает, что злоумышленнику нужно украсть биты состояния только один раз, чтобы постоянно нарушать безопасность экземпляра CryptGenRandom. Они также могут использовать полученную информацию для определения прошлых случайных чисел, которые были сгенерированы, потенциально компрометирующей информацию, такую ​​как номера кредитных карт, уже отправленные.

Атаки в статье основаны на том, что CryptGenRandom использует потоковый шифр RC4, который можно запустить в обратном направлении, как только станет известно его состояние. Они также пользуются тем, что CryptGenRandom работает в пользовательский режим, позволяя любому, кто получает доступ к операционной системе на уровне пользователя, например, используя переполнение буфера, чтобы получить информацию о состоянии CryptGenRandom для этого процесса. Наконец, CryptGenRandom обновляет свое семя из энтропия редко. Эта проблема усугубляется тем фактом, что каждый процесс Win32 имеет свой собственный экземпляр состояния CryptGenRandom; хотя это означает, что компромисс одного процесса не ставит под угрозу все остальные процессы, он также может увеличить продолжительность любого успешного перерыва.

Поскольку детали алгоритма CryptGenRandom не являются общедоступными, команда Доррендорфа использовала разобрать механизм с целью понять, как это работает инструменты, чтобы понять, как работает алгоритм. Их статья - первая опубликованная запись о том, как работает криптографический генератор случайных чисел Windows.[нужна цитата ].

Общие критерии

Все Windows 2000, XP и 2003 успешно прошли оценку EAL4 +, включая реализации CryptGenRandom () и FIPSGenRandom (). Документация по Security Target доступна по адресу Портал Common Criteria, и указывает на соответствие требованиям EAL4. В результате можно сделать несколько выводов о безопасности алгоритма; EAL4 сравнивает продукты с передовыми практиками и заявленными целями безопасности, но редко включает углубленный криптоанализ.

Проверка FIPS

Microsoft имеет получено подтверждение его реализаций ГСЧ в следующих средах:

  • Реализации Windows Vista RNG (сертификат 321)[6]
  • Windows 2003 Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 316)[6]
  • Windows 2003 Enhanced DSS и поставщик криптографии Диффи-Хеллмана (dssenh.dll) (сертификат 314)[6]
  • Криптографический модуль режима ядра Windows 2003 (fips.sys) (сертификат 313)[6]
  • Windows CE и Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 292)[6]
  • Windows CE и Windows Mobile Enhanced Cryptographic Provider (rsaenh.dll) (сертификат 286)[6]
  • Поставщик улучшенных криптографических служб Windows CE (rsaenh.dll) (сертификат 66)[6]

Эти тесты «предназначены для проверки соответствия различным утвержденным спецификациям ГСЧ, а не для оценки безопасности продукта. [...] Таким образом, валидацию не следует интерпретировать как оценку или подтверждение общей безопасности продукта». В результате можно сделать несколько выводов о безопасности алгоритма; При оценке FIPS необязательно проверять исходный код или оценивать способ генерации начального числа ГСЧ.[7]

Альтернативы

Уровень API

У разработчиков Windows есть несколько альтернативных способов доступа к функциям CryptGenRandom; эти альтернативы используют один и тот же алгоритм и имеют одинаковые характеристики безопасности, но могут иметь другие преимущества.

Использование RtlGenRandom

«Исторически мы всегда говорили разработчикам не использовать такие функции, как rand для генерации ключей, одноразовых номеров и паролей, вместо этого они должны использовать такие функции, как CryptGenRandom, который создает криптографически безопасные случайные числа. Проблема с CryptGenRandom заключается в том, что вам нужно использовать CryptoAPI (CryptAcquireContext и тому подобное), что нормально, если вы используете другие криптографические функции.

При установке Windows XP и более поздних версий по умолчанию CryptGenRandom вызывает функцию ADVAPI32! RtlGenRandom, которая не требует загрузки всего CryptAPI. Фактически новый Whidbey Функция CRT, rand_s вызывает RtlGenRandom ".[8]

Использование RNGCryptoServiceProvider

Программисты, использующие .СЕТЬ следует использовать Класс RNGCryptoServiceProvider.[9]

Использование API криптографии: новое поколение (CNG)

СПГ [10] является долгосрочной заменой устаревшего Crypto API. Он обеспечивает эквивалентную функцию BCryptGenRandom[11] а также специальные функции для генерации ключей.

Языки программирования

  • функция библиотеки Microsoft C ++ rand_s использует RtlGenRandom и рекомендуется Microsoft для безопасных приложений.[12]
  • в Python функция случайный в Операционные системы модуль, который использует / dev / urandom на Unix-подобный систем, вызывает CryptGenRandom в системах Windows.[13]
  • в Ява Поставщик JCA "SunMSCAPI", доступный в дистрибутивах OpenJDK и Oracle для JRE в Windows, предоставляет реализацию SecureRandom с именем алгоритма Windows-PRNG. Этот класс пересылает все запросы для случайных или начальных байтов, а также устанавливает дополнительные начальные байты в собственный CryptGenRandom.[14]

Смотрите также

Рекомендации

  1. ^ Функция CryptGenRandom (Windows)
  2. ^ «Microsoft подтверждает, что XP содержит ошибку генератора случайных чисел». Архивировано из оригинал на 22 июня 2008 г.
  3. ^ Функция RtlGenRandom (Windows)
  4. ^ Написание безопасного кода, второе издание. ISBN  0-7356-1722-8.
  5. ^ Доррендорф, Лео; Цви Гуттерман; Бенни Пинкас. «Криптоанализ генератора случайных чисел операционной системы Windows» (PDF). Архивировано из оригинал (pdf) на 2012-09-06. Получено 2007-11-12.
  6. ^ а б c d е ж грамм «Проверочный список ГСЧ». Отдел компьютерной безопасности NIST. Получено 18 июн 2013.
  7. ^ «Система проверки генератора случайных чисел (RNGVS)» (PDF). Отдел компьютерной безопасности Национального института стандартов и технологий. 31 января 2005 г. Архивировано с оригинал (PDF) 24 февраля 2013 г.. Получено 18 июн 2013.
  8. ^ Веб-журнал Майкла Ховарда: криптографически безопасное случайное число в Windows без использования CryptoAPI
  9. ^ «Архивная копия». Архивировано из оригинал на 2006-09-08. Получено 2007-08-27.CS1 maint: заархивированная копия как заголовок (связь)
  10. ^ Crypto API следующего поколения (Windows)
  11. ^ BCryptGenRandom (Windows)
  12. ^ http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Центр разработчиков Visual C ++, rand_s
  13. ^ https://docs.python.org/2/library/os.html#os.urandom Справочник по библиотеке Python, модуль ОС
  14. ^ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Техническая документация Oracle Java SE 8, Sun Providers

внешняя ссылка