Memory Tagging Extension (MTE)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Memory Tagging Extension (MTE) is ontwerp om die betroubaarheid en sekuriteit van sagteware te verbeter deur geheue-verwante foute te detecteer en te voorkom, soos buffer oorgroeis en gebruik-na-vry kwesbaarhede. MTE, as deel van die ARM argitektuur, bied 'n meganisme om 'n klein etiket aan elke geheue-toewysing te heg en 'n ooreenstemmende etiket aan elke pointer wat na daardie geheue verwys. Hierdie benadering maak dit moontlik om onwettige geheue-toegang tydens uitvoering te detecteer, wat die risiko om sulke kwesbaarhede te benut om arbitrêre kode uit te voer, aansienlik verminder.
MTE werk deur geheue in klein, vaste grootte blokke te verdeel, met elke blok wat 'n etiket toegeken word, tipies 'n paar bits groot.
Wanneer 'n pointer geskep word om na daardie geheue te verwys, ontvang dit dieselfde etiket. Hierdie etiket word in die onbenutte bits van 'n geheue pointer gestoor, wat die pointer effektief aan sy ooreenstemmende geheue blok koppel.
Wanneer 'n program geheue deur 'n pointer benader, kontroleer die MTE hardeware dat die pointer se etiket ooreenstem met die geheue blok se etiket. As die etikette nie ooreenstem nie, dui dit op 'n onwettige geheue toegang.
Etikette binne 'n pointer word in 4 bits binne die boonste byte gestoor:
Daarom laat dit tot 16 verskillende etiketwaardes toe.
Elke 16B fisiese geheue het 'n ooreenstemmende geheue etiket.
Die geheue etikette word in 'n toegewyde RAM streek gestoor (nie toeganklik vir normale gebruik nie). Dit het 4bits etikette vir elke 16B geheue etikette tot 3% van RAM.
ARM stel die volgende instruksies bekend om hierdie etikette in die toegewyde RAM geheue te manipuleer:
Die CPU kontroleer die etikette tydens die uitvoering van die instruksie, as daar 'n wanverhouding is, word 'n uitsondering opgewek. Dit is die stadigste en mees veilige.
Die CPU kontroleer die etikette asinkronies, en wanneer 'n wanverhouding gevind word, stel dit 'n uitsondering-bietjie in een van die stelsels registre. Dit is vinniger as die vorige een, maar dit is nie in staat om die presiese instruksie aan te dui wat die wanverhouding veroorsaak nie en dit wek nie die uitsondering onmiddellik op nie, wat 'n bietjie tyd aan die aanvaller gee om sy aanval te voltooi.
???
Genoem Hardeware Tag-Based KASAN, MTE-gebaseerde KASAN of in-kernel MTE.
Die kernel toewysers (soos kmalloc
) sal hierdie module aanroep wat die etiket sal voorberei om te gebruik (ewekansig) en dit aan die kernel ruimte wat toegeken is en aan die teruggegee pointer te heg.
Let daarop dat dit slegs genoeg geheue korrels (16B elk) vir die aangevraagde grootte sal merk. So as die aangevraagde grootte 35 was en 'n slab van 60B gegee is, sal dit die eerste 16*3 = 48B met hierdie etiket merk en die res sal met 'n sogenaamde ongeldige etiket (0xE) gemerk word.
Die etiket 0xF is die pas alle pointer. 'n Geheue met hierdie pointer laat enige etiket toe om toegang tot sy geheue te verkry (geen wanverhoudings). Dit kan voorkom dat MET 'n aanval opspoor as hierdie etikette in die aangevalde geheue gebruik word.
Daarom is daar slegs 14 waardes wat gebruik kan word om etikette te genereer, aangesien 0xE en 0xF gereserveer is, wat 'n waarskynlikheid van hergebruik van etikette tot 1/17 -> rondom 7% gee.
As die kernel toegang tot die ongeldige etiket korrel het, sal die wanverhouding opgespoor word. As dit 'n ander geheue ligging benader, as die geheue 'n ander etiket het (of die ongeldige etiket) sal die wanverhouding opgespoor word. As die aanvaller gelukkig is en die geheue dieselfde etiket gebruik, sal dit nie opgespoor word nie. Die kanse is rondom 7%.
Nog 'n fout gebeur in die laaste korrel van die toegeken geheue. As die toepassing 35B aangevra het, is die korrel van 32 tot 48 gegee. Daarom gebruik die bytes van 36 tot 47 dieselfde etiket, maar hulle is nie aangevra nie. As die aanvaller toegang tot hierdie ekstra bytes het, word dit nie opgespoor nie.
Wanneer kfree()
uitgevoer word, word die geheue weer met die ongeldige geheue etiket gemerk, so in 'n gebruik-na-vry, wanneer die geheue weer benader word, word die wanverhouding opgespoor.
Echter, in 'n gebruik-na-vry, as die selfde stuk weer toegeken word met die SELFDE etiket soos voorheen, sal 'n aanvaller in staat wees om hierdie toegang te gebruik en dit sal nie opgespoor word nie (ongeveer 7% kans).
Boonop gebruik slegs slab
en page_alloc
gemerkte geheue, maar in die toekoms sal dit ook in vmalloc
, stack
en globals
gebruik word (op die oomblik van die video kan hierdie steeds misbruik word).
Wanneer 'n wanverhouding opgespoor word, sal die kernel paniek om verdere uitbuiting en herhalings van die uitbuiting te voorkom (MTE het geen vals positiewe nie).
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)