О проекте
Здесь я буду публиковать анализ публичных эксплойтов, а также некоторые из моих 1day-эксплойтов.
[ Анализ публичных эксплойтов ]
- Лично я считаю, что лучший способ изучить публичный эксплойт — это понимать его построчно, пока я не осознаю его до мельчайших деталей. Я буду публиковать некоторые из таких (местами излишне закомментированных ;) ) эксплойтов в надежде, что другие смогут по ним учиться, а также как попытка отдать что-то сообществу. Плюс для целей документирования, потому что со временем эти вещи стираются из головы.
CVE-2016-8655
CVE-2016-5342
mp3-версия
- Это прокомментированная версия android LPE-эксплойта от freener
- arm32
- Переполнение кучи
- Этот эксплойт напрямую перезаписывает указатель на функцию другого объекта.
tty-версия
- Это прокомментированная версия android LPE-эксплойта от freener
- arm32
- Переполнение кучи
- Этот эксплойт перезаписывает указатель на объект внутри другого объекта. Он использует атаку ret2dir, чтобы заставить повреждённый указатель указывать на предсказуемый фиксированный адрес в ядре, где находится полезная нагрузка эксплойта. Данная техника обходит PXN и PAN.
CVE-2016-2434
- Это прокомментированная версия android LPE-эксплойта от Jianqiang Zhao
- arm64
- Обнуление 16 байт по произвольному адресу
- Этот эксплойт затирает 16 байт полезного глобального объекта, расположенного по фиксированному адресу в ядре.
- Повреждённый указатель на объект внутри глобального объекта ссылается на полезную нагрузку эксплойта из пользовательского пространства. Такая атака не сработает на устройствах/ядрах с PAN (или эмуляцией PAN).
- Моя попытка разобраться в джейлбрейке extra_recipe
- Меня особенно интересовала часть с обходом KPP. Хотя было несколько слайдов на эту тему, где я мог получить смутное представление об обходе, я действительно хотел вникнуть в детали и увидеть, что на самом деле происходит внутри кода.
- Также я хотел понять финальные составляющие джейлбрейка (установка Cydia и т.д.).
yalu102 (ViewController.m)
- Я закомментировал часть, относящуюся к самой ошибке и тому, как она эксплуатировалась.
- Причина, по которой я изучал yalu102 вместо оригинального эксплойта, в том, что техника port-feng-shui выглядела более чистой и простой для понимания.
- Анализ останавливается прямо перед обходом kpp.
- Я перехожу сюда, потому что здесь было немного больше информации о различных числовых смещениях.
- Кроме того, patchfinder.c сохранился в исходном виде, в отличие от yalu102, где есть только объектный файл.
- Часть с Cydia несколько неполна, поэтому после kpp я перехожу в ветку cydia.
- Попытка понять составляющие джейлбрейка после tfp0 и пост-эксплуатации.
empty_list (sploit.c)
- Детальный разбор эксплойта ядра empty_list от Ian Beer.
- В нём используются потрясающие техники: начав с очень слабых примитивов, он строит более мощный AAR и, наконец, полноценный task port. Магия портов в коде эксплойта невероятна. И всё это с переполнением кучи на 8 NULL-байт. Просто сносит голову.
- Я набросал несколько наивных идей по повышению надёжности. Надеюсь, кто-нибудь выпустит в будущем более надёжную версию эксплойта. :)
- Спасибо Ian Beer за потрясающий эксплойт!
CVE-2018-4233
- Это прокомментированная версия iOS Webkit-эксплойта от @niklas_b.
- Огромное спасибо kudima (@begger_dd) за очень понятный, лаконичный и тщательно аннотированный разбор! :)
- В разборе объясняется ошибка JIT type confusion, некоторые ограничения на преобразования boxing/unboxing (которые могут приводить к нестабильности), а также подробно описывается, как строятся ранние/поздние примитивы AAR/AAW. Он также даёт понимание изменений в техниках эксплуатации после последнего раунда смягчений (index masking, отравление backing store у ArrayBuffer, некоторые изменения механизма W^X JIT, изменения в структуре JSObject и т.д.).
jsc_ConcatMemcpy_infoleak
- Это прокомментированная версия WebKit infoleak-эксплойта от kudima (исправлен в 2018.8.27).
- Он возник из-за неполного исправления одной из ошибок, сообщённых lokihardt. Патч из отчёта lokihardt исправил примитив type confusion Double -> Object, но не исправил обратное направление: Object -> Double.
- Он засоряет кучу webkit «бабочками» (butterflies), содержащими один объект и маркер, а затем вызывает ошибку concat и заполняет значительную часть нескольких double-массивов неинициализированными данными кучи. Он перебирает неинициализированные double-массивы, полученные в результате срабатывания ошибки concat, пока не находит адрес ранее размещённого объекта, и раскрывает его.
- Ещё раз спасибо kudima (@begger_dd) за отличный эксплойт и разбор! :)
jsc_prop_enum_uaf
- Это ещё один вклад от kudima. Это прокомментированная версия WebKit-эксплойта kudima для удалённого выполнения кода (исправлен в этом коммите). Он исправлен в iOS 12.1 и работает вплоть до iOS 12.0.1.
- Проблема в том, что при выполнении кода в baseline-jitted циклах forin можно внедрить код, который освобождает объект StructureID, лежащий в основе JSObject, и запускает сборщик мусора, но сборщик мусора не помечает член "JSPropertyNameEnumerator->m_cachedStructureID", и объект StructureID, на который указывает "JSPropertyNameEnumerator->m_cachedStructureID", освобождается на этапе sweep, что приводит к висячему указателю.
- После освобождения объекта StructureID сборщиком мусора можно внедрить код, который создаёт новый объект StructureID, занимающий слот ранее освобождённого "StructureID object".
- Освободив StructureID объекта A, а затем заставив объект B создать новый StructureID, который займёт его место, можно создать ситуацию type confusion, поскольку "JSPropertyNameEnumerator->m_cachedInlineCapacity" установлен в размер инлайновых свойств объекта A, в то время как "JSPropertyNameEnumerator->m_cachedStructureID" указывает на новый объект Structure ID, представляющий объект B. Это позволяет пройти проверку в 'op_get_direct_pname' и даёт объекту B доступ к инлайновым свойствам за пределами его границ.
- Это можно использовать для построения более мощных примитивов, таких как AAR/AAW, и далее применять их для выполнения произвольного кода.
- Спасибо kudima (@begger_dd) за классный эксплойт и очень подробный разбор! :)
[ 1Day ]
CVE-2017-2547
- Однажды я посмотрел на эксплойт singi после его презентации на Zer0con 2018 и решил его улучшить.
- Это автономная версия эксплойта до того, как я интегрировал его в pwnjs.
- Улучшения включают:
- Повышенная надёжность (безупречно работает после длительных сеансов браузинга с загрязнённой памятью)
- Убраны все хардкод-смещения, чтобы обеспечить совместимость с различными версиями браузеров
- Использована другая техника эксплуатации (стандартная техника misalign)
- В итоге интегрирован в фреймворк pwnjs путём создания webkit-прототипа
- Код стал гораздо более читаемым, добавлено много комментариев
- Особая благодарность
- qwertyoruiop и Samuel Grob за потрясающую статью в phrack и публичные эксплойты
- Brian Pak и Andrew Wesie за отличный фреймворк pwnjs!