Skip to content

Function Granular KASLR

Tek bir leak'lenmiş code address'in artık tüm kernel'in layout'unu açığa çıkarmaması için boot'ta kernel .text'inin fonksiyon bazında yeniden sıralanması.

Mechanism

Standart KASLR yalnızca kernel'in yükleme base'ini randomize eder: attacker bir kez herhangi bir tek kernel code address'i leak'lediğinde (bir info leak ile), diğer her fonksiyona olan offset sabittir ve tüm gadget seti geri kazanılır. FGKASLR (Function Granular KASLR, CONFIG_FG_KASLR, Kristen Carlson Accardi tarafından yazıldı) bu kazanımı küçültür. Build zamanında -ffunction-sections her fonksiyonu kendi .text.* section'ına yerleştirir. Boot sırasında, decompression'dan sonra kernel kendi ELF'ini parse eder, tekil fonksiyon section'larını rastgele shuffle eder, relocation'ları düzeltir ve onları yeni konumlarda yerleştirir.

Invariant enforced

Bir fonksiyonun runtime address'ini bilmek artık başka hiçbir fonksiyonun address'ini belirlemez. Entropy "base'i tahmin et"ten "her fonksiyonun slot'unu tahmin et"e yükselir, dolayısıyla tek bir pointer leak'lemek artık code-reuse / ROP için kernel'i kolayca derandomize etmez.

Sabit bir .text başı (erken assembly) randomize edilmeden kalır ve fonksiyon başına alignment (x86_64'te 16 byte) low address bit'lerinin tahmin edilebilir kalması anlamına gelir, bu da entropy'yi az miktarda düşürür.

Walkthrough

FGKASLR, kernel için yalnızca x86_64'tür. Kernel config'inde etkinleştirin:

CONFIG_FG_KASLR=y
# selected automatically for x86_64; for modules on other arches:
CONFIG_MODULE_FG_KASLR=y

Module'ler load zamanında section'ları shuffle edilerek randomize edilir; module'ün -ffunction-sections ile build edilmiş olması gerekir.

Boot zamanı kontrolleri (FGKASLR, KASLR'ın üzerine katmanlanır):

nokaslr        # disables KASLR entirely -> also disables FGKASLR
nofgkaslr      # disables only the function-granular shuffle, KASLR stays on

Fonksiyon sıralamasının artık monoton olmadığını gözlemlemek için runtime symbol address'lerini iki boot arasında karşılaştırın (yeterli privilege / gevşetilmiş kptr_restrict gerektirir):

sudo cat /proc/kallsyms | sort | head
# reboot, repeat -- with FGKASLR the *relative* ordering of functions changes,
# not merely a constant base shift as with plain KASLR.

Costs

-ffunction-sections ve ek relocation'lar, sıkıştırılmış image'i kabaca %15, vmlinux ELF'ini ise ~%3 büyütür. Boot süresi yaklaşık bir saniye artar ve decompression sırasında ekstra heap gerekir (sonrasında serbest bırakılır), dolayısıyla bu özellik çok düşük bellekli sistemler için uygun olmayabilir.

Mitigation

FGKASLR, tek bir pointer leak'i tam bir ROP chain'ine dönüştürmenin maliyetini artırır, ama birçok address leak'leyebilen veya kernel belleğini doğrudan okuyabilen bir attacker'ı durdurmaz. Base KASLR, kptr_restrict ve pointer hashing'in yerini almaz, onları tamamlar.

References

  • Function Granular KASLR — LWN.net
  • [PATCH v6 kspp-next 00/22] Function Granular KASLR (Accardi/Lobakin)](https://patchwork.kernel.org/project/linux-kbuild/cover/20210831144114.154-1-alexandr.lobakin@intel.com/)