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

Обзор эксплойтов

Крис Касперски

Хакер, номер #106, стр. 046

Сегодняшний обзор эксплойтов будет посвящен дефектам реализации видеоплееров. Живое общение через Webcam, просмотр потокового сетевого видео, открытие AVI-файлов, полученных из ненадежных источников, — все это категорически небезопасно и чревато полным захватом управления над компьютером-жертвой. Не ожидал? Вот и я не ожидал, пока мой компьютер едва не поломали!

Media Player Classic: удаленное переполнение буфера

Brief

Долгое время народ смотрел видео в штатном плеере, входящем в состав Windows 98 и благополучно перекочевавшем оттуда в Windows 2000, но уже в XP появилось какое-то уродище, отъедающее кучу ресурсов, ужасно тормозное, неповоротливое и неудобное в работе, забывшее половину прежних горячих клавиш и активно налегающее на мышь. Короче, продвинутая часть молодежи забила на это чудо дизайна и бросилась искать альтернативные плееры.

Лично я остановился на BSPlayer'е, с которого чуть позже перешел на MPlayer, а тем временем появился независимый проект Media Player Classic (MPC). Внешне напоминающий старый Windows-плеер, только бесплатный, распространяемый в исходных текстах и с кучей новых реально полезных функций, он успел образовать вокруг себя целое сообщество поклонников.

Последнюю версию можно скачать с Кузни: http://sourceforge.net/projects/guliverkli, однако делать это категорически не рекомендуется, потому что 12 сентября 2007 года исследовательская лаборатория Code Audit Labs обнаружила в нем множество дыр, связанных с дефектной обработкой заголовков AVI-файлов.

Оказалось, что в плеере напрочь отсутствует проверка следующих полей: indx truck size, wLongsPerEntry и nEntriesInuse, некорректные значения которых вызывают целый каскад разрушительных последствий (переполнение кучи, целочисленное переполнение и т.д.), ведущих к возможности удаленного захвата управления уязвимым компьютером с MPC-привилегиями или же (в случае неудачной атаки) к аварийному завершению работы самого плеера. Только попробуй открыть AVI-файл, полученный из ненадежный источников, и... ага!

Target

В настоящее время уязвимость подтверждена в guliverkli Media Player Classic 6.4.9.0, об остальных версиях пока ничего не известно, но есть все основания полагать, что указанная уязвимость распространяется и на них.

Exploits

На рисунках приведены три примера заголовков AVI-файлов, вызывающих переполнение, но не содержащих никакого shell-кода, воткнуть который — забота хакера. Естественно, AVI-заголовок — это еще не AVI-файл, и, чтобы дописать необходимые части (или пропатчить hiew'ом заголовок уже существующего видеоклипа), нам потребуется спецификация на AVI-формат, которую можно бесплатно скачать с www.alexander-noe.com/video/documentation/avi.pdf или с www.the-labs.com/Video/odmlff2-avidef.pdf.

Solution

Разработчики все еще никак не отреагировали на сообщение о дыре, и на момент написания этого обзора официальные заплатки отсутствуют. Поэтому остается лишь порекомендовать либо отказаться от использования MPC, либо не проигрывать AVI-файлы, полученные из ненадежных источников (кстати говоря, расширение файла не играет никакой роли, и файл, записанный в формате AVI, вполне может иметь расширение mpeg или любое другое).

MPlayer: переполнение кучи

Brief

MPlayer – замечательный кросс-платформенный проигрыватель видео/аудио, поддерживающий рекордное количество форматов и великолепно справляющийся с битыми файлами, которые остальные плееры проигрывать отказываются (к тому же в его состав входит mencoder — единственный известный мне кодировщик, следящий за синхробитами и не допускающий рассогласования аудио- и видеопотоков). Это бесплатный проект, распространяющийся в исходных текстах: www.mplayerhq.hu, но, увы, не лишенный дефектов проектирования, последний из которых был обнаружен 12 сентября 2007 года исследовательской лабораторией Code Audit Labs, обратившей внимание на отсутствие проверки одного из полей заголовка AVI-файла. А именно indx truck size, некорректные значения которого приводят к переполнению кучи с возможностью удаленного захвата управления (впрочем, тут все зависит от опций компиляции, а также версии библиотеки glibc).

Дыра прячется в файле libmpdemux/aviheader.c (дефектные строки выделены полужирным шрифтом).

За более подробной информацией по этой теме обращайся на www.securityfocus.com/archive/1/479222 и www.securityfocus.com/bid/25648.

Targets

Уязвимость подтверждена в MPlayer 1.0 -rc1, входящем в состав множества дистрибутивов (в частности, в MandrakeSoft Linux Mandrake 2007.1 x86_64), а также в MPlayer'е, скомпилированном под Windows 2000 SP4 с использованием библиотеки glibc с версией, меньшей, чем 2.5. Про остальные версии на данный момент ничего не известно, но вполне вероятно, что они также уязвимы.

Exploit

Ниже приведен пример заголовка AVI-файлов, вызывающего переполнение, но не содержащего никакого shell-кода.

Solution

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

Apple QuickTime: удаление исполнение команд в браузерах

Brief

GNUCITIZEN – весьма креативная хакерская группа, активно и продуктивно исследующая QuickTime и обнаружившая в нем множество ошибок, часть из которых была признана разработчиками, а часть злостно проигнорирована, поскольку, по их мнению, они (ошибки, а не разработчики), не представляют серьезной проблемы. Парни из GNUCITIZEN слегка обиделись и решили доказать, что это не так. Результатом их работы стал боевой эксплойт, выложенный в открытый доступ 12 сентября 2007 года на www.gnucitizen.org/blog/0day-quicktime-pwns-firefox и запускающий стандартный «Калькулятор». За ним последователи намного более коварные эксплойты, например, уводящие систему в шатдаун при нажатии на ссылку, ведущую к mp3-файлу. Фактически атакующий получает полный контроль над уязвимой системой и может выполнять на ней любые команды, которым достаточно текущего уровня привилегий, имеющихся у браузера (Горящего Лиса или IE). Естественно, QuickTime должен быть установлен.

Фокус в том, что QuickTime при открытии файла сохраняет его на диске (с учетом расширения, которое может и не соответствовать действительности), после чего пытается проиграть, определяя формат не по расширению, а по содержимому! Таким образом мы можем засунуть xml-страничку в файл с любым из расширений, поддерживаемых QuickTime (а их, поверь, очень много).

Горящий Лис захавает xml со всеми командами, содержащимися в нем, позволяя создавать системно-независимые эксплойты, работающие на любой платформе. С IE ситуация несколько сложнее, однако он также уязвим (в mp3-файл можно засунуть любой exe или html-страничку, выполняемую с локальными привилегиями, то есть имеющую доступ ко всем дисковым файлам и сетевым ресурсам).

Targets

В настоящее время уязвимость подтверждена в IE7, FireFox 2.0.0.6 и 3.0. Опера выглядит неуязвимой.

Exploits

Исходный текст оригинального эксплойта, запускающего «Калькулятор» (со всеми комментариями его создателя), можно найти по ссылке www.gnucitizen.org/blog/0day-quicktime-pwns-firefox.

А вот ссылки на несколько безобидных эксплойтов, предназначенных для проверки твоей системы на вшивость:

Следующий эксплойт (www.gnucitizen.org/projects/0day-quicktime-pwns-firefox/SHUTDOWN_DONT_CLICK.mp3) в случае удачной атаки отправляет систему в шатдаун, так что, прежде чем кликать по ссылке, сохрани все несохраненные данные, которые было бы жалко потерять.

Solutions

Не устанавливать QuickTime (удалить, если был установлен ранее) или же использовать Оперу и/или другие безопасные браузеры, например Lynx или Links, которые к тому же и бесплатны.

Microsoft MSN Messenger: переполнение буфера

Brief

28 августа этого года китайский хакер по кличке wushi (входящий в состав группы Team509) обнаружил несколько дыр в ML20/WMV3-кодеках, используемых в таких программных продуктах, как, например, Microsoft MSN Messenger и Microsoft Windows Live Messenger, опубликовав детальную информацию на своей странице www.team509.com/modules.php?name=News&file=article&sid=50, написанной на смеси китайского и английского языков.

Web-камера, управляемая Messenger'ом, может работать как на TCP-, так и на UDP-протоколе. Обычно (то есть по умолчанию) выбирается UDP как наиболее быстродействующий. Messenger использует три типа UDP-пакетов: 1) syn-пакеты (сокращение от synchronization — отвечающие за синхронизацию), 2) ack-пакеты (сокращение от acknowledgement — подтверждение) и 3) data-transfer пакеты, передающие аудио-/видеоданные.

Первые два типа пакетов нам совершенно неинтересны, а вот к data-transfer пакетам мы присмотримся повнимательнее. Анализ дампов, награбленных снифером, позволяет реконструировать их структуру.

Заголовок data-transfer пакета, обрабатываемого ML20-кодеком, состоит из 9 байт, за которыми следует полезная видеонагрузка (payload). Пример одного из таких заголовков приведен ниже:

[UDP header] 9D 49 E1 8E 4A 09 BE 09 0A [video-payload]

Хакеры успешно расшифровали назначение каждого байта заголовка. Описание назначений находится в следующей таблице.

Первые 2 байта интерпретируются как короткое целое (short integer), равное в данном случае 499Dh, причем 11 младших бит хранят актуальную длину video-payload, которую можно вычислить, наложив на 16-битное значение число 7FFh через операцию логического «И». Например, длина video-payload равна: 499Dh & 7FFh = 19Dh.

Оставшиеся 5 старших бит определяют тип пакета, вычисляемый по следующей формуле: packet_type == 499Dh >> 11 & 7. Сами типы пакетов перечислены ниже:

В рассматриваемом нами примере индекс фрейма в видеопотоке равен BEh, индекс чанка — 09h, а общее количество чанков во фрейме — 0Ah. Используя эту информацию, кодек собирает полный видеофрейм из UDP-пакетов, полученных из сети, последовательность отправки которых, как известно, не всегда совпадает с последовательностью их приема.

Однако процедура сборки пакетов реализована с ошибкой и проверяет только количество чанков во фрейме (num_chunks), не обращая внимания на их индексы (chunk_index). Экспериментально выяснено, что, если индекс чанка равен или превышает 83h, происходит переполнение динамической памяти (кучи) с возможностью засылки shell-кода и захвата управления компьютером-жертвой с привилегиями MSN Messenger'а.

Следует помнить, что разработчики XP серьезно потрудились над защитой кучи от переполнения. В Висте защита претерпела значительные изменения и была существенно усилена, поэтому традиционные эксплойты согласятся работать лишь с Windows 2000 и более ранними системами.

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

WMV3-кодек ведет себя аналогичным образом, но имеет несколько другую структуру заголовка пакета, длина которого на 1 байт больше, чем в ML20. Возросло и количество типов пакетов. К известным нам пакетам ack/syn/data-transfer добавились audio-пакеты и пакеты аутентификации (auth-пакеты). Структура заголовка еще окончательно не расшифрована (и является предметом горячих дискуссий китайских хакеров), однако кое-какие шаги в этом направлении уже сделаны:

Рассмотрим следующий пример:

[UDP header] 62 81 69 00 94 B4 CD 08 0A 04 [payload]

Назначение расшифрованных байт WMV3-заголовка приводится ниже:

Тип пакета определяется по следующей формуле, где X – значение первого байта заголовка:

Длина полезной нагрузки вычисляется путем деления содержимого второго байта на 20, что равносильно битовому сдвигу на 5 позиций влево. В данном случае мы имеем: 6981h >> 5 = 34Ch. По непроверенным данным, WMV3-пакет может содержать сразу как аудио-, так и видеоданные, что слегка усложняет реализацию атакующей программы.

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

Более подробную информацию по теме можно найти на уже упомянутой странице Team509, ну а к услугам тех, кто не умеет читать по-китайски, бюллетень безопасности от MS: www.microsoft.com/technet/security/Bulletin/MS07-054.mspx. Технической информации здесь нет, зато есть куча «воды». Можно заглянуть и на www.securityfocus.com/bid/25461, только ничего полезного там также нет.

Targets

Уязвимы следующие системы: MSN Messenger 6.2, 7.0, 7.5, а также Windows Live Messenger версии 8.0. На MSN Messenger 7.0.0820 и Windows Live Messenger 8.1 угроза атаки уже не распространяется, и ошибки сборки пакетов в них исправлены (хотя, как известно, Microsoft практически никогда не фиксит подобные дыры с первой попытки).

Exploit

Исходный текст эксплойта, написанного китайскими хакерами на Microsoft Visual C++ 7 и протестированного ими же под Windows 2000 SP4, лежит в rar-архиве по следующему адресу: www.securityfocus.com/data/vulnerabilities/exploits/exp_msn.rar.

Как откомпилировать его другими компиляторами более ранних версий? Очень просто! Находим в архиве файл exp_msn.cpp, удаляем все остальные (это не шутка, они действительно нам не нужны). Открываем exp_msn.cpp в текстовом редакторе, удаляем все включаемые файлы, обозначенные директивой «#include xxxx», после чего прописываем «#include <windows.h>» и компилируем файл с ключом /LD, предписывающим линкеру создавать не исполняемый файл, а динамическую библиотеку, которой по сути этот эксплойт и является.

$cl.exe exp_msn.cpp /Ox /LD

Вот только shell-код, содержащийся внутри exp_msn.cpp, ориентирован исключительно на Windows 2000. Защиту от переполнения кучи в XP SP2 (не говоря уже о Висте!) он, естественно, пробить не в состоянии. Впрочем, «правильный» shell-код нетрудно взять из любого другого эксплойта.

Solution

Обновить MSN Messenger до версии 7.0.0820, а Windows Live Messenger до версии 8.1 через Windows Update или отказаться от их использования.

Содержание