ВЗЛОМСтепан «Step» Ильин step@glc.ru ÊÎÐÏÎÐÀÒÈÂÍÎÌ ÁËÎÃÅ GOOGLE — ÇÀßÂËÅÍÈÅ ÎÁ ÀÒÀÊÅ ÍÀ ÐÅÑÓÐÑÛÊÎÌÏÀÍÈÈ ÑÎ ÑÒÎÐÎÍÛ ÊÈÒÀß. ÂÎ ÂÑÅÕ ÍÎÂÎÑÒÍÛÕ ËÅÍÒÀÕ — ÁÓÁÍÅÆÎ ÏÎÏÛÒÊÅ ÂÛÊÐÀÑÒÜ ÊÎÍÔÈÄÅÍÖÈÀËÜÍÛÅ ÄÀÍÍÛÅ Ó ÑÎÒÐÓÄÍÈÊÎÂGOOGLE, MCAFEE, ADOBE È ÅÙÅ ÄÂÓÕ ÄÅÑßÒÊΠÈÇÂÅÑÒÍÛÕ ÊÎÌÏÀÍÈÉ.À ÍÀÌ ÝÒÎ ÏÎ ÁÀÐÀÁÀÍÓ :). ÊÀÊÀß ÐÀÇÍÈÖÀ, ×ÒÎ ÕÎÒÅËÈ ÓÊÐÀÑÒÜ ÕÀÊÅÐÛ— ÃÎÐÀÇÄÎ ÈÍÒÅÐÅÑÍÅÅ ÐÀÇÎÁÐÀÒÜÑß, ÊÀÊ ÎÍÈ ÕÎÒÅËÈ ÝÒÎ ÑÄÅËÀÒÜ.À ÏÎÑÊÎËÜÊÓ Â ÎÑÍÎÂÅ ËÅÆÈÒ ÍÎÂÀß ÓßÇÂÈÌÎÑÒÜ Â INTERNET EXPLORER,ÒÎ È ÇÀÉÌÅÌÑß ÌÛ ÒÅÌ, ×ÒÎ ÏÐÅÏÀÐÈÐÓÅÌ ÐÀÁÎ×ÈÉ ÑÏËÎÈÒ.048XÀÊÅÐ 03 /134/ 10
Ãлавная задача сплоита — заставитьбраузер обратиться к объекту, которыйранее был удален. Причем в том местепамяти, над которым был получен контрольи в который удалось поместитьзловредный код (шелл-код), выполняющий загрузкубэкдора. И если первая цель становитсядоступной из-за ошибки в IE, то контроль наднужным участком памяти достигается благодаряприему Heap Spraying. Он и раньше не разиспользовался в сплоитах для браузера.ÒÅÕÍÈÊÀ HEAP SPRAYINGЧтобы лучше понимать, как работает непосредственноАврора, предлагаю разобратьсясначала с приемом Heap Spraying. Тогда кодсплоита покажется понятным и логичным.Указанный прием можно применить, когдауязвимая программа (в нашем случае — IE)по какой-то причине обращается к несуществующемуучастку памяти, находящемуся вадресном пространстве кучи. В то же времяадрес не должен быть выше 0x7fffffff, потомучто выше этого адреса находится адресноепространство ядра, к которому нет доступа изобычного приложения. Это одно из ограниченийприема Heap Spraying.Итак, что мы можем сделать, если приложениепо какой-то причине обращается к куче(по-английски — Heap), но по несуществующемуадресу? Ответ зависит от природыуязвимого приложения. Если мы не можемуправлять кучей приложения (на самомделе, максимум, что мы можем делать, этонеуправляемо инжектировать в нее данные),то пиши пропало: ничего не выйдет. И напротив,если такая возможность имеется, мыможем добавлять данные в кучу, выделяя подних память, до тех пор, пока невалидный доэтого момента адрес не начнет существовать.Посмотри на иллюстрацию, чтобы все сталоясно.Впрочем, знание точного адреса, по которомупередается управление, не дает нам возможностипроизвольно вставить шелл-код:операционная система сама распределяетадресное пространство для выделения динамическойпамяти. Так как же поместить в кучушелл-код, чтобы он все-таки выполнился?Есть секрет. Мы можем заполнить кучу одинаковымиблоками, которые состоят из последовательностиNOP-команд, означающих«отсутствие операции», и шелл-кода. Еслипереход будет выполнен на один из такихNOP'ов, то выполнение будет «скользить» поцепочке NOP до тех пор, пока не наткнетсяна машинную команду, которая выполняетнекоторые действия. А поскольку после каждойцепочки NOP'а у нас стоит шелл-код, тоименно он и будет их выполнять! Заполнениеподобным образом кучи называется HeapSpraying. Другой вопрос: почему он так частоиспользуется для эксплуатирования уязвимостейбраузера? Причина в том, что браузер —одно из немногих приложений, котороеможет управлять кучей. Реализуется все спомощью JS-скриптов, которые выполняютсяна стороне клиента. Может показаться, чтоприем очень простой, но это лишь в теории, апрактическая реализация во многих случаяхне так очевидна и требует ухищрений. Такили иначе, теперь, когда мы познакомились сключевым подходом, используемым в Aurora,можно изучить внутренности самого сплоитауже с некоторым знанием дела.ÄÅÎÁÔÓÑÊÀÖÈß ÊÎÄÀКод нашумевшего сплоита полностью написанна JavaScript, но, чтобы немного усложнитьего чтение, автор использовал простойспособ обфускации. Тело страницы, вызывающейзагрузку трояна, начинается с такназываемого декриптора, — он расшифровываетнезатейливо закодированный JS-код иначинает его выполнение. Приведу немногоурезанный код:var c = documentvar b = "60 105 ... 62 14 10 "var ss = b.split(" ");var a = "a a a ... | } ~ "var s=a.split(" ");s[32]=" "cc = ""for(i=0;i