Вопрос или проблема
Я создаю упражнение для своих пользователей, в котором пытаюсь объяснить, что использование mt_rand()
не является хорошим вариантом с точки зрения безопасности. Я показал им обычного пользователя, который получает email для сброса пароля, токен генерируется следующим образом
mt_srand(ip2long( crc32($email));
$random_number = mt_rand();
Теперь я говорю им, что как только пользователь получает токен, мы можем легко провести реверс-инжиниринг, используя https://www.openwall.com/php_mt_seed/, что позволит нам получить значение семени для любого случайно сгенерированного значения. Моя цель здесь состоит в том, чтобы показать им, что если мы получим семя, это позволит нам получить доступ к токену администратора или приведет к каким-то катастрофическим последствиям. Но оказывается, что получение семени здесь бесполезно.
Если администратор пытается сбросить свой пароль, он будет использовать другой email, соответственно, другое значение семени и другое случайное число. Если у меня есть доступ только к email администратора, как я могу продемонстрировать своей аудитории катастрофические последствия использования mt_rand
, используя тот же сценарий?
Ответ или решение
Ваша задача заключается в том, чтобы продемонстрировать потенциальные проблемы безопасности, связанные с использованием функции mt_rand()
в PHP для генерации токенов, таких как токены сброса паролей. Давайте более подробно рассмотрим это и предложим способ, как можно объяснить риск, не изменяя изначально предложенную схему, но добавив некоторые ключевые моменты, чтобы сделать демонстрацию более наглядной.
Что такое mt_rand()
и его недостатки
Функция mt_rand()
в PHP использует алгоритм Mersenne Twister для генерации псевдослучайных чисел. Хотя этот алгоритм достаточно быстрый и позволяет генерировать числа с хорошими статистическими свойствами, он не подходит для криптографических приложений. Основная проблема заключается в том, что если злоумышленник сможет узнать начальное состояние генератора, он сможет предсказать все последующие сгенерированные числа.
В вашем примере используется mt_srand()
с сеeding значением, основанным на ip2long(crc32($email))
. Это позволяет создавать разные последовательности псевдослучайных чисел для разных адресов электронной почты, но этот подход все равно подвержен атакам, особенно если злоумышленник знает, какой адрес электронной почты использует администратор.
Демонстрация риска
Для демонстрации риска, связанного с использованием mt_rand()
, можно использовать следующий сценарий:
-
Сбор Email: Злоумышленник знает адрес электронной почты администратора. Если администратор использует достаточно предсказуемый адрес, даже если он отличается от адресов других пользователей, злоумышленник может использовать его для атаки.
-
Ограничение по уязвимостям: Пример можно улучшить, используя адреса, которые не содержат предсказуемые элементы. Тем не менее, если злоумышленник знает о схеме генерации токенов, он может попробовать большое количество адресов, чтобы создать токены в той же последовательности.
-
Использование
mt_rand
в качестве источника криптографической случайности: Чтобы усилить вашу демонстрацию, вы можете показать, что даже если адрес электронной почты администраторов отличается, если злоумышленник будет пытаться получить доступ к токенам, используя другие известные адреса, это может привести к компрометации системы.Например, если злоумышленник получает доступ к токенам для других пользователей и понимает, как они были сгенерированы, он может использовать это знание для атаки на токены администратора или других критически важных элементов.
-
Рекомендации по безопасности: Чтобы предложить более безопасное решение, можно рекомендовать использовать функцию
random_bytes()
илиbin2hex(random_bytes(16))
для генерации токенов. Эти функции используют криптографически стойкий генератор случайных чисел и делают невозможным предсказание сгенерированных значений.
Вывод
Использование mt_rand()
для генерации токенов сброса паролей оставляет ваше приложение уязвимым для атак. Даже если строчка кода меняется в зависимости от e-mail, предсказуемость начального значения и возможность его вычисления потенциальным злоумышленником открывают двери для серьезных проблем. Подход к генерации токенов должен основываться на промышленном уровне безопасности, чтобы защитить вашу систему от несанкционированного доступа.
Таким образом, демонстрация рисков, связанных с использованием mt_rand()
, должна акцентироваться на возможностях предсказания токенов и реальных опасностях, которые это может вызвать, даже при наличии дополнительных условий.