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)
- Unprivileged bir process yeni bir user + mount namespace oluşturur ve namespaced
CAP_SYS_ADMINelde eder. - Legacy-options bir filesystem için bir filesystem context açar ve
size'ı bir page'e yakın biriktiren mount parametreleri besler. - 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_NEWNSileunshare/cloneçağıran ve ardındanfsopen/fsconfig/fspick/mount syscall'ları yapan unprivileged bir process'tir. Bu syscall'lar üzerindeauditdkuralları 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'lerdelegacy_parse_paramyakınındaKASAN: 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 vefsconfigailesini 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'lerindeCONFIG_KASANkullan.