Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Ultimate adventure

Крис Касперски aka мыщъх

Спецвыпуск: Хакер, номер #058, стр. 058-028-1


Стратегия поиска дыр в двоичном коде

Исходные тексты Linux'а и других open source-систем в прямом смысле зачитаны до дыр, и найти здесь что-то принципиально новое очень трудно. Windows – другое дело.

Непроходимые джунгли двоичного кода отпугивают новичков, и огромные территории дизассемблерных листингов все еще остаются неизведанными. Причудливые переплетения вложенных вызовов скрывают море грубых ошибок программистов и дают неограниченную власть над системой. Попробуй найти их, а я покажу, как.

Считается, что открытость исходного кода – залог надежности любой системы, поскольку спрятать закладку (черный ход, троянскую компоненту) в таких условиях практически невозможно. Тысячи экспертов и энтузиастов со всего мира тщательно проанализируют программу и выловят всех блох – как случайных, так и выпущенных намеренно. Что же касается откомпилированного двоичного кода, трудоемкость его анализа неоправданно велика, и никто не будет возиться с ним "за просто так". Что ж, достойный аргумент сторонников движения Open Source, известных своим радикализмом и отрицанием объективной реальности.

А реальность такова, что проанализировать исходный код современных приложений за разумное время ни физически, ни экономически невозможно. Даже старушка MS-DOS 6.0 в исходных текстах весит свыше 60 Мб. Для сравнения, "Generation П" Виктора Пелевина не дотягивает и до мегабайта. Даже если уподобить исходные тексты развлекательной книге, подсчитай, сколько времени понадобится для их прочтения? А исходные тексты – совсем не художественное произведение. Это нагромождение сложно взаимодействующих друг с другом структур данных, тесно переплетенных с машинным кодом…

При средней длине одной x86-команды в два байта каждый килобайт откомпилированного кода несет на своих плечах порядка пятисот (!) дизассемблерных строк, соответствующих десяти страницам печатного текста. Прочитать мегабайтный двоичный роман за разумное время уже невозможно. Современные программные комплексы не могут быть исследованы до последней запятой, и наличие исходных текстов ничего не меняет. Какая разница, сколько времени продлится работа – тысячу лет или миллион? Процедура поиска дыр плохо поддается распараллеливанию между участниками, так как отдельные участки программы выполняются отнюдь не изолированно друг от друга, а сложным образом взаимодействуют между собой, и далеко не все ошибки сосредоточены в одном месте, многие из них "размазаны" по большой площади, а в многопоточных средах еще и растянуты во времени.

Методик автоматизированного поиска уязвимостей, доведенных до "промышленного" использования, в настоящее время не существует, и их появление в будущем маловероятно. Непосредственный анализ обнаруживает лишь малую толику наиболее грубых и самоочевидных ошибок. Остальные же приходится выявлять в процессе реальной эксплуатации программы. Тем не менее, статистические исследования показывают, что ошибки возникают не просто так. В них есть своя внутренняя система и закономерность, благодаря чему район "археологических раскопок" существенно сужается и объем дизассемблерных работ становится вполне реальным.

Содержание  Вперед на стр. 058-028-2