Memory Tagging Extension (MTE)

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Kurefusha Kumbukumbu ya Upanuzi (MTE) imeundwa 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 lebo ndogo kwa kila ukadiriaji wa kumbukumbu na lebo 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 Kurefusha Kumbukumbu ya Upanuzi Inavyofanya Kazi

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

Wakati kielekezi kinapoundwa kuelekeza kwenye kumbukumbu hiyo, kinapata lebo ile ile. Lebo hii hifadhiwa katika bits zisizotumiwa za kielekezi cha kumbukumbu, ikilinkisha kielekezi na kitengo chake cha kumbukumbu kinacholingana.

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

Lebo za Kielekezi za MTE

Lebo ndani ya kielekezi hifadhiwa katika bits 4 ndani ya baiti ya juu:

Hivyo, hii inaruhusu hadi thamani 16 tofauti za lebo.

Lebo za Kumbukumbu za MTE

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

Lebo za kumbukumbu hifadhiwa katika eneo la RAM maalum (lisilopatikana kwa matumizi ya kawaida). Ikiwa na lebo za bits 4 kwa kila 16B ya lebo ya kumbukumbu hadi 3% ya RAM.

ARM inaleta maagizo yafuatayo ya kushughulikia lebo 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
...

Njia za Kukagua

Sync

CPU huchunguza vitambulisho wakati wa kutekeleza maagizo, ikiwa kuna kutofautiana, inasababisha kipekee. Hii ni polepole zaidi na salama zaidi.

Async

CPU huchunguza vitambulisho kwa njia isiyokuwa ya moja kwa moja, na inapopata kutofautiana huanzisha biti ya kipekee katika moja ya rejista za mfumo. Ni haraka kuliko ile ya awali lakini haiwezi kubainisha maagizo sahihi yanayosababisha kutofautiana na haisababishi kipekee mara moja, ikimpa muda fulani mpinzani kumaliza shambulio lake.

Kuchanganya

???

Mifano ya Utekelezaji na Uchunguzi

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

Tambua kwamba ita weka alama ya kutosha (16B kila moja) kwa ukubwa ulioombwa. Kwa hivyo, ikiwa ukubwa ulioombwa ulikuwa 35 na slabu ya 60B ilitolewa, ita weka alama ya kwanza 16*3 = 48B na kitambulisho hiki na mengine yatakuwa yamepewa alama na kitambulisho kinachoitwa batili (0xE).

Kitambulisho 0xF ni kufanana na pointer yoyote. Kumbukumbu yenye kipengele hiki 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 graini ya kitambulisho batili, kutofautiana kutagunduliwa. Ikiwa inafikia eneo lingine la kumbukumbu, ikiwa kumbukumbu ina kitambulisho tofauti (au kitambulisho batili) kutofautiana kutagunduliwa. Ikiwa mpinzani ana bahati na kumbukumbu inatumia kitambulisho sawa, haitagunduliwa. Nafasi ni karibu 7%

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

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

Walakini, katika matumizi-baada-ya-kuachiliwa, ikiwa kitengo kile kile kinarudishwa tena na KITAMBULISHO SAWA kama awali, mpinzani ataweza kutumia ufikivu huu na haitagunduliwa (nafasi ya karibu 7%).

Zaidi ya hayo, slabu 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