/proc/slabinfo allocator state oracle¶
/proc/slabinfo'dan cache başına live/total object sayılarını oku ve heap grooming ile spray başarısı için bir corruption'sız oracle olarak kullan.
Mechanism¶
Note
/proc/slabinfo, slab/SLUB allocator için cache başına object muhasebesini raporlar.
Belirli bir object tipinin her allocation'ı bir cache'in active_objs/num_objs'unu
hareket ettirir ve yeni bir backing page num_slabs'i artırır. Bunu okuyabilen bir
saldırgan kesin, yan etkisiz bir oracle elde eder: bir spray'in bir slab'i doldurup
doldurmadığını, yeni bir slab page'i zorlayıp zorlamadığını (taze, contiguous bir bölge —
cross-cache ve page-level grooming için faydalı) ve kaç free slot kaldığını doğrular —
hepsi de herhangi bir corruption tetiklemeden.
Walkthrough¶
Format (slabinfo(5)'ten):
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> \
: tunables <limit> <batchcount> <sharedfactor> \
: slabdata <active_slabs> <num_slabs> <sharedavail>
Man page'in alıntıladığı gerçek bir satır:
Alan anlamları: active_objs = şu an kullanımdaki object'ler; num_objs = toplam allocate
edilmiş (kullanımda + free); objsize = object başına byte; objperslab = slab başına object;
pagesperslab = slab başına page; slabdata active_slabs/num_slabs = active/total slab.
Varsayılan SLUB allocator altında tunables 0 olarak okunur ve yazılabilir değildir.
Bir allocation patlamasının öncesi/sonrasını diff'leyerek onu bir spray oracle'ı olarak kullan:
# grep '^kmalloc-1024 ' /proc/slabinfo
kmalloc-1024 512 512 1024 32 8 : tunables 0 0 0 : slabdata 16 16 0
# ... spray N objects into kmalloc-1024 ...
# grep '^kmalloc-1024 ' /proc/slabinfo
kmalloc-1024 544 544 1024 32 8 : tunables 0 0 0 : slabdata 17 17 0
active_objs'taki sıçrama (512→544) ve yeni bir slab (slabdata 16→17), spray'in
oturduğunu ve taze bir slab page'in oyulduğunu doğrular.
Warning
Dosya stock kernel'lerde mode 0400 (yalnızca-root)'tur, dolayısıyla unprivileged bir saldırgan normalde onu okuyamaz. Saldırgan zaten yükseltilmiş ya da container privilege'i taşıdığında veya izinleri gevşetilmiş sistemlerde bir oracle hâline gelir.
Mitigation¶
/proc/slabinfo "yalnızca root okuyabilir ve (kernel CONFIG_SLAB ile yapılandırıldıysa)
yazabilir" olacak şekilde kısıtlanmıştır; dosya modu 0400'dür. Ubuntu, onu yalnızca root
tarafından okunabilir kılınan dosyalar arasında listeler. Onu yalnızca-root tutmak, oracle'ı
unprivileged exploit'lerden esirger.