Skip to content

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