Memory Tagging Extension (MTE)

Support HackTricks

Taarifa Msingi

Upanuzi wa Alama ya Kumbukumbu (MTE) umebuniwa ili kuboresha uaminifu na usalama wa programu kwa kugundua na kuzuia makosa yanayohusiana na kumbukumbu, kama vile kujaza mipaka ya ujazo na udhaifu wa kutumia baada ya kufutwa. MTE, kama sehemu ya usanifu wa ARM, hutoa mbinu ya kuambatanisha alama ndogo kwa kila ukadiriaji wa kumbukumbu na alama inayolingana kwa kila kielekezi kinachotaja kumbukumbu hiyo. Mbinu hii inaruhusu ugunduzi wa ufikiaji haramu wa kumbukumbu wakati wa muda wa uendeshaji, ikipunguza hatari kwa kiasi kikubwa ya kutumia udhaifu huo kwa kutekeleza nambari ya aina yoyote.

Jinsi Upanuzi wa Alama ya Kumbukumbu Unavyofanya Kazi

MTE inafanya kazi kwa kugawanya kumbukumbu katika vitengo vidogo vya ukubwa uliowekwa, kila kitengo kikipewa alama, kawaida ya ukubwa wa baadhi ya bits.

Wakati kielekezi kinapoundwa kuelekeza kwenye kumbukumbu hiyo, kinapata alama ile ile. Alama hii inahifadhiwa katika bits zisizotumiwa za kielekezi cha kumbukumbu, ikilinkisha kielekezi kwa kitengo chake cha kumbukumbu kinacholingana.

Wakati programu inapata kumbukumbu kupitia kielekezi, vifaa vya MTE vinachunguza kwamba alama ya kielekezi inalingana na alama ya kitengo cha kumbukumbu. Ikiwa alama hizo hazilingani, inaashiria ufikiaji haramu wa kumbukumbu.

Alama za Kielekezi za MTE

Alama ndani ya kielekezi zinahifadhiwa katika bits 4 ndani ya baiti ya juu:

Hivyo, hii inaruhusu hadi alama 16 tofauti za kielekezi.

Alama za Kumbukumbu za MTE

Kila 16B ya kumbukumbu ya kimwili ina alama ya kumbukumbu inayolingana.

Alama za kumbukumbu zinahifadhiwa katika eneo la RAM maalum (lisilopatikana kwa matumizi ya kawaida). Kuwa na alama za bits 4 kwa kila alama ya kumbukumbu ya 16B hadi 3% ya RAM.

ARM inaleta maagizo yafuatayo kushughulikia alama hizi katika kumbukumbu ya RAM maalum:

STG [<Xn/SP>], #<simm>    Store Allocation (memory) Tag
LDG <Xt>, [<Xn/SP>]       Load Allocatoin (memory) Tag
IRG <Xd/SP>, <Xn/SP>      Insert Random [pointer] Tag
...

Modes za Kukagua

Sync

CPU hukagua vitambulisho wakati wa kutekeleza maagizo, ikiwa kuna kutofautiana, inasababisha kipeperushi. Hii ni ya polepole zaidi na salama zaidi.

Async

CPU hukagua vitambulisho kwa njia isiyo ya moja kwa moja, na inapopata kutofautiana huanzisha biti ya kipeperushi katika moja ya rejista za mfumo. Ni haraka kuliko ile ya awali lakini haiwezi kubainisha maagizo sahihi yanayosababisha kutofautiana na haisababishi kipeperushi mara moja, ikimpa muda mshambuliaji kumaliza shambulio lake.

Mixed

???

Mifano ya Utekelezaji na Uchunguzi

Inaitwa KASAN ya Vitambulisho vya Vifaa, KASAN ya MTE au MTE ndani ya kernel. Wagawa wa kernel (kama vile kmalloc) wataita moduli hii ambayo itajiandaa na kutumia vitambulisho (kwa nasibu) kuyashikamanisha na nafasi ya kernel iliyotengwa na kiotomatiki kwa kiotomatiki.

Tambua kwamba ita weka alama ya kutosha kwa vipande vya kumbukumbu (kila moja ikiwa na 16B) kwa ukubwa ulioombwa. Kwa hivyo, ikiwa ukubwa ulioombwa ulikuwa 35 na slabu ya 60B ilitolewa, itaweka alama ya kwanza 16*3 = 48B na kitambulisho hiki na kingine kitakuwa kimeandikwa na kitambulisho kinachoitwa batili (0xE).

Kitambulisho 0xF ni kufanana na alama ya pointer. Kumbukumbu yenye alama hii inaruhusu kitambulisho chochote kutumika kufikia kumbukumbu yake (hakuna kutofautiana). Hii inaweza kuzuia MET kugundua shambulio ikiwa vitambulisho hivi vinatumika katika kumbukumbu iliyoshambuliwa.

Kwa hivyo kuna thamani 14 tu zinazoweza kutumika kuzalisha vitambulisho kwani 0xE na 0xF zimehifadhiwa, ikitoa uwezekano wa kutumia tena vitambulisho kwa 1/17 -> karibu 7%.

Ikiwa kernel ina ufikivu wa vipande vya kumbukumbu visivyo halali, kutofautiana kutagunduliwa. Ikiwa inafikia eneo lingine la kumbukumbu, ikiwa kumbukumbu ina kitambulisho tofauti (au kitambulisho batili) kutofautiana kutagunduliwa. Ikiwa mshambuliaji ana bahati na kumbukumbu inatumia kitambulisho sawa, haitagunduliwa. Nafasi ni karibu 7%.

Kosa lingine hutokea katika vipande vya mwisho vya kumbukumbu iliyotengwa. Ikiwa programu iliomba 35B, ilipewa vipande kutoka 32 hadi 48. Kwa hivyo, baiti kutoka 36 hadi 47 zinatumia kitambulisho sawa lakini hazikuombwa. Ikiwa mshambuliaji anafikia baiti hizi ziada, haitagunduliwa.

Wakati kfree() inatekelezwa, kumbukumbu inapewa tena kitambulisho cha kumbukumbu batili, kwa hivyo katika matumizi baada ya kuachilia, wakati kumbukumbu inafikiwa tena, kutofautiana hutambuliwa.

Hata hivyo, katika matumizi baada ya kuachilia, ikiwa kitengo kile kile kinarudishwa tena na KITAMBULISHO SAWA kama awali, mshambuliaji ataweza kutumia ufikivu huu na haitagunduliwa (nafasi ya karibu 7%).

Zaidi ya hayo, slab na page_alloc pekee hutumia kumbukumbu yenye vitambulisho lakini baadaye hii pia itatumika katika vmalloc, stack na globals (wakati wa video hizi bado zinaweza kutumiwa vibaya).

Wakati kutofautiana inagunduliwa kernel ita paniki ili kuzuia unyonyaji zaidi na jaribio la shambulio (MTE haina makosa ya uwongo).

Marejeo

Last updated