Memory Tagging Extension (MTE)

AWS hacklemeyi sıfırdan ileri seviyeye öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Bellek Etiketleme Uzantısı (MTE), önbellek taşmaları ve kullanımdan sonra serbest bırakılan güvenlik açıklarını tespit ederek ve önleyerek, yazılım güvenilirliğini ve güvenliğini artırmak amacıyla tasarlanmıştır. MTE, ARM mimarisinin bir parçası olarak, her bellek tahsisine küçük bir etiket eklemek ve o belleği işaretleyen her işaretçiye ilgili bir etiket eklemek için bir mekanizma sağlar. Bu yaklaşım, çalışma zamanında yasadışı bellek erişimlerinin tespitine olanak tanır ve bu tür güvenlik açıklarının kötü amaçlı kod yürütmek için kullanılma riskini önemli ölçüde azaltır.

Bellek Etiketleme Uzantısı Nasıl Çalışır

MTE, belleği küçük, sabit boyutlu bloklara böler ve her bloğa bir etiket atar, genellikle birkaç bit boyutunda.

Bir işaretçi o belleği işaretlemek üzere oluşturulduğunda, aynı etiketi alır. Bu etiket, bir bellek işaretçisinin kullanılmayan bitlerinde saklanır ve etiketi ilgili bellek bloğuna bağlar.

Bir program bir işaretçi aracılığıyla belleğe eriştiğinde, MTE donanımı işaretçinin etiketinin bellek bloğunun etiketiyle eşleşip eşleşmediğini kontrol eder. Etiketler eşleşmiyorsa, yasadışı bellek erişimini gösterir.

MTE İşaretçi Etiketleri

İşaretçi içindeki etiketler, en üst baytın içindeki 4 bit içinde saklanır:

Bu nedenle, bu, 16 farklı etiket değerine kadar olanak tanır.

MTE Bellek Etiketleri

Her 16B fiziksel belleğin karşılık gelen bir bellek etiketi vardır.

Bellek etiketleri, özel bir RAM bölgesinde saklanır (normal kullanım için erişilemez). 16B bellek etiketleri için 4 bit etiketlere kadar RAM'ın %3'üne kadar.

ARM, bu etiketleri özel RAM bellekte manipüle etmek için aşağıdaki talimatları tanıtır:

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
...

Kontrol Modları

Senkron

CPU, etiketleri talimatı yürütürken kontrol eder, eşleşme olursa bir istisna oluşturur. Bu en yavaş ve en güvenlidir.

Asenkron

CPU etiketleri asenkron olarak kontrol eder ve bir eşleşme bulunduğunda bir istisna bitini bir sistem kaydında ayarlar. Bu öncekinden daha hızlıdır ancak eşleşmeye neden olan tam talimatı belirleyemez ve istisnayı hemen oluşturmaz, saldırganın saldırısını tamamlaması için bir süre verir.

Karışık

???

Uygulama ve Tespit Örnekleri

Donanım Etiket Tabanlı KASAN olarak adlandırılan, MTE tabanlı KASAN veya çekirdek MTE. Çekirdek tahsis edicileri (kmalloc gibi) bu modülü çağıracak ve kullanılacak etiketi (rastgele) hazırlayacak ve ayrılan çekirdek alanına ekleyecek ve döndürülen işaretçiye ekleyecektir.

Talep edilen boyut için yeterli bellek granülü yalnızca işaretleyecektir (her biri 16B). Bu nedenle, talep edilen boyut 35 ise ve 60B'lik bir plak verildiyse, ilk 16*3 = 48B'yi bu etiketle işaretleyecek ve geri kalanı sözde geçersiz bir etiketle (0xE) işaretleyecektir.

Etiket 0xF, tüm işaretçiyi eşleştirir. Bu işaretçiye sahip bir bellek, belleğine erişmek için herhangi bir etiketin kullanılmasına izin verir (eşleşmeler yok). Bu, saldırıyı algılamasını önleyebilir. Eğer bu etiket saldırılan bellekte kullanılıyorsa, MET'in saldırıyı algılamasını önleyebilir.

Bu nedenle, yalnızca 0xE ve 0xF ayrılmış olduğundan, etiket oluşturmak için kullanılabilecek 14 değer vardır ve etiketlerin yeniden kullanılma olasılığı 1/17 -> yaklaşık %7'dir.

Çekirdek geçersiz etiket granülüne erişirse, uyumsuzluk algılanır. Başka bir bellek konumuna erişirse, belleğin farklı bir etikete (veya geçersiz etikete) sahip olması durumunda uyumsuzluk algılanır. Saldırgan şanslıysa ve bellek aynı etiketi kullanıyorsa, algılanmaz. Olasılıklar yaklaşık %7'dir.

Başka bir hata, ayrılan belleğin son granülünde meydana gelir. Uygulama 35B istediğinde, 32 ile 48 arasındaki granül verilir. Bu nedenle, 36 ile 47 arasındaki baytlar aynı etiketi kullanıyor olabilir ancak istenmemiştir. Saldırgan bu ekstra baytlara erişirse, bu algılanmaz.

kfree() çalıştırıldığında, bellek geçersiz bellek etiketiyle tekrar etiketlenir, bu nedenle bir kullanımdan sonra tekrar kullanım durumunda belleğe erişildiğinde, uyumsuzluk algılanır.

Ancak, bir kullanımdan sonra tekrar kullanım durumunda, aynı parça ÖNCEKİSİYLE AYNI etiketle yeniden tahsis edilirse, bir saldırgan bu erişimi kullanabilir ve bu algılanmaz (yaklaşık %7 olasılık).

Ayrıca, yalnızca slab ve page_alloc etiketli belleği kullanır, ancak gelecekte bu, vmalloc, stack ve globalsda da kullanılacaktır (videonun çekildiği sırada bunlar hala kötüye kullanılabilir).

Bir uyumsuzluk algılandığında, çekirdek çökme yapacak ve daha fazla kötüye kullanım ve saldırı denemesini önlemek için (MTE yanlış pozitiflere sahip değildir).

Referanslar

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated