Bellek Etiketleme Uzantısı (MTE)

Reading time: 5 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Bellek Etiketleme Uzantısı (MTE), bellek ile ilgili hataları tespit etmek ve önlemek için yazılım güvenilirliğini ve güvenliğini artırmak üzere tasarlanmıştır; bu hatalar arasında tampon taşmaları ve kullanımdan sonra serbest bırakma güvenlik açıkları bulunmaktadır. MTE, ARM mimarisinin bir parçası olarak, her bellek tahsisine küçük bir etiket eklemek ve o belleği referans alan her işaretçiye karşılık gelen bir etiket sağlamak için bir mekanizma sunar. Bu yaklaşım, çalışma zamanında yasadışı bellek erişimlerinin tespit edilmesine olanak tanır ve bu tür güvenlik açıklarının rastgele kod çalıştırmak için istismar edilme riskini önemli ölçüde azaltır.

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

MTE, belleği küçük, sabit boyutlu bloklara bölerek çalışır; her bloğa bir etiket atanır, genellikle birkaç bit boyutundadır.

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

https://www.youtube.com/watch?v=UwMt0e_dC_Q

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. Eğer etiketler eşleşmiyorsa, bu yasadışı bellek erişimi olduğunu gösterir.

MTE İşaretçi Etiketleri

Bir işaretçi içindeki etiketler, en üst byte içinde 4 bit olarak saklanır:

https://www.youtube.com/watch?v=UwMt0e_dC_Q

Bu nedenle, bu, 16 farklı etiket değeri olmasına olanak tanır.

MTE Bellek Etiketleri

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

Bellek etiketleri, normal kullanım için erişilemeyen bir özel RAM bölgesinde saklanır. Her 16B bellek etiketi için 4 bit etiket bulunması, RAM'in %3'üne kadar etiket sağlar.

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ülürken kontrol eder, eğer bir uyumsuzluk varsa, bir istisna oluşturur.
Bu en yavaş ve en güvenli olanıdır.

Asenkron

CPU, etiketleri asenkron olarak kontrol eder ve bir uyumsuzluk bulunduğunda, sistem kayıtlarından birinde bir istisna biti ayarlar. Bu, önceki yöntemden daha hızlıdır ancak uyumsuzluğa neden olan tam talimatı belirleyemez ve istisnayı hemen oluşturmaz, saldırgana saldırısını tamamlama süresi tanır.

Karışık

???

Uygulama ve Tespit Örnekleri

Donanım Etiket Tabanlı KASAN, MTE tabanlı KASAN veya çekirdek içi MTE olarak adlandırılır.
Çekirdek ayırıcıları (örneğin kmalloc), kullanılacak etiketi hazırlamak için bu modülü çağırır (rastgele) ve çekirdek alanına ayrılan ve döndürülen işaretçiye ekler.

Talep edilen boyut için yeterli bellek granüllerini (her biri 16B) sadece işaretleyecektir. Yani, talep edilen boyut 35 ise ve 60B'lik bir slab verilmişse, bu etiketle ilk 16*3 = 48B'yi işaretleyecek ve geri kalan geçersiz etiket (0xE) ile işaretlenecektir.

Etiket 0xF, tüm işaretçileri eşleştiren etikettir. Bu işaretçiye sahip bir bellek, belleğine erişmek için herhangi bir etiketin kullanılmasına izin verir (uyumsuzluk yok). Bu, bu etiketin saldırıya uğrayan bellek içinde kullanılması durumunda MET'in bir saldırıyı tespit etmesini engelleyebilir.

Bu nedenle, 0xE ve 0xF rezerve edildiğinden, etiket oluşturmak için yalnızca 14 değer kullanılabilir, bu da etiketlerin yeniden kullanılma olasılığını 1/17 -> yaklaşık %7 yapar.

Eğer çekirdek geçersiz etiket granülüne erişirse, uyumsuzluk tespit edilecektir. Eğer başka bir bellek konumuna erişirse, eğer bellek farklı bir etikete (veya geçersiz etikete) sahipse, uyumsuzluk tespit edilecektir. Eğer saldırgan şanslıysa ve bellek aynı etiketi kullanıyorsa, bu tespit edilmeyecektir. Olasılıklar yaklaşık %7'dir.

Başka bir hata, ayrılan belleğin son granülünde meydana gelir. Eğer uygulama 35B talep ettiyse, 32'den 48'e kadar olan granül verilmiştir. Bu nedenle, 36'dan 47'ye kadar olan baytlar aynı etiketi kullanmaktadır ancak bunlar talep edilmemiştir. Eğer saldırgan bu ekstra baytlara erişirse, bu tespit edilmez.

kfree() çalıştırıldığında, bellek geçersiz bellek etiketi ile yeniden etiketlenir, bu nedenle bir kullanım-sonrası-serbest bırakma durumunda, bellek tekrar erişildiğinde, uyumsuzluk tespit edilir.

Ancak, bir kullanım-sonrası-serbest bırakma durumunda, eğer aynı parça, daha önceki ile AYNı etiketle yeniden tahsis edilirse, bir saldırgan bu erişimi kullanabilir ve bu tespit edilmeyecektir (yaklaşık %7 şans).

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

Bir uyumsuzluk tespit edildiğinde, çekirdek daha fazla istismar ve istismar denemelerini önlemek için panik yapacaktır (MTE'nin yanlış pozitifleri yoktur).

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin