Skip to content

legitimize_path slab OOB write (CVE-2022-0185)

Linux Filesystem Context API'sinde, legacy mount-parameter parsing'indeki bir integer underflow'dan kaynaklanan, user namespace'ler yoluyla unprivileged bir user tarafından ulaşılabilen bir heap/slab out-of-bounds write.

Mechanism

Note

Filesystem Context API'si (fs/fs_context.c), kernel'in hâlâ legacy options interface'ini kullanan filesystem'ler için mount parametrelerini toplamasına izin verir. legacy_parse_param()'da, birikmiş parameter data'sını tek bir 1-page slab buffer içinde tutmayı amaçlayan bir length check, len > PAGE_SIZE - 2 - size formundaki unsigned aritmetikle hesaplanıyordu. size büyüdüğünde (bir page'e yakın), PAGE_SIZE - 2 - size devasa bir unsigned değere underflow eder, dolayısıyla bounds check her zaman geçer ve aşırı uzun bir parametre allocation'ın sonunun ötesine kopyalanır — controlled bir slab out-of-bounds write. Security boundary geçilir çünkü path unprivileged bir user tarafından ulaşılabilir: unshare(CLONE_NEWNS|CLONE_NEWUSER), fsopen/fsconfig mount parsing'ini sürmeye yeten namespaced CAP_SYS_ADMIN verir.

Walkthrough

Public NVD entry'sinden, oss-sec disclosure'ından ve Crusaders of Rust / willsroot.io writeup'larından alınmıştır. Yalnızca kavramsal.

Kavramsal sıra (public writeup'lardan)
  1. Unprivileged bir process yeni bir user + mount namespace oluşturur ve namespaced CAP_SYS_ADMIN elde eder.
  2. Legacy-options bir filesystem için bir filesystem context açar ve size'ı bir page'e yakın biriktiren mount parametreleri besler.
  3. Son bir aşırı uzun parametre underflow olmuş bounds check'i tetikler, dolayısıyla copy page boyutlu slab nesnesinin ötesine yazar — OOB write primitive'i.
Bug class'ı, bir reçete değil

Patch'lenmiş check, karşılaştırmayı yeniden yazar, böylece size + len + 2 > PAGE_SIZE toplaması underflow edemez. Public kCTF writeup'ındaki weaponization ek olarak komşu slab nesnelerini şekillendirmeye ve bir arbitrary write primitive'e dayanıyordu — bu ayrıntılar burada kasıtlı olarak atlanmıştır.

Detection

  • Unprivileged namespace + mount aktivitesi. Belirleyici sinyal, CLONE_NEWUSER|CLONE_NEWNS ile unshare/clone çağıran ve ardından fsopen/fsconfig/fspick/mount syscall'ları yapan unprivileged bir process'tir. Bu syscall'lar üzerinde auditd kuralları ya da eBPF/Falco/Tracee/Tetragon process+syscall telemetry'si ile denetle.
  • Container escape bağlamı. Container host'larda, container içi process'lerin new-userns oluşturma ardından filesystem-context mount parameter spraying yapmasına dikkat et — bu CVE için yaygın bir escape pattern'i.
  • Crash ve sanitizer telemetry. Iskalayan exploitation kernel: BUG, slab corruption mesajları ya da instrumented kernel'lerde legacy_parse_param yakınında KASAN: slab-out-of-bounds Write üretir. kmalloc-32/page boyutlu slab cache'lerindeki (/proc/slabinfo) anomaliler grooming'e eşlik edebilir.
  • Davranışsal baseline'lar. Çoğu workload asla unprivileged user namespace oluşturmaz; non-system process'ler tarafından ilk kez görülen userns oluşturmaya alert ver.

Mitigation

  • Patch. 5.4.173, 5.10.93, 5.15.16, 5.16.2'de (ve distro backport'larında) fix'lendi. Patch'lenmiş bir kernel'e güncelle.
  • Unprivileged user namespace'leri kısıtla. Bu, bug'ın unprivileged ulaşılabilirliğini kaldırır:

Warning

sysctl kernel.unprivileged_userns_clone=0 (Debian/Ubuntu) ya da user.max_user_namespaces=0 ayarla ve workload'lar ihtiyaç duymadığı yerde sınırlı CONFIG_USER_NS maruziyeti ile build etmeyi tercih et. Bu reboot olmadan uygulanabilir ve bir kernel patch'lenmeden önce bile unprivileged path'i engeller.

  • Container hardening. Güvenilmeyen workload'lar için new-userns flag'leriyle unshare/clone'u ve fsconfig ailesini engelleyen seccomp profilleri uygula; container runtime'larında default-deny seccomp'u koru.
  • Defense in depth. KASLR'ı etkin tut, slab freelist hardening'i (CONFIG_SLAB_FREELIST_HARDENED) çalıştır ve slab OOB write'larını erken yakalamak için test fleet'lerinde CONFIG_KASAN kullan.

References