Skip to content

init_on_free

Page-allocator ve slab belleğini free zamanında sıfırlayan, free edilmiş verinin ömrünü kısaltarak infoleak'leri, cold-boot recovery'yi ve use-after-free read'lerini yenen Linux boot-time hardening'i.

Mechanism

init_on_free, CONFIG_INIT_ON_FREE_DEFAULT_ON Kconfig seçeneği ve init_on_free=1 kernel command-line parametresi ile kontrol edilir (init_on_free=0 ile devre dışı bırakılır). CONFIG_INIT_ON_FREE_DEFAULT_ON=y ayarlamak, default olarak command line'a init_on_free=1 koymakla aynı etkiyi yaratır.

Etkinleştirildiğinde, tüm page-allocator ve slab-allocator belleği free edildiğinde sıfırlanır. init_on_alloc gibi, Linux v5.3'te tanıtıldı (Alexander Potapenko, Kernel Self-Protection Project altında) ve grsecurity/PaX PAX_MEMORY_SANITIZE'ın upstream ardılıdır.

Invariant enforced

Free edilmiş page/slab belleği hemen silinir, dolayısıyla bellekteki veri ömrü azaltılır: free edilen her şey anında sıfırlanır. Bu, birçok türden "uninitialized heap memory" kusurunu ve heap-içerik açığa çıkışlarını ortadan kaldırır ve canlı forensics ya da cold-boot bellek saldırılarının free edilmiş bellek içeriğini kurtarmasını imkânsız hale getirir. Free edilmiş bir nesnenin use-after-free read'i artık nesnenin eski içeriği yerine sıfır döndürür (not: dangling pointer'ın kendisini engellemez).

Walkthrough

Enable and verify

Parametreyi kernel command line'a ekle:

init_on_free=1

Confirm it is active:

$ cat /proc/cmdline
... init_on_free=1 ...
$ grep CONFIG_INIT_ON_FREE_DEFAULT_ON /boot/config-$(uname -r)
CONFIG_INIT_ON_FREE_DEFAULT_ON=y

Her iki seçenek birleştirilebilir: init_on_alloc=1 init_on_free=1. CONFIG_INIT_ON_FREE_DEFAULT_ON=y ile, init_on_free=0 ile kapatılmadıkça özellik açıktır.

Performance

init_on_free, free zamanında "soğuk" bellek alanlarına dokunup negatif cache etkilerine yol açtığı için init_on_alloc'tan daha pahalıdır. Çoğu durumda etki %3-5'tir, bazı sentetik workload'larda %8'e kadar ölçülmüştür. Bu, azaltılmış veri ömrünün ekstra garantisi için ödenen bedeldir.

Beklenen etki: bir secret içeren bir nesne (örn. bir key buffer) free edildikten sonra byte'ları anında temizlenir. O bölgeye düşen sonraki bir out-of-bounds veya use-after-free read sıfır kurtarır ve free'den sonraki bir cold-boot/RAM-dump artık secret'ı açığa çıkarmaz.

Mitigation

init_on_free, use-after-free ve uninitialized-read bug'larının etkisini azaltır ama onları düzeltmez. Defense in depth için slab-freelist-hardening gibi allocator seviyesinde UAF hardening'i ve hardened-usercopy gibi copy-boundary kontrolleriyle birleştir.

References