[#] Неслучайная случайность, или Атака на ГПСЧ в .NET
habrabot(difrex,1) — All
2018-01-30 09:15:14


> _Random numbers should not be generated with a method chosen at random._
> _— Donald Knuth_



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


class AuthenticateByPhoneHandler
{
/* ... */

static string GenerateCode() => rnd.Next(100000, 1000000).ToString();

readonly static Random rnd = new Random();
}

Проблема видна невооруженным глазом: для генерации 6-тизначного кода используется класс Random — простой некриптографический генератор псевдослучайных чисел (ГПСЧ). Займёмся им вплотную: научимся предсказывать последовательность случайных чисел и прикинем возможный сценарий атаки на сервис.



# Потокобезопасность {#potokobezopasnost}



Кстати, заметим, что в приведённом фрагменте кода доступ к статическому экземпляру `rnd` класса Random из нескольких потоков не синхронизирован. Это может привести к неприятному казусу, который можно часто встретить в вопросах и ответах на StackOverflow:



![][1]

[Читать дальше →][2]

[1]: https://habrastorage.org/webt/jw/fd/gv/jwfdgvotcjwt1wct-mz93tdkhnq.png
[2]: https://habrahabr.ru/post/347758/?utm_source=habrahabr&utm_medium=rss&utm_campaign=347758#habracut