Pull to refresh

Comments 40

Мне интересно знать, насколько такой рандом юзабелен:

$random = uniqid(mt_rand(), true);
Именно mt_rand, а не /dev/urandom.
Через PHPSESSID можно подобрать php_combined_lcg, а от него значения и mt_rand, и uniqid, так что такой рандом уязвим.
То есть даже session_regenerate_id(true) не спасет?
А откуда мы узнаем когда и во сколько была создана сессия, идентификатор которой мы подбираем?
Можно просто не послать id сессии в куке, и тогда она будет каждый раз генериться заново
Идентификатор собственной сессии чем-то секретным не является.
Смысл в том, что нужен как раз собственный PHPSESSID, с помощью него мы можем получить сид для mt_rand(), uniqid(), т.е. предугадывать все случайные числа.
Я оригинал почитаю ещё статьи.

Прямо все все все случайные числа предугадывать, а не результат первого вызова PHP: rand в момент создания сессии?
Числа не случайные, а псевдо случайные, поэтому узнав сид, можно предугадывать все последующие.
Если обратиться к скрипту с session_start() без Cookie PHPSESSID, генерируется новый PHPSESSID, отправляется клиенту в Set-Cookie. php_combined_lcg инициализируется при запуске нового процесса, поэтому задача атакующего — заставить веб-сервер создать несколько свежих процессов, при чем так, чтобы microtime обладал наиболее низкой энтропией (с помощью техник ATS и Request Twins). Создать новые процессы можно путем отправки большого количества Keep-Alive запросов. Т.е. отправляя keep-alive запросы на скрипт c session_start, можно получить PHPSESSID из свежего процесса, в котором атакующий брутит pid, microtime, две дельты. IP и время (заголовок Date), естественно известны.
Тут не подбирается id сессии, он известен, тут описывается уязвимость в функциях типа mt_rand
Допустим, Вы занимаетесь подбором сессий, и для этого Вам необходимо сделать N запросов к серверу.
Как на это отреагирует аппаратная часть защиты, которая ведет мониторинг трафика на наличие аномалий? ( к примеру Cisco IPS 4200)
нет их делать не надо) в том то и вся соль, запросов там будет десятка 2 не более
Сессии мы брутим у себя, требуется отправлять запросы лишь для создания новых процессов. Как правило, требуется всего ~100 keep-alive запросов для Apache+mod_php, чтобы веб-сервер начал создавать новые процессы.
Спасибо, теперь понял. Идея довольно интересная! =)
Тогда вопрос: как сделать ту же uniqid менее угадываемой?
Единственная безопасная функция — openssl_random_pseudo_bytes. uniqid не уязвим, если стоит suhosin extension (не путать с патчем).
Хм, а откуда информация о том, что PHPSESSID это 32x (то есть генерируется именно из md5)?
Проверил — выдаётся строка из 26 символов вида «vranubpab5ab56aedat6r8jak6», в документации по PHP не сказано про md5(неважночто).
В PHP есть две директивы:
  • session.hash-function — по умолчанию 0 (md5), 1 — sha1
  • session.hash-bits-per-character — преобразовывает байты хэша в удобочитаемый формат, возможные значения '4' (0-9, a-f), '5' (0-9, a-v) и '6' (0-9, a-z, A-Z, "-", ","). У нас реализован только режим '4', так как он наиболее часто используется, но мы скоро добавим поддержку и остальных форматов.
Хмм, то есть vranubpab5ab56aedat6r8jak6 это те же самые байты хеша, но в другой последовательности?
И вдогонку — что скажете о следующих настройках сервера?
session.entropy_file = /dev/urandom
session.entropy_length = 128
Да, использование этих директив устраняет уязвимость, но по умолчанию они отключены.
А в чем различия от исследлования Сами 2010 года?

media.blackhat.com/bh-us-10/whitepapers/Kamkar/BlackHat-USA-2010-Kamkar-How-I-Met-Your-Girlfriend-wp.pdf
samy.pl/phpwn/

Я не «обидеть» или «наехать» хочу, если что… просто он(Сами) про это рассказывал давно, и вроде идея та же самая была и софт он показал (практическая реализация), а перечитывать и искать новизну — лень, все таки раз это исследование, то обзор аналогов обязательная часть 8)))

Спасибо за статью в любом случае!
Да, с этой работой мы разумеется знакомы. Действительно, идея та же, но софт Сами в реальных условиях едва ли применим, так как требует информацию, которую можно получить только локально на атакуемой машине, например pid и вывод функции lcg_value(). Новизна в том, что энтропию microtime можно значительно уменьшить за счет техник ATS и Request Twins, кроме того, в работе Сами не учитывается то, что у атакующего есть возможность заставить веб-сервер создавать новые процессы со свежими сидами для php_combined_lcg.
Софт Сами можно назвать просто PoC'ом, так как не реализует даже многопоточности, нам же было необходимо готовое решение для внутреннего пользования, что привело к созданию такой программы (есть и pro версия ;))
Спасибо за ответ, теперь вижу лучше =) Второй вопрос, чем отличается PRO версия и как ее достать?
Скоро отправим CFP на Zero Nights :)
Спасибо за хороший инструмент и статью! А можете собрать вариант для ATI карточек под OpenCL? Они быстрее и дешевле Nvidia.

Есть практические суровые НО, на которые стоит обратить внимание администраторам, прежде чем пытаться решить проблему на стороне каких-то Cisco.
Эта атака имеет существенное ограничение, про которое не стоит забывать — ей нельзя атаковать реальные веб-проекты. Дело в том, что заголок Date, который необходим в реальной жизни переписывает фронтэндом или балансером. Поэтому мешается. Keep-alive тоже в 50% случаях запрещен просто на балансирующей nginx и приехали. В этих условиях беда-беда, особенно если таймзона аппсервера и балансера разбежались. Это даже если открыт server-status, который в реальной жизни встречается в 5% случаев.

По статье, все очень грамотно изложено, но причем тут фраза «Принцип такой. Отправляем два запроса один за другим: первый на сброс пароля себе, второй — на сброс пароля админа. Разница в microseconds будет минимальна.» и как это связано с PHPSESSID хоть убейте — не понимаю!

Также просьба — пишите, пожалуйста, ссылки на исследования, которые легли в основу в тексте, в частности www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/ забыли. Ссылки в комментах искать нереально, а разобраться почему работает тот же keep-alive, просто по атаке, очень трудно.

Еще раз спасибо за инструмент и статью, вы МОЛОДЦЫ!
А можете собрать вариант для ATI карточек под OpenCL? Они быстрее и дешевле Nvidia.

OpenCL не планируем, если реализовывать в отдельности под каждую GPU-платформу, скорость будет выше.
ей нельзя атаковать реальные веб-проекты

Не надо преувеличивать, согласен, что на некоторых серверах могут возникнуть трудности с keep-alive и Date, но на самом деле все не так плохо.
и как это связано с PHPSESSID хоть убейте — не понимаю!

Здесь не упомянули возможность извлечения значения microseconds из токена.

Ссылки добавим, спасибо за комментарий!
ей нельзя атаковать реальные веб-проекты

Собственно, проверяли мы на реальных веб-хостингах реальные веб-приложения и показатель успешности демонстрирует то, что реальные веб-проекты на реальных системах с помощью этой методики можно атаковать!
Самая главная сложность — server-status. С этого можно начать и закончить.
Про Date — вы так атаковали хотя бы один сервер с балансером или фронотэдом? Как?

Про атаки на сами веб-приложения все-таки не совсем не понятно по статье. Давайте разделять — веб-сервер с пыхом в целом, и там генерация PHPSESSID и отдельно веб-приложения, в частности, с выводом mt_rand значений в HTTP ответ. Тогда с примерами покажите как это связать вместе.
Про Date — вы так атаковали хотя бы один сервер с балансером или фронотэдом?

Атаки проводились на Virtual hosting-и хостеров, доступ к аккаунтам которых у нас был.
На тему получения pid+microtime от самого аппсервера решал эту задачу и добавил в слайды с Defcon-Russia: oxod.ru/DCG7812-Cryptography-in-webapps.pdf
Вместе с этим инструментов и хотел бы использовать, но AMD все испортило :(((
Sign up to leave a comment.