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

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


16-03-2023, 12:37. Автор: Евдоким
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



Перейти обратно к новости