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
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
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.
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:
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
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.