27.11.2014 Views

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

НЕСЛУЧАЙНО CUDA ИДЕМ? phpMyAdmin - Xakep Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!