На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Подготовка вредоносных данных

Как мы уже неоднократно подчеркивали, наиболее интересные технологии вычислений достаточно сложны. Например, хотя универсальная машина Тьюринга и состоит только из ленты, головок считывания и записи, но даже для нее могут использоваться очень сложные грамматические конструкции команд. Теоретически машина Тьюринга способна выполнять любую программу, которая запускается на самых сложных современных компьютерах. Проблема состоит в том, что преобразование реальной программы в специальный код для машины Тьюринга не приносит пользы. Результат преобразования команд современной программы для машины Тьюринга будет неприемлемым, из-за чего возникнут пробелы в цельной "картине" архитектуры программы. Например, можно попытаться описать игру в бильярд с помощью методов квантовой физики. Безусловно, сделать это реально, но намного лучше для описания бильярда воспользоваться классической (ньютоновской) физикой.
Однако на практике все обстоит намного сложнее. Как известно, поведение простых динамических систем (описанных во многих случаях с помощью простых, но итеративных алгоритмов) со временем усложняется, а поэтому и описать такое поведения весьма сложно. Хотя т.н. теория хаоса позволяет нам моделировать сложные системы наподобие земной атмосферы, но мы по-прежнему не можем достаточно формально описать открытые системы. Основная проблема заключается в огромном многообразии вероятных состояний в будущем, даже в системе, которая описывается несколькими уравнениями. Из-за этого многообразия понимание и обеспечение безопасности открытой динамической системы сопряжено с огромными затруднениями. Программы, которые запускаются на современных подключенных к сети компьютерах, по сути являются открытыми динамическими системами.
Вообще, действия программного обеспечения определяются двумя основными факторами: внешними входными данными и внутренним состоянием. Иногда мы можем наблюдать внешние входные данные или с помощью программы-анализатора (sniffer), или запоминая данные, которые мы вводим в пользовательский интерфейс программы. Намного сложнее оценить внутреннее состояние программы, которое зависит от значений всех битов и байтов, хранящихся в памяти, регистрах процессора и т.д. Незаметно для пользователя программное обеспечение хранит сотни или тысячи фрагментов информации, часть которой относится к данным, а часть — к командам. Это напоминает комнату, наполненную тысячами разных маленьких переключателей. Допустим, что можно установить каждый переключатель в любой позиции и в любой комбинации, при этом конечное число комбинаций будет резко возрастать с увеличением числа переключателей (по экспоненциальному закону). В обычном компьютере количество всех возможных состояний компьютера может превысить количество звезд во Вселенной. То же самое касается и самого современного программного обеспечения. По всей видимости, теория нам не поможет.
Подобные теоретические исследования компьютерных систем приводят к очевидному выводу о том, что программное обеспечение является слишком сложным для его моделирования. Расценивая программное обеспечение как "черный ящик", мы можем бесконечно долго вводить команды, но при этом мы будем всегда помнить, что буквально следующая команда может привести к сбою в работе программы. Как раз это обстоятельство и затрудняет тестирование программного обеспечения. Безусловно, исходя из практического опыта, мы знаем определенные последовательности команд, которые могут привести к возникновению ошибок в программе. Поэтому и существует так много компаний, которые продают программы по обеспечению безопасности приложений, в которых проводится только тестирование по методу "черного ящика" (к таким компаниям относятся, например, Kavado, Cenzic, Sanctum и SPI Dynamics). Фактически, из-за различной сложности программного обеспечения становится невозможным создание такого средства тестирования по методу "черного ящика", с предварительно определенным набором тестов, которое бы позволяло проверить каждое уязвимое состояние конкретной программы.
В программном обеспечении предусмотрено целое множество способов ввода информации. Классическими и традиционными "входными данными" считаются последовательности команд или байты данных. Получив эти данные, программное обеспечение переходит к принятию решения. Результат обработки входных данных всегда является каким-то видом выходных данных, а собственно процесс обработки приводит к большому числу критически важных изменений, касающихся внутреннего состояния программы. Во всех (но особенно в самых распространенных) программах этот процесс настолько сложный, что с течением времени предсказать поведение программы становиться крайне тяжело.
Попытка предсказать внутреннее состояние программы аналогична попытке предугадать конкретное расположение шестеренок и передач в обычной машине. Пользователь машины может предоставить входные данные (нажав кнопки и повернув рукоятки) и вести машину. Кнопки и рукоятки "превращаются" в язык программирования для машины. Как процессор компании Intel исполняет машинный код х86, так и программа из нашего примера — это машина, которая обрабатывает входные инструкции пользователя.
Очевидно, что посредством тщательно подготовленных входных данных пользователь может серьезно повлиять на внутреннее состояние программы. Даже вредоносные входные данные используют функции программы. Доступны тысячи разных команд и миллионы способов их комбинирования. В умении использовать возможности языка программирования и заключается искусство подготовки входных данных.
Таким образом, хакера следует считать пользователем, который хочет привести программу в определенное уязвимое состояние. Для хакера основным средством воздействия являются вредоносные входные данные. В некотором смысле эти входные данные являются специальным "диалектом" языка, который понимает только уязвимая программа. Согласно этой логике, атакуемая программа становится специальной машиной, предназначенной для выполнения команд хакера. Исходя из вышесказанного, вполне очевидным является следующий вывод.
Сложная вычислительная система— это механизм для выполнения вредоносных компьютерных программ, доставленных в виде специально подготовленных входных данных.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика