В очередной раз читал раздел "Уязвимости" и опять меня начал мучать вопрос А как сии уязвимости ищут в сетевом ПО?
Squid "Уязвимость существует из-за ошибки при обработке специально сформированного номера версии HTTP. Удаленный клиент может с помощью специально сформированного запроса вызвать отказ в обслуживании приложения."
Или так же свеженькая уязвимости в qip.... "Уязвимость существует из-за ошибки при обработке ICQ сообщений. Удаленный пользователь может с помощью специально сформированного ICQ сообщения в RTF формате заставить приложение потреблять все доступные ресурсы процессора."
Типичноe описание уязвимости.. Более менее ясно с open source посидел с полгода надо кодом авось что-нибуть и найдешь ) Но дык программы то не все в исходниках можно найти... Как в этом случае действую товарищи пытающие исследовать какой-нибуть занятненький сервис на уязвимости?
На эту тему есть занятная книжечка, приятно удивившая меня своей грамотностью и достойным изложением материала с примерами. Воды, правда, тоже хватает, не без этого. Грег Хогланд, Гари Мак-гроу - "Взлом программного обеспечения: анализ и использование кода" Взять можно, например, на торренте.
В основах поиска уязвимостей - знание типов уязвимостей и методов их поиска. В вышеуказанной книге сделан акцент на методах их эксплуатации. Обычно для поиска уязвимостей в сетевом ПО с закрытым исходным кодом исследуют протокол взаимодействия клиентской и серверной части. После того, как протокол изучен, формируют левые данные. Так например для полей данных, означающих длину блока данных или их (блоков) кол-во в пакете, подсовывают граничные значения (типа 0xff, 0x80, 0xffff в зависимости от размерности(типа) поля). Для автоматизации поиска используют fuzzing-средства (см. beStorm и самопальные тулзы), которые по определенным правилам формируют пакеты данных и травят их программе. Учтите, что данная автоматизация всего лишь дает в лучшем случае аварийное завершение процесса. Естественно, исследователь должен быть адекватным в машинных кодах (ассемблер), чтобы исследовать аспекты аварии. Иначе, как он сможет определить, является ли бага DoS-ом или ведет к удаленному выполнению кода?? Существуют способы для сужения границ поиска невалидного кода в бинарнике, так называемый "поиск кандидатов"(например команда MOVSX, которая присутствует практически всегда, когда используется преобразование типов программистом), которая всегда должна притягивать внимание кодокопателя. Вобщем, читайте о преобразованииях типов в ЯП и их неправильном использовании при написании программ. Для примера напишите своего клиента и сервера, поиграйтесь с ним. Нужно знать аспекты работы высокоуровневых языков с типами данных и их явным и неявным преобразованием. К примеру "С" не поддерживает проверку переполнения значения. Помимо того, вы должны знать способы эксплуатации уязвимости на конкретной ОС (например затирание обработчика в SEH).