ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
ÃÂÕáÛãçÃÂÙÃÂÞ CUDA ØÔÕÃÂœ? phpMyAdmin - Xakep Online
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
взлом<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
ELECT<br />
СЛУЧАЙНОСТИ<br />
НЕСЛУЧАЙНЫ<br />
RAND<br />
IS NOT RAND<br />
RAND<br />
IS NOT RAND<br />
ФАТАЛЬНАЯ ОШИБКА РАНДОМИЗАЦИИ В PHP<br />
Еще год назад Стефан Эссер поведал миру о предсказуемости генерации<br />
случайных чисел в PHP. Но, как это часто бывает, разработчики,<br />
да и программисты, не всегда адекватно реагируют на бюллетени<br />
безопасности (кто бы их, вообще, читал, а если и читал, то читал внимательно…).<br />
Что это? Лень? Человеческий фактор? Нежелание признавать<br />
и исправлять свои ошибки? Как бы то ни было, генератор случайных<br />
чисел PHP по-прежнему остается предсказуем.<br />
>> взлом<br />
Для правильного понимания сути уязвимости<br />
вспомним, что нам уже должно быть известно из<br />
статей Стефана Эссера, M4G'a и Raz0r'a. Материал<br />
в статьях, на мой взгляд, представлен подробно,<br />
но несколько разбросанно. Ставя один за<br />
другим эксперименты и разобравшись в деталях<br />
уязвимости, я набросал краткий курс по изучению.<br />
Полагаю, это поможет тебе более четко представить<br />
суть баги и вникнуть в тонкости процесса.<br />
НЕМНОГО ТЕОРИИ<br />
В PHP для генерации случайных чисел используется<br />
не сосед-программист, как в бородатом<br />
анекдоте, а две базовых функции на выбор:<br />
rand() и mt_rand(). Вторая предпочтительнее к<br />
использованию ввиду большей псевдослучайности<br />
генератора. Благодаря закономерностям<br />
в генерации значений возможны атаки на код,<br />
использующий эти функции, например, при<br />
генерации или сбросе паролей. Поясним, как<br />
это можно использовать, вызвав уязвимость.<br />
Во-первых, энтропия последующего вызова<br />
rand (mt_rand) зависит от результата предыдущего<br />
вызова функции, именно поэтому алгоритм<br />
псевдослучаен. Однако начальный SEED<br />
можно задать через функцию с приставкой<br />
's': srand (mt_srand). То есть, зная начальный<br />
SEED, мы можем повторить генерацию на<br />
любом компьютере, сгенерировав всю цепочку<br />
якобы случайных вызовов rand (mt_rand), и<br />
получить при этом абсолютно те же числа, что<br />
и в оригинальном приложении на удаленном<br />
сервере. Во-вторых, начальный SEED зачастую<br />
через srand (mt_srand) вообще не задают (по<br />
забывчивости или человеческой глупости).<br />
А если функция srand (mt_srand) не была<br />
вызвана (либо вызвана без параметров), то<br />
PHP задает начальный SEED самостоятельно.<br />
Проблема в том, что такой SEED не превышает<br />
числа 2^32, а это число можно банально перебрать.<br />
Разберемся в особенностях генерации,<br />
когда начальный SEED задается PHP самостоятельно<br />
ввиду отсутствия вызова srand<br />
(mt_srand). Главная особенность rand (srand)<br />
заключается в том, что для функций возвращаемый<br />
результат различен под *nix и Windows.<br />
ПРАКТИКУЕМ УЯЗВИМОСТЬ<br />
Результат предыдущего вызова rand() используется<br />
в чистом виде как начальный SEED для<br />
следующего вызова rand(). По сути:<br />
"$SEED=rand();srand($seed);$SEED=r<br />
and();...".<br />
040 XÀÊÅÐ 07 /127/ 09