grsecurity AUTOSLAB¶
Her generic kernel allocation site'ına kendine ait dedike bir SLAB cache veren, çoğu kernel exploit'inin dayandığı cross-cache reuse ve heap-spray primitive'lerini kıran grsecurity compiler-plugin özelliği.
Mechanism¶
Generic kernel allocation'ları (kmalloc, kzalloc, ...) küçük bir set
size-bucket'lı paylaşımlı cache'ten (kmalloc-64, kmalloc-128, ...) çeker.
Birçok ilgisiz object type'ı aynı bucket'a düştüğü için, bir victim object'i
free eden bir attacker free edilmiş slot'un üzerine aynı boyutta kontrol
edilebilir bir object'i hemen reallocate edebilir — heap-spray / use-after-free
reuse primitive'i — ve cross-cache saldırıları, bir cache'in object'lerini bir
başkasınınkiyle çakıştırmak için tüm slab page'lerini page allocator üzerinden
geri recycle eder.
AUTOSLAB kök varsayıma saldırır: heap allocation fonksiyonlarını otomatik olarak
instrument etmek için bir compiler plugin kullanır; böylece her generic
allocation site (k*alloc*) az miktarda manuel değişiklikle kendine ait dedike
memory cache'inden çeker. sock_kmalloc gibi wrapper allocator'lar inline
edilir, böylece her ayrı caller ayrı bir kmalloc statement'ı yayar ve dolayısıyla
kendi cache'ini alır.
Invariant AUTOSLAB enforces
Farklı declare edilmiş type'lara/allocation site'larına sahip iki object asla bir slab cache paylaşmaz, dolayısıyla free edilmiş bir slot yalnızca aynı site/type'tan bir allocation tarafından geri alınabilir. Klasik "type A'yı free et, deliğe eşit boyutta type B spray et" primitive'i tasarım gereği reddedilir ve birkaç anti-cross-cache hardening page seviyesinde recycling'i güvenilmez kılar:
- slab page'lerinin başında rastgele bir offset (object boyutuna 8 byte'a kadar eklenir) hassas payload alignment'ını bozar;
- free edilmiş slab page'leri buddy-allocator freelist'inin kuyruğuna eklenir, attacker'ın recycling sırası üzerindeki kontrolünü azaltır;
- slab page order'ı dinamik olarak artırılır, bir attacker'ı önce higher-order page'leri fragment etmeye zorlar;
- bir object'in ortasını hedefleyen free'ler reddedilir.
Savunmanın sınırı: buddy/page allocator'ından doğrudan allocate edilen object'ler kapsanmaz ve yeni eklenen wrapper fonksiyonlarının annotation'a ihtiyacı vardır.
Walkthrough¶
AUTOSLAB yalnızca grsecurity-patch'li kernel'lerde gelir, dolayısıyla stock bir
tree üzerinde reproduce edilemez. Onu paylaşımlı bir kmalloc-N bucket'ı yerine
slab namespace'i üzerinden gözlemlersin.
1. Canlı cache listesini incele. Stock bir kernel'de generic allocation'ların hepsi size bucket'larını paylaşır:
$ sudo cat /proc/slabinfo | awk '{print $1}' | grep '^kmalloc-'
kmalloc-8
kmalloc-16
kmalloc-32
kmalloc-64
...
Bir AUTOSLAB kernel'inde aynı data structure type'ları paylaşımlı kmalloc-N
pool'larına çökmek yerine site başına dedike cache'ler olarak görünür,
dolayısıyla aynı boyuttaki iki ilgisiz allocation ayrı cache'lerde yaşar.
Not a substitute for fixing the bug
AUTOSLAB, bir use-after-free veya overflow'u exploit etmenin maliyetini artırır; altta yatan memory-safety bug'ı hâlâ vardır. Ayrıca slab allocator'ını bypass eden object'leri (doğrudan page-allocator allocation'ları) korumaz, dolayısıyla tam bir exploit chain'i bunlara pivot edebilir.
2. Upstream'in daha dar varyantıyla karşılaştır. Mainline sonradan, aynı
fikri call site'larının bir alt kümesi için genelleştiren bir "dedicated bucket
allocator" (kmem_buckets / kmalloc() call-site cache'leri) ekledi; LWN
yazısı ve grsecurity write-up'ı iki yaklaşımı ve kapsamlarını karşılaştırır.
Detection¶
Runtime bir "alert" yoktur — AUTOSLAB önleyicidir. Başarısız exploit girişimleri olağan slab-hardening fault'ları olarak (ör. reddedilen mid-object free'leri) ya da basitçe spray'in yanlış, izole bir cache'e düşmesi ve use-after-free read/write'ın attacker'ın kontrol ettiği byte'lar yerine ilgisiz veya unmapped data'ya çarpması olarak yüzeye çıkar.
Mitigation¶
AUTOSLAB, kernel heap-hardening stack'inin geri kalanıyla eşleşir — bkz. slab freelist hardening, slab freelist randomization, init-on-free, ve randstruct — ki bunlar birlikte reuse-and-corrupt chain'inin farklı halkalarına saldırır.
References¶
- grsecurity. How AUTOSLAB Changes the Memory Unsafety Game. — https://grsecurity.net/how_autoslab_changes_the_memory_unsafety_game
- LWN.net. Per-call-site slab caches for heap-spraying protection. — https://lwn.net/Articles/986174/