Использует ли UuidCreate CSPRNG?

Обратите внимание, что это не мое приложение, это приложение, которое я pentesting для клиента. Обычно я задаю такие вопросы на https://security.stackexchange.com/, однако, поскольку это больше связано с программированием, я спросил здесь.

Предоставлено RFC 4122 для UUID не указывает, что UUID типа 4 должны быть сгенерированы криптографически защищенным генератором псевдослучайных чисел (CSPRNG). Он просто говорит

Установите все остальные биты произвольно (или псевдослучайно)       значения.

Хотя некоторые реализации алгоритма, такие как этот в Java, используют CSPRNG.

Я пытался понять, работает ли реализация Microsoft или нет. В основном, как генерирует их .NET или MSSQL Server.

Проверяя .NET source, мы можем увидеть этот код:

 Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
 return guid;

Проверяя CoCreateGuid docco, он указывает

Функция CoCreateGuid вызывает функцию RPC UuidCreate

Все, что я могу узнать об этой функции, здесь. Кажется, я дошел до конца кроличьей дыры.

Теперь, есть ли у кого-нибудь информация о том, как UuidCreate генерирует свои UUID?

Я видел много связанных сообщений:

В первом из них говорится:

GUID не гарантирует гарантии случайности, он делает гарантии вокруг уникальности. Если вы хотите случайность, используйте Random для создания строка.

Я согласен с этим, кроме как в моем случае для случайных, непредсказуемых чисел вы, конечно, используете CSPRNG вместо Random (например, RNGCryptoServiceProvider).

И последнее утверждает (фактически цитируется из Википедии):

Криптоанализ генератора GUID WinAPI показывает, что, поскольку последовательность идентификаторов GUID V4 является псевдослучайной; учитывая полное знание внутреннее состояние, можно предсказать предыдущие и последующие Значения

Теперь, с другой стороны забора этот пост от Will Dean говорит

В прошлый раз, когда я изучал это (несколько лет назад, возможно, XP SP2), я шагнул в код ОС, чтобы увидеть, что было на самом деле происходит, и он генерирует случайное число с безопасным генератор случайных чисел.

Конечно, даже если в настоящее время он использует CSPRNG, это будет специфичным для реализации и может быть изменено в любой момент (например, любое обновление для Windows). Маловероятно, но теоретически возможно.

Моя точка зрения заключается в том, что для этого нет канонической ссылки, выше было продемонстрировать, что я сделал свое исследование, и ни одна из вышеупомянутых сообщений не ссылается на что-либо авторитетное.

Причина в том, что я пытаюсь решить, нужно ли менять систему, использующую GUID для токенов аутентификации. С точки зрения чистого дизайна, ответ является определенным да, однако с практической точки зрения, если функция Windows UuidCreate действительно использует Infrastructure CSPRNG, тогда нет непосредственной угрозы для системы, Может ли кто-нибудь пролить свет на это?

Я ищу ответы с уважаемым источником, чтобы поддержать его.

Ответы

Ответ 1

Хотя я все еще просто парень в Интернете, я только что повторил упражнение по вступлению в UuidCreate в 32-битном приложении, работающем на 64-разрядной версии Windows 10.

Вот немного стека из частичного процесса:

> 0018f670 7419b886 bcryptPrimitives!SymCryptAesExpandKeyInternal+0x7f
> 0018f884 7419b803 bcryptPrimitives!SymCryptRngAesGenerateSmall+0x68
> 0018f89c 7419ac08 bcryptPrimitives!SymCryptRngAesGenerate+0x3b
> 0018f8fc 7419aaae bcryptPrimitives!AesRNGState_generate+0x132 
> 0018f92c 748346f1 bcryptPrimitives!ProcessPrng+0x4e 
> 0018f93c 748346a1 RPCRT4!GenerateRandomNumber+0x11
> 0018f950 00dd127a RPCRT4!UuidCreate+0x11

Довольно ясно, что он использует RNG на основе AES для генерации чисел. GUID, созданные при вызове функций генерации GUID других людей, по-прежнему не подходят для использования в качестве неопроверенных токенов auth, поскольку это не цель функции генерации GUID - вы просто используете побочный эффект.

Ваш "Маловероятно, но теоретически возможно". об изменениях в реализации между версиями ОС скорее дано ложь этим утверждением в документах для "UuidCreate":

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

то есть. он был более предсказуемым, теперь он менее предсказуем.