Skip to content

/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:

sigqueue      100  100  160   25  1 : tunables  0  0  0 : slabdata   4   4  0

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.

References