Неправильные эльфы. Учим исполняемые файлы Linux сопротивляться отладке

Содержание статьи

  • Language-theoretic Security и файлы-полиглоты
  • Parse tree differential attack
  • Requests smuggling в GitLab и Zoom
  • Psychic Paper и CVE-2022-42855
  • Доверенные сертификаты X.509 на произвольный домен
  • ELF: запустить нельзя проанализировать
  • Парсеры ELF
  • Ядро ОС
  • Системные утилиты
  • Отладчики, декомпиляторы, дизассемблеры, эмуляторы
  • Ищем различия
  • Фаззеры
  • Melkor
  • Тестируем EDB
  • Проверяем GDB
  • Radare2: r2hang
  • Interactive Disassembler
  • Выводы

Из мно­жес­тва тех­ник анти­отладки одна сто­ит особ­няком: ее суть — не задетек­тить дебаг­гер, а не допус­тить запус­ка в нем при­ложе­ния. Погово­рим о том, как это дос­тига­ется, о 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 и файлы-полиглоты

Пар­серы, как сле­дует из наз­вания, занима­ются раз­бором (пар­сингом) неко­его язы­ка, который опре­деля­ется грам­матикой. И это каса­ется не толь­ко язы­ков прог­рамми­рова­ния, но и фор­матов фай­лов и про­токо­лов.

Бе­зопас­ности язы­ков, или 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.

В общем, абь­юзить пар­серы фай­лами‑полиг­лотами доволь­но весело. Но погово­рим теперь о более целенап­равлен­ном зле, а затем испро­буем его на прак­тике.

 

Parse tree differential attack

Пер­вое упо­мина­ние ата­ки с таким име­нем наш­лось в пре­зен­тации 2010 года Мередит Пат­терсон и Лена Сас­самана, пос­вящен­ной грам­матикам про­токо­лов. Там была рас­смот­рена ата­ка, име­нуемая arse tree differential attack — что‑то типа «ата­ки на раз­ность деревь­ев раз­бора», на пар­серы X.509. О ней мы погово­рим чуть ниже.

В работе Security Applications of Formal Language Theory, опуб­ликован­ной в 2013 году, авто­ры рас­смат­рива­ют непос­редс­твен­но саму ата­ку уже более под­робно.

info

Нас­коль­ко я могу судить, тер­мин parser differentials, нес­мотря на более десяти лет сущес­тво­вания, не осо­бо в ходу за пре­дела­ми langsec-сооб­щес­тва, хотя опи­саний атак, которые мож­но сюда отнести, пре­дос­таточ­но. Так­же мне не попада­лись вари­анты перево­да это­го на рус­ский, но, думаю, мож­но наз­вать это чем‑то вро­де «раз­ности раз­бора».

Ата­ки на «раз­ность деревь­ев раз­бора» — по‑сво­ему уди­витель­ный вид атак. Сама идея их мак­сималь­но прос­тая: име­ется две реали­зации пар­серов одно­го фор­мата, и они по‑раз­ному «видят» одни и те же вход­ные дан­ные. Пос­ледс­твия же, осо­бен­но в цепоч­ке с дру­гими уяз­вимос­тями, могут быть самыми раз­ными. Давай раз­берем нес­коль­ко при­меров.

 

Requests smuggling в GitLab и Zoom

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 в резуль­тате под­мены сер­вера.

 

Psychic Paper и CVE-2022-42855

В янва­ре это­го года был опуб­ликован ре­серч того же иссле­дова­теля из Project Zero. В нем он упо­минал вари­ацию Psychic Paper — ата­ку, в резуль­тате которой на macOS мож­но было исполнять фай­лы с непод­писан­ными раз­решени­ями (entitlements) так, что сама сис­тема счи­тала, что все окей. Про­исхо­дило это потому, что внут­ри опе­раци­онки пар­серов PLIST (то есть ста­рого доб­рого XML) было аж четыре шту­ки, которые, конеч­но же, в опре­делен­ных слу­чаях не выдава­ли иде­аль­но оди­нако­вые резуль­таты. Неверо­ятным решени­ем той проб­лемы ста­ло — что бы вы подума­ли? — соз­дание пятого пар­сера.

В даль­нейшем, впро­чем, в Apple решили перехо­дить на бинар­ный DER-фор­мат вмес­то тек­сто­вого XML, но и в этом слу­чае Фрат­рик смог най­ти в libCoreEntitlements фун­кции, которые пар­сят эле­мен­ты DER по‑раз­ному, хотя добить­ся эффекта Psychic Paper ему не уда­лось.

 

Доверенные сертификаты X.509 на произвольный домен

В 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, хотя сер­тификат (под­писан­ный доверен­ным цен­тром!) был выдан на сов­сем дру­гой домен. Такое непот­ребс­тво, утвер­жда­ют в док­ладе, не было бы воз­можным, если бы все реали­зации пар­сили поле одним и тем же обра­зом.

 

ELF: запустить нельзя проанализировать

Собс­твен­но, схо­жей логикой с опи­сан­ной выше руководс­тво­вал­ся нек­то Але­хан­дро Эрнандез из 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.

 

Парсеры ELF

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *