Memory Tagging Extension (MTE)

AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Bellek Etiketleme Uzantısı (MTE), bellek ile ilgili hataları tespit edip önleyerek, örneğin tampon taşmaları ve kullanımdan sonra serbest bırakılan güvenlik açıklarını geliştirme 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 karşılık gelen bir etiket sağlayan bir mekanizma sunar. Bu yaklaşım, yasadışı bellek erişimlerinin çalışma zamanında tespit edilmesine olanak tanır ve bu tür güvenlik açıklarının keyfi kod yürütme için sömürülme 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şaret etmek ü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). Her 16B bellek etiketi için 4 bit etiketlere sahip olmak, RAM'ın %3'üne kadar olanak tanır.

ARM, bu etiketleri özel RAM belleğinde işlemek 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ü (her biri 16B) yalnızca işaretleyecektir. 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 etiketi kullanmasına izin verir (eşleşmeler yok). Bu, saldırıyı algılamasını önleyebilir MET, bu etiketin saldırılan bellekte kullanılması durumunda.

Bu nedenle, yalnızca 14 değer kullanılabilir etiket oluşturmak için 0xE ve 0xF ayrılmış olduğundan, etiketleri yeniden kullanma olasılığı 1/17 -> yaklaşık %7.

Ç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. Şanslar 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ından granül verildi. 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 serbest bırakma durumunda, belleğe tekrar erişildiğinde uyumsuzluk algılanır.

Ancak, bir kullanımdan sonra serbest bırakma durumunda, aynı parça öncekiyle AYNI etiketle tekrar tahsis edilirse, bir saldırgan bu erişimi kullanabilir ve bu algılanmaz (yaklaşık %7 şans).

Ayrıca, yalnızca slab ve page_alloc etiketli bellek 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

Last updated