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

 

 

Вектор вторжения

Вектор вторжения (injection vector) — 1) структурный просчет или недостаток в программе, который позволяет перемещать код из одного места хранения в другое; 2) структура данных или среда, которая содержит и передает код из одной области хранения в другую.
Что касается переполнения буфера, векторы вторжения представляют собой тщательно подготовленные входные сообщения, которые заставляют атакуемую программу переходить в состояние переполнения буфера. Для удобства дальнейшего изложения будем считать вектор вторжения фрагментом атаки, во время которой происходит внедрение и запуск кода в программе (обратите внимание, что, давая данное определение, мы не указали цели, для которой внедряется этот код).
Очень важно различать вектор вторжения и полезную нагрузку (payload). Полезная нагрузка — это программный код, который реализует намерения хакера. Комбинация вектора вторжения и полезной нагрузки используется для проведения полной атаки. Без полезной нагрузки вектор вторжения неэффективен, т.е. обычно хакеры используют вторжение для каких-то конкретных задач.
В основном, вектор вторжения в парадигме переполнения буфера служит для получения контроля над указателем команд. После получения контроля над указателем команд, он может быть установлен на какой-то контролируемый хакером буфер или другую область памяти, в которой сохранена полезная нагрузка. Таким образом, когда хакер получил контроль над указателем команд, он получает возможность передать управление (изменить ход выполнения программы) от нормально выполняющейся программы программному коду вредоносной полезной нагрузки. Хакер заставляет указатель команд указать на вредоносный код, что приводит к его исполнению. При этом мы говорим об активизации полезной нагрузки.
Векторы вторжения всегда связаны с конкретной ошибкой или уязвимым местом в атакуемом программном обеспечении. Для каждой версии пакетов программного обеспечения существуют уникальные векторы вторжения. При разработке средств нападения хакер должен спроектировать и создать конкретные векторы вторжений для каждой конкретной цели атаки.
При создании вектора вторжения должны учитываться несколько факторов: размер буфера, упорядочивание данных в памяти и ограничения в наборе символов. Векторы вторжения обычно соответствуют правилам определенного протокола. Например, переполнение буфера в маршрутизаторе может быть организовано с помощью вектора вторжения для обработчика пакетов протокола BGP (Border Gateway Protocol), как показано на рис 7.1. Этот вектор вторжения реализован как специально подготовленный BGP-пакет. Поскольку поддержка протокола BGP жизненно необходима для нормальной работы в Internet, то подобная атака способна уничтожить системы, обслуживающие миллионы пользователей. Более реальный пример — протокол OSPF (Open Shotest Path First). В маршрутизаторах Cisco реализация этого протокола может быть использована для удаления информации о целой локальной сети крупного сетевого узла. Протокол OSPF является уже достаточно старым, но широко распространенным протоколом маршрутизации.
Где заканчивается вектор вторжения и начинается полезная нагрузка?
ДЛЯ атак на переполнение буфера характерно наличие четкой границы между вектором вторжения и полезной нагрузкой. Эта граница называется адресом возврата (return address). Адрес возврата можно схематично определить тем моментом, когда полезная нагрузка либо получает управление над центральным процессором, либо не срабатывает и уходит в безызвестность. На 2 показан вектор вторжения, содержащий указатель команд, который в конечном итоге загружается в центральный процессор (CPU) атакуемого компьютера.
Выбор нужного адреса
Одной из наиболее важных задач вектора вторжения является выбор области памяти, в которой должна быть сохранена полезная нагрузка. Полезную нагрузку можно сохранить непосредственно во внедренном буфере или в отдельной области
памяти. Хакер должен знать адрес ячейки памяти, в которой хранится полезная нагрузка, и этот адрес должен быть использован в векторе вторжения (3). Понятно, что ограничения для набора символов, которые могут быть использованы в векторе вторжения, приводят к ограничениям в значениях, допустимых для указания адресов памяти.
Например, при ограничении на ввод только чисел больше чем OxBOOOOOOl", выбранный указатель команд должен находиться в памяти выше этого адреса. Такие ограничения соответствуют реальным проблемам, возникающим при преобразовании анализаторами байтов, ко­торые используются для символов кода атаки, в другие значения, или при работе фильтров, которые блокируют недопустимые символы в потоке данных. На практике во многих атаках применяются только буквенно-цифровые символы.
"Верхние и "нижние" адреса памяти
Стек — это область памяти, стандартно используемая для хранения кода. Для стека на Linux-компьютерах выделяется адресное пространство, в которое обычно не попадают нулевые байты. С другой стороны, на Windows-системах для стека выделяются "нижние" адреса и по крайней мере один из байтов адреса стека является нулевым байтом. Проблема в том, что использование адресов с нулевыми байтами приводит к появлению в строке внедряемых данных большого количества символов NULL. Поскольку символы NULL используются в строках программного кода на языке С как символы завершения строки, то это ограничивает размер внедряемых данных.
Если мы хотим установить указатель команд на показанную выше полезную нагрузку, то указатель команд для "верхнего" стека— 0x38341072 (обратите внимание на обратный порядок записи байтов), а указатель команд для "нижнего" стека — 0хЗВ034000 (обратите внимание на значение последнего байта 0x00). Поскольку в конце адреса для "нижнего" стека содержится символ NULL, то это прервет операцию копирования строки в программе на языке С.
Для вектора вторжения и организации переполнения буфера с помощью строки мы по-прежнему можем использовать "нижние" адреса. Единственная сложность в том, что внедряемый адрес должен быть последним элементом в нашем векторе вторжения, поскольку нулевой байт завершит операцию копирования строки. В этом случае размер полезной нагрузки будет существенно ограничен. Для проведения атак при подобных обстоятельствах полезная нагрузка (в большинстве случаев) должна быть "втиснута" до адреса перехода. На 4 показан указатель, установленный после полезной нагрузки. Полезная нагрузка предшествует адресу ячейки памяти внедренных данных. Дело в том, что адрес памяти завершается символом NULL, и поэтому этот адрес должен завершать вектор вторжения. Полезная нагрузка ограничена в размерах и должна умещаться в пределах вектора вторжения.
В подобных ситуациях есть альтернативные варианты решения проблемы. Например, хакер может разместить полезную нагрузку где-нибудь в другой области памяти, используя другой метод. Или еще лучше, когда какая-то другая операция приложения позволяет записать вредоносный код командного интерпретатора в другую область кучи или стека. Если соблюдается одно из этих условий, то нет необхо­димости размещать полезную нагрузку в вектор
вторжения. В векторе вторжения можно просто указать область памяти (адрес), в которой находится заранее размещенная полезная нагрузка.
Прямой и обратный порядок байтов
На различных платформах многобайтовые числа сохраняются двумя различными способами. Выбранная схема представления определяет метод представления чисел в памяти (и то, как эти числа могут быть использованы при атаке).

Людям, которые привыкли читать слева направо, обратный порядок байтов ("little endian") может показаться достаточно необычным. При этом способе представления число 0х11223344в памяти будет отображено как
Обратите внимание, что старшие байты числа находятся справа. При прямом порядке байтов ('big endian") то же самое число отображается в памяти более привычным образом.
Использование регистров
В большинстве компьютеров данные, которые хранятся в регистрах процессора, обычно указывают на адрес памяти, где (и рядом с которым) находится точка, в которой происходит вторжение. Вместо того, чтобы угадывать, где закончится полезная нагрузка в памяти, хакер может использовать регистры. Хакер выбирает адрес вторжения, указывающий на код, который извлекает значение из регистра, или вызывает переход к области памяти, указанной в регистре. Если хакер знает, что значение интересующего регистра указывает на контролируемую пользователем область памяти, то в векторе вторжения этот регистр может использоваться для считывания контролируемой области памяти. В некоторых случаях хакеру вообще не нужно выяснять адрес полезной нагрузки или жестко кодировать этот адрес.
На 5 показано, что вектор вторжения хакера был преобразован в адрес 0x00400010. Адрес внедрения появляется в середине вектора вторжения. Полезная нагрузка начинается с адреса 0x00400030 и включает в себя также короткий переход в целях продолжения полезной нагрузки с другой стороны от адреса внедрения (очевидно, что мы не хотим, чтобы адрес внедрения был исполнен как код, поскольку в этом случае данный адрес будет бессмысленным для процессора).
В этом примере хакеру вообще не нужно точно знать, где в памяти находится вектор вторжения. Исходя из значений регистров процессора, регистр ЕАХ указывает на адрес стековой памяти 0x00400030. Во многих случаях проявляется зависимость от определенных значений, сохраненных в регистрах. Используя значение регистра ЕАХ, злоумышленник может перенаправить указатель к определенной области памяти, которая содержит байты 0х5ОСЗ. Когда этот код интерпретируется центральным процессором, он означает следующее:
push eax
ret
Это приводит к тому, что значение регистра ЕАХ вставляется в указатель команд и происходит активизация полезной нагрузки. Стоит заметить, что для этого примера байты 0x5ОСЗ могут быть записаны в любом месте памяти. Далее мы объясним, почему.

 

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