Мелешко Е.А., Лозицкая Л.Г., Пидопрыгора Г.А.

Киевский Национальный авиационный университет, Украина

Уязвимости в Windows Shell

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

В последнее время появились программы, использующие уязвимость в Windows Shell. Это такие программы как Win32/TrojanDownloader.Chymine , Win32/Stuxnet, а также существует пять потенциальных уязвимостей обнаруженых в setuid shell сценариях, используемых KisMAC.

Следует отметить классификацию уязвимостей защиты в зависимости от программных ошибок:

1.     Переполнение буфера (buffer overflow). Эта уязвимость возникает из-за отсутствия контроля за выходом за пределы массива в памяти во время выполнения программы. Когда слишком большой пакет данных переполняет буфер ограниченного размера, содержимое посторонних ячеек памяти перезаписывается, и происходит сбой и аварийный выход из программы.

2.     Уязвимости испорченного ввода (tainted input vulnerability.Они могут возникать в случаях, когда вводимые пользователем данные без достаточного контроля передаются интерпретатору некоторого внешнего языка (обычно это язык Unix shell или SQL). В этом случае пользователь может таким образом задать входные данные, что запущенный интерпретатор выполнит совсем не ту команду, которая предполагалась авторами уязвимой программы.

3.     Ошибки форматных строк (format string vulnerability). Данный тип уязвимостей защиты является подклассом уязвимости испорченного ввода. Он возникает из-за недостаточного контроля параметров при использовании функций форматного ввода-вывода printf, fprintf, scanf, и т. д. стандартной библиотеки языка Си. Эти функции принимают в качестве одного из параметров символьную строку, задающую формат ввода или вывода последующих аргументов функции. Если пользователь сам может задать вид форматирования, то эта уязвимость может возникнуть в результате неудачного применения функций форматирования строк.

4.     Уязвимости как следствие ошибок синхронизации (race conditions). Проблемы, связанные с многозадачностью, приводят к ситуациям, называемым «состояние гонки»: программа, не рассчитанная на выполнение в многозадачной среде, может считать, что, например, используемые ею при работе файлы не может изменить другая программа. Как следствие, злоумышленник, вовремя подменяющий содержимое этих рабочих файлов, может навязать программе выполнение определенных действий.

Рассмотрим подробнее такую уязвимость как переполнения буфера. Оно является наиболее популярным способом взлома компьютерных систем.

Основных типов переполнения четыре:

- последовательное переполнение при чтении;

-  последовательное переполнение при записи;

-  индексное переполнение при чтении;

-  индексное переполнение при записи.

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

-нет последствий

-программа выдает неверные данные

-программа зависает или аварийно завершается с сообщением об ошибке

-программа изменяет логику своего поведения, выполняя незапланированные действия.

То есть, при стечении обстоятельств программа передает атакующему контрольный пакет акций управления уязвимой машиной. Считается, что переполнения при чтении менее опасны и приводят, в основном, лишь к утечке секретной информации (например, паролей или идентификаторов TCP/IP соединений). Это мнение ошибочно: даже вполне безобидные на вид переполнения способны порождать каскад вторичных переполнений, пускающий систему в разнос и зачастую успевающий сделать что-то полезное для хакера, особенно если этот разнос осуществляется по заранее продуманному плану. Индексное переполнение, тесно связанное с сишными "недомассивами" и проблемой контроля их границ заключающется в доступе к произвольной ячейке памяти за концом буфера, где под "доступом" понимаются как операции чтения, так и операции записи.

 

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

В зависимости от типа перезаписываемых переменных различают, по меньшей мере, три вида атак: атаки на скалярные переменные, атаки на индексы (указатели) и атаки на буфера.

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

Атака на указатели может преследовать три цели:

 а) передачу управления на посторонний код (аналог CALL);

 б) модификацию произвольной ячейки (аналог POKE);

 в) чтение произвольной ячейки (аналог PEEK).

Скалярные переменные могут хранить индексы (и тогда они фактически приравниваются к указателям), флаги авторизации пользователей, уровни привилегий, счетчики циклов, определяющие логику поведения программы (в том числе и отладочные люки, оставленные разработчиком), и прочую информацию, что грозит изменением владельца привилегированных файлов, загрузки произвольных модулей ядра, изменения владельца произвольных файлов, установке произвольного ядра и тд.

Переполняющиеся буфера могут располагаться в одном из трех мест:

а)  адресного пространства процесса: стеке (автоматической памяти);

б)  сегменте данных (хотя в 9x/NT это никакой не сегмент);

в)  куче (динамической памяти).

Что приводит к переполнению памяти. Наиболее распространено стековое переполнение.

Подводя итоги, рассмотрена проблема уязвимостей современного программного обеспечения, приведена классификация уязвимостей в зависимости от программных ошибок, детально разобраны виды переполнения буфера. На сегодняшний день распространение угроз, использующих уязвимость в Windows Shell, осуществляется не только через USB-носители. Теперь заражение может происходить через общие сетевые папки, а также благодаря специально сформированным файлам для офисного пакета Microsoft. Кроме того, сервер злоумышленников, с которого распространяется вредоносная программа, может формировать адрес веб-страницы определенного вида, посредством которого компьютер может быть атакован через браузер.