Обзор эксплойтовКонец декабря и начало нового года для компании Microsoft выдались несладкими: уязвимость в ядре Windows (EnableEUDC), о которой уже было написано в прошлом выпуске, так и не запатчена, плюс к ней добавилась целая пачка свежих нульдеев, о которых я спешу рассказать в этом обзоре. Итак, вот краткий таймлайн выхода в свет информации об уязвимостях:
Интересно почитать блог мелкомягких Security Research & Defense, в котором они часто публикуют информацию о минимизации рисков — например, Workaround для защиты от уязвимости в обработке эскизов (CVE-2010-3970) путем применения ACL-листов для уязвимой библиотеки shimgvw.dll. Также Microsoft стараются приуменьшить риск уязвимостей, ставя на некоторых ярлык DoS only, что иногда двигает хакеров к новым техникам обхода современных защит. Яркий пример — уязвимость в FTP(CVE-2010-3972): эксперты из MS считают, что переполнение, при котором мы затираем метаданные константой(0xFF в данной случае), без контроля над адресами перезаписи не эксплуатабельно! Но двум реверсам в команде — Крису Валазеку и Риану Смиту — удалось выжать максимум, получить контроль над EIP. Однако «вторник патчей» не поразил большим количеством бюллетеней — всего два, закрывающие три уязвимости. Одна из которых (Insecure Library Loading в Backup Managere'e) уже стала банальностью, причем уязвимости подвержена только Vista. Второй бюллетень исправляет сразу две уязвимости в MDAC, одна из которых довольно интересна и даже использовалась на хакерском турнире Pwn2Own. С нее и начнем обзор. Удаленное исполнение кода в Microsoft Data Access ComponentsTargetsWindows XP, 2003, Vista, 2008, 7 BriefУязвимость класса Integer Overflow, которая, в свою очередь, ведет к переполнению heap'a и связана с обработкой свойства CacheSize ActiveX компонента MSADO. Свойство CacheSize объекта RecordSet целочисленного типа отвечает за количество записей, которые будут храниться в кэше набора данных. Внутренне CacheSize используется при расчете памяти, выделяемой для хранения этой информации, что делается путем умножения на 4, так как в кэше хранятся лишь идентификаторы записей DWORD — 4 байта:
Как видишь, напрочь отсутствует проверка ситуации, когда CacheSize будет больше 0x40000000, что приведет к целочисленному переполнению, а значит — будет создан буфер некорректной длины, а затем переполнение и затирание памяти. Теперь дело за тактикой. Во-первых, к какой базе данных будем делать запросы? Тут нам на помощь придет технология XML Data Island, которая заключается в том, что с помошью XML, внедренного в html-страницу, мы эмулируем базу данных:
Во-вторых, как сделать, чтобы в кэш попадала какая-то информация для форсирования записи данных за границы выделенного Если добиться такого расположения объектов в памяти и затереть нулевые байты строки, а затем через JavaScript прочитать ее содержимое, то мы в конечном итоге наткнемся на 0x0000. Чтобы иметь возможность переписать память байтами 0x0000, надо создать очень много записей — более 0x00010001. Но не торопись: ведь после удаления какой-либо записи следующая новая запись получает инкремент идентификатора. Таким образом, создавая и удаляя записи в цикле, можно быстро добиться нужного значения:
Стоит отметить, что авторский эксплойт огромен: он использует сразу две уязвимости (в том числе описываемую именно с целью обхода ASLR), что ведет к возможности обойти DEP путем выстраивания ROP-последовательности. Mso.dll использует стандартную функцию VirtualProtect, с помощью которой маркируется память в том месте, где локализован наш шелл-код как Executable. Вторая уязвимость класса use-after-free (CVE-2010-1262) была запатчена еще в ms10-035. Отличный пример, когда комбинация из двух уязвимостей увеличивает эффективность успеха эксплуатации! Патчем же является использование проверочной функции, которая выполняет умножение и проверяет результат на переполнение. Solution Накати патч ms11-002: microsoft.com/technet/security/Bulletin/MS11002.mspx Удаленное исполнение кода в Microsoft Graphics Rendering EngineTargetsWindows XP, 2003, Vista BriefГрафическая подсистема Windows часто преподносит сюрпризы в области безопасности. На конференции POC2010 Моти & Ксу Хао выступили с докладом всего лишь про одну уязвимость, зато какую! Как известно,Explorer может отображать файлы по-разному, к примеру: если выбрать стиль отображения «Эскиз», то будут отображаться некоторые метаданные файла, а информацию о содержании (к примеру, doc- или pdf-документа) он берет из обыкновенного битмапа, присутствующего в файле. Эта структура обрабатывается с помощью функции ConvertDIBSECTIONToThumbnail библиотеки shimgvw. dll, которая, в свою очередь, вызывает функцию CreateSizedDIBSECTION.
Функция CreateSizedDIBSECTION обрабатывает biClrUsed как знаковое значение (signed). Рассмотрим уязвимый код:
Из листинга видно, что если в ecx отрицательное значение, то мы обойдем проверку с константной длиной буфера, расположенного на стеке, тем самым форсируя переполнение. Практическая ценность этой уязвимости весьма велика, так как с помощью WebDav можно атаковать Internet Explorer. Рассмотрим локальный сценарий: нас заманили в директорию, где лежит файл со специально сформированным эскизом. В этом случае переполнение происходит в процессе Explorer.exe, что дает преимущества при эксплуатации на Windows XP, так как у процесса Explorer.exe флаг DEP установлен не в режиме permanent. Из-за этого с помощью ROP-цепочки можно отключить DEP, используя SetProcessDEPPolicy или VirtualAlloc c RWX флагом. Рассмотрим пример от авторов metasploit'a:
SolutionОзнакомься с официальной адвизори от MS, там есть Fixit-решение. Либо запрети подгрузку уязвимой DLL путем нехитрой
Повышение привилегий в Agnitum Outpost Security Suite PROTargetsAgnitum Outpost Security Suite Pro и все продукты Agnitum, имеющие в комплекте уязвимый драйвер VBEngNT.sys BriefВ процессе поиска багов автор столкнулся с довольно интересным архитектурным багом: разработчики данной HIPS-системы защитили все свои псевдоустройства, кроме одного. Этот модуль играет роль своего рода DLL только в пространстве ядра. Handle на псевдоустройство \\.\vbengnt может получить права Guest и с помощью определенных ioctl-запросов переписать память по любому адресу в пространстве ядра, что ведет к очень простому сценарию эксплуатации. Что примечательно, ioctl-запросы ведут к прямому вызову экспортных функций, без какой-либо проверки указателей. Учитывая, что экспортных фукнций у данной dll аж 50 - соответственно количество уязвимостей тоже 50. Все эти функции обрабатывают параметры как указатели на определенные недокументированные структуры, не выполняя никаких проверок. Рассмотрим дизасм и определим самый простой сценарий эксплуатации.
Далее идет проверка значения Ioctl-кода на определенный диапазон и вызов уязвимой функции:
Функция по адресу 0x0001DAA0 является своего рода шлюзом:
После перебора пятидесяти функций обнаружилось, что с помощью функции ENGINE_XmlMsgEmpty можно переписать любую память константными значениями:
SolutionЖдем исправления или перебираемся на другой HIPS. |