CryptGenRandom

Криптографический алгоритм

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

Фон

Win32 API включает в себя комплексную поддержку криптографии через Microsoft CryptoAPI , набор криптографических примитивов, предоставляемых Microsoft для использования в приложениях Windows. Технологии Windows, такие как поддержка TLS (через Schannel API) и подпись кода, полагаются на эти примитивы, которые в свою очередь полагаются на криптографически безопасный генератор псевдослучайных чисел (CSPRNG). — стандартный CSPRNG, поставляемый с Microsoft CryptoAPI.CryptGenRandom

Метод работы

До Windows Vista

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

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

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

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

Windows Vista и выше

Microsoft довольно подробно описала реализацию генератора случайных чисел в Windows 10 в техническом документе, опубликованном в 2019 году. [5] В Windows 10:

  • Существует иерархия генераторов случайных чисел. Ядро имеет «корневой» PRNG, из которого в конечном итоге выводится вся случайность. Затем ядро ​​использует корневой PRNG для заполнения одного PRNG на логический процессор (поэтому состояние PRNG является локальным для потока и не требует блокировки). Когда запускается процесс, он запрашивает случайные байты из PRNG ядра на процессор для заполнения своего собственного Process PRNG. Затем он использует Process PRNG для заполнения одного буферизированного PRNG на логический процессор. [5]
  • Все вызовы пользовательского пространства для получения случайности, будь то CryptGenRandomили RtlGenRandom, в конечном итоге попадают в ProcessPrng, который возвращает байты из PRNG процесса на процессор. PRNG всегда использует алгоритм AES-CTR-DRBG, как указано в FIPS SP800-90. Хотя BCryptGenRandomон принимает запросы на более старые алгоритмы для обратной совместимости, он всегда возвращает только случайные числа из PRNG на процессор. [5] : 8 
    • AES-CTR-DRBG вместо FIPS 186 используется по умолчанию, начиная с Windows Vista и Windows Server 2008. [6]
    • Удаление других алгоритмов произошло в Windows 10. [6]
  • Корневой ГСЧ периодически повторно заполняется из пулов энтропии. [5] : 9  При загрузке, когда доступно очень мало энтропии, специальная процедура «начального заполнения» предоставляет заполнение из файлов заполнения, внешнюю энтропию, случайность TPM , инструкции RDRAND / RDSEED, таблицу ACPI-OEM0, энтропию UEFI и текущее время. [5] : 11 
  • Ядро поддерживает несколько пулов энтропии. Несколько источников энтропии добавляются в пулы, основным из которых является синхронизация прерываний. [5] : 12  При использовании пула в качестве выходных данных берется хэш SHA-512 его содержимого. [5] : 10  Windows не оценивает энтропию. [5] : 16 

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

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

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

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

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

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

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

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

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

Проверка FIPS

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

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

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

Список проверки ГСЧ содержит следующее уведомление: «С 1 января 2016 года в соответствии с SP800-131A Revision 1 Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths, использование ГСЧ, указанных в FIPS 186-2, [X9.31] и версии 1998 года [X9.62], больше не одобряется. Этот список предоставляется только в исторических целях». [10]

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

уровень API

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

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

Если для вашей программы требуется обратная совместимость вплоть до Windows XP, можно вызвать функцию Windows API RtlGenRandom(которая находится в advapi32.dll[3] ) для генерации безопасных случайных данных, как показано ниже. Если это не проблема, программа должна использовать BCryptGenRandomвместо этого более новый вызов.

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

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

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

Программистам, использующим .NET, следует использовать класс RNGCryptoServiceProvider. [12]

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

CNG [13] — это долгосрочная замена устаревшему Crypto API. Он предоставляет эквивалентную функцию BCryptGenRandom [14] , а также специальные функции для генерации ключей.

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

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

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

Ссылки

  1. ^ Функция CryptGenRandom (Windows) «Важно: этот API устарел. Новое и существующее программное обеспечение должно начать использовать API криптографии следующего поколения. Microsoft может удалить этот API в будущих выпусках». (Это уведомление относится ко всем CryptoAPI.)
  2. ^ "Microsoft подтверждает, что XP содержит ошибку генератора случайных чисел". Архивировано из оригинала 2008-06-22.
  3. ^ ab "Функция RtlGenRandom (ntsecapi.h)". Microsoft Learn . Microsoft . Получено 7 ноября 2024 г. .
  4. ^ Ховард, Майкл; Леблан, Дэвид (2003). Написание безопасного кода, второе издание . Pearson Education. ISBN 0-7356-1722-8.
  5. ^ abcdefgh Фергюсон, Нильс (октябрь 2019 г.). «Инфраструктура генерации случайных чисел Windows 10» (PDF) . download.microsoft.com .
  6. ^ ab "Идентификаторы алгоритма CNG (Bcrypt.h) - приложения Win32". learn.microsoft.com . 13 апреля 2023 г. Примечание: начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90. [...] Windows 10: начиная с Windows 10, алгоритм генератора случайных чисел на основе двойной эллиптической кривой был удален. Существующие варианты использования этого алгоритма продолжат работать; однако генератор случайных чисел основан на режиме счетчика AES, указанном в стандарте NIST SP 800-90.
  7. ^ Доррендорф, Лео; Цви Гуттерман; Бенни Пинкас. "Криптоанализ генератора случайных чисел операционной системы Windows" (PDF) . Архивировано из оригинала (PDF) 2012-05-18 . Получено 2007-11-12 .
  8. ^ abcdefgh "Список проверки RNG". NIST Computer Security Division . Получено 20 марта 2024 г.
  9. ^ "The Random Number Generator Validation System (RNGVS)" (PDF) . Национальный институт стандартов и технологий, Отдел компьютерной безопасности. 31 января 2005 г. Архивировано из оригинала (PDF) 24 февраля 2013 г. Получено 18 июня 2013 г.
  10. ^ «Программа проверки криптографического алгоритма: список проверки rng».
  11. ^ ab "rand_s". Microsoft Learn . Microsoft . Получено 7 ноября 2024 г. .
  12. ^ "Архивная копия". Архивировано из оригинала 2006-09-08 . Получено 2007-08-27 .{{cite web}}: CS1 maint: архивная копия как заголовок ( ссылка )
  13. ^ Крипто API следующего поколения (Windows)
  14. ^ BCryptGenRandom (Windows)
  15. ^ https://docs.python.org/2/library/os.html#os.urandom Справочник по библиотеке Python, модуль ОС
  16. ^ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Техническая документация Oracle Java SE 8, поставщики Sun
  • Программы лицензирования Microsoft Shared Source
Взято с "https://en.wikipedia.org/w/index.php?title=CryptGenRandom&oldid=1255863579"