Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Из множества техник антиотладки одна стоит особняком: ее суть — не задетектить дебаггер, а не допустить запуска в нем приложения. Поговорим о том, как это достигается, о parser differentials и фаззинге. А потом получим такие эльфы, чтобы их с руганью не открыли отладчик и дизассемблер, но чтобы они прекрасно запустились в родной среде обитания — Linux.
В целом парсеры — настоящий кладезь для поиска багов. И чем сложнее обрабатываемый формат, тем больше можно найти интересного. Взять, к примеру, XML. Он широко используется — скажем, для описания документов и презентаций, SOAP и RSS. И сколько проблем он несет: с его помощью реализованы XML-бомбы c billion laughs 20-летней давности, XXE-атаки, ошибки в отдельных реализациях, позволяющие сбежать из песочницы в iOS 13 и читать чужие SMS.
www
У LiveOverflow есть небольшое видео о том, как он создавал запускаемый файл, который тем не менее невозможно открыть в GDB и Radare2: Uncrackable Program? Finding a Parser Differential in loading ELF. Этот ролик и положил начало моему ресерчу.
Парсеры, как следует из названия, занимаются разбором (парсингом) некоего языка, который определяется грамматикой. И это касается не только языков программирования, но и форматов файлов и протоколов.
Безопасности языков, или Language-theoretic Security, посвящен сайт langsec. Если начнешь углубляться в эту тему, имена исследователей будут попадаться тебе довольно часто. Например, имя Сергея Братуся (Sergey Bratus) в контексте изучения интересностей ELF и так называемых weird machines и Мередит Паттерсон (Meredith L. Patterson) в контексте изучения протоколов и парсеров грамматик.
Так что же это за langsec такой? Проще, мне кажется, попробовать объяснить «на пальцах». В интервью IOHK Мередит Паттерсон рассказывала, как начинался langsec, — с обсуждения, что, согласно теории формальных языков, фильтры в виде регулярных выражений никогда не победят SQL-инъекции.
Другая вещь, которую изучают ребята из langsec, — поиск несоответствий теории и практики, а именно проблем в реализациях различных форматов и как это может быть проэксплуатировано. Одной из основных проблем называют следование закону Постела, который гласит:
Изначально такой подход должен был обеспечивать надежность работы TCP. Сейчас, однако, из‑за этого принципа времен зари интернета могут случаться интересные казусы. Один из них — это так называемые файлы‑полиглоты. Ведь файл — это лишь набор байтов, и то, как они будут интерпретированы, зависит от парсера. А парсеры порой крайне лояльно относятся к отклонениям от спецификаций и пробуют восстановить недостающие данные из контекста либо игнорируют откровенно невалидные значения отдельных полей.
Благодаря этому можно, например, совместить скрипт, содержащий питоний веб‑сервер и прочие плюшки, с валидным PDF. Это относительно легко можно сделать из‑за некоторых особенностей реализации этого стандарта, таких как нефиксированное положение сигнатуры PDF внутри файла и даже возможность полного ее отсутствия.
Помимо того что создание таких файлов — занятная разминка для мозгов, они, как утверждается, могут оказаться полезными при тестировании систем для обхода фильтров по типам файлов. Таким файлам посвящен далеко не один ресерч, и есть даже целый формат αcτµαlly pδrταblε εxεcµταblε, хитрым образом совмещающий в себе PE, ELF, Mach-O, sh и bootsector. По заверениям автора, этот формат способен без изменений запускаться на Linux, Mac, Windows, BSD и зачем‑то на голом BIOS.
info
На тему файлов‑полиглотов очень много информации можно найти у Ange Albertini (corkami), известного также как the file format guy. И весьма заслуженно — в его репозиториях можно отыскать множество постеров с наглядным представлением кучи форматов: исполняемых файлов, документов, картинок, архивов и не только, а также различных заметок.
Там же находится репозиторий PoC||GTFO, содержащий много занятных статей, помимо посвященных полиглотам. Забавно, но PDF с его статьями на самом деле тоже больше чем просто PDF.
В общем, абьюзить парсеры файлами‑полиглотами довольно весело. Но поговорим теперь о более целенаправленном зле, а затем испробуем его на практике.
Первое упоминание атаки с таким именем нашлось в презентации 2010 года Мередит Паттерсон и Лена Сассамана, посвященной грамматикам протоколов. Там была рассмотрена атака, именуемая arse tree differential attack — что‑то типа «атаки на разность деревьев разбора», на парсеры X.509. О ней мы поговорим чуть ниже.
В работе Security Applications of Formal Language Theory, опубликованной в 2013 году, авторы рассматривают непосредственно саму атаку уже более подробно.
info
Насколько я могу судить, термин parser differentials, несмотря на более десяти лет существования, не особо в ходу за пределами langsec-сообщества, хотя описаний атак, которые можно сюда отнести, предостаточно. Также мне не попадались варианты перевода этого на русский, но, думаю, можно назвать это чем‑то вроде «разности разбора».
Атаки на «разность деревьев разбора» — по‑своему удивительный вид атак. Сама идея их максимально простая: имеется две реализации парсеров одного формата, и они по‑разному «видят» одни и те же входные данные. Последствия же, особенно в цепочке с другими уязвимостями, могут быть самыми разными. Давай разберем несколько примеров.
HTTP requests smuggling, который в русскоязычных источниках иногда называют «контрабандой запросов», по сути можно отнести к атакам на parser differential. Они работают за счет того, что два сервера по‑разному парсят один и тот же проходящий через них HTTP-запрос. На одних и тех же входных данных они видят разное, что позволяет «контрабандой» внедрять в один запрос второй. С примером такой атаки ты можешь ознакомиться в разборе одной из HTB-тачек.
Эта уязвимость, CVE-2020-6833, существовала в GitLab: gitlab-workhorse
и gitlab-rails
распарсивали по‑разному один и тот же HTTP-запрос на сохранение файла. Эксплуатация уязвимости позволяла файлы читать. Подробнее это было разобрано в блоге GitLab.
Но requests smuggling не ограничивается HTTP-запросами. В докладе XMPP Stanza Smuggling or How I Hacked Zoom Айван Фратрик из Project Zero рассказывает о CVE-2022-22784, в которой ошибки парсеров позволяли вставлять теги в сообщения (stanza). Потенциально это позволяло достичь подделки сообщений сервера, перенаправления соединения и проблем с повреждением памяти, недоступных иным путем. Исследователь смог раскрутить это до выполнения своего кода в ходе автообновления Zoom в результате подмены сервера.
В январе этого года был опубликован ресерч того же исследователя из Project Zero. В нем он упоминал вариацию Psychic Paper — атаку, в результате которой на macOS можно было исполнять файлы с неподписанными разрешениями (entitlements) так, что сама система считала, что все окей. Происходило это потому, что внутри операционки парсеров PLIST (то есть старого доброго XML) было аж четыре штуки, которые, конечно же, в определенных случаях не выдавали идеально одинаковые результаты. Невероятным решением той проблемы стало — что бы вы подумали? — создание пятого парсера.
В дальнейшем, впрочем, в Apple решили переходить на бинарный DER-формат вместо текстового XML, но и в этом случае Фратрик смог найти в libCoreEntitlements
функции, которые парсят элементы DER по‑разному, хотя добиться эффекта Psychic Paper ему не удалось.
В 2010 году Леном Сассаманом и Мередит Паттерсон в докладе Towards a formal theory of computer insecurity: a language-theoretic approach была описана уже упомянутая атака на обработку сертификатов X.509 браузерами: те могли отображать пользователю не тот домен, для которого сертификаты были изданы, потому что неверно распарсивали поле CN
(Common Name), если в нем был нуль‑терминатор.
Центр сертификации не позволил бы запросить сертификат для условного www.bank.com
тому, кто не владеет таким доменом. Но что случится, спросили исследователи, если в CN указать www.bank.comx00badguy.com
?
Слайд из презентации Сассамана и Паттерсон
Из‑за некорректной обработки нуль‑терминатора браузеры «видели» и показывали пользователю строку www.bank.com
, хотя сертификат (подписанный доверенным центром!) был выдан на совсем другой домен. Такое непотребство, утверждают в докладе, не было бы возможным, если бы все реализации парсили поле одним и тем же образом.
Собственно, схожей логикой с описанной выше руководствовался некто Алехандро Эрнандез из IOactive, он же nitr0us. В далеком ныне 2012 году он решил поискать варианты воспрепятствовать анализу бинарей более интересным способом, чем использование методов runtime-антиотладки, которые все же можно обходить. В GDB того времени (7.5.1) nitr0us нашел багу в обработке DWARF, из‑за которой при попытке загрузить специально сформированный эльф в отладчик последний падал на разыменовании нулевого указателя.
Помимо GDB, nitr0us нашел тогда багу в IDA Pro 6.3, приводящую к внутренней ошибке, после которой та закрывается, опять же не давая проанализировать файл. Сам эльф при этом, конечно, прекрасно запускался самой ОС и работал. Подробнее с этой работой ты можешь ознакомиться в посте IOactive Striking Back GDB and IDA debuggers through malformed ELF executables.
Источник: xakep.ru