Skip to content

ksmbd SMB2_TREE_DISCONNECT UAF RCE (CVE-2022-47939)

Linux in-kernel SMB3 server'ında (ksmbd) SMB2_TREE_DISCONNECT handler'ı üzerinden ulaşılabilen, remote kernel code execution'a izin veren bir pre-authentication use-after-free.

Mechanism

Note

ksmbd, Linux 5.15'ten beri gönderilen in-kernel SMB3 file server'ıdır (CONFIG_SMB_SERVER). Protocol state machine kernel context'inde çalıştığı için, oradaki bir memory-safety açığı ağ üzerinden doğrudan ring 0'da exploit edilebilir. fs/ksmbd/smb2pdu.c'de SMB2_TREE_DISCONNECT command handler'ı, nesnenin hâlâ var olup geçerli bir state'te olduğunu önce doğrulamadan bir tree-connect nesnesi üzerinde işlem yapıyordu. Eşzamanlı ya da malformed disconnect istekleri, başka bir path hâlâ ona referans verirken backing structure'ı free edebiliyordu ve klasik bir use-after-free üretiyordu. Geçilen security boundary, network-to-kernel trust boundary'sidir: authenticate edilmemiş bir remote peer kernel nesne ömrünü sürer. CVSS 9.8–10.0 (critical) olarak derecelendirildi; unauthenticated, TCP/445'te network-reachable.

Walkthrough

Public ZDI-22-1690 advisory'si ve upstream fix, sorunu yalnızca kavramsal düzeyde tarif eder. Burada hiçbir exploit ayrıntısı yeniden üretilmez.

Kavramsal sıra (public advisory'den)
  1. Bir remote peer TCP/445'teki ksmbd listener'ına ulaşır; ilgili code path'i sürmek için geçerli credential gerekmez.
  2. SMB2 istekleri, tree-connect nesnesinin ömrü ile SMB2_TREE_DISCONNECT işleme süreci çakışacak şekilde crafted edilir.
  3. Disconnect handler'ı, nesnenin hâlâ var olduğunu doğrulamadan onun üzerinde işlem yapar, dolayısıyla freed bir structure'a tekrar referans verilir (UAF) ve en azından bir kernel OOPS ve potansiyel olarak controlled corruption verir.
Bug class'ı, bir reçete değil

Fix, handler nesneyi dereference etmeden önce existence/validity check'leri ekler. Bu, kernel UAF bug'ları boyunca görülen aynı dangling-reference pattern'idir; OOPS'u code execution'a çevirmek ek olarak slab grooming ve reclamation gerektirir, ki bunlar bu savunma amaçlı notun kapsamı dışındadır.

Detection

  • Önce attack-surface envanteri. ksmbd'nin var/yüklü olup olmadığını doğrula: ksmbd module'üne (lsmod), ksmbd.mountd userspace helper'ına ve TCP/445'te dinleyen, Samba'nın smbd'si olmayan bir process'e bak. Çoğu distro CONFIG_SMB_SERVER'ı default olarak etkinleştirmez.
  • Kernel crash telemetry. UAF/OOPS exploitation girişimleri sıklıkla dmesg/journald//var/log/kern.log'da kernel: BUG, general protection fault, KASAN: use-after-free ya da ksmbd worker stack trace'leri üretir. Tekrarlanan ksmbd OOPS kayıtları güçlü bir sinyaldir.
  • Ağ anomalileri. Güvenilmeyen kaynaklardan pre-auth SMB2 oturumları, malformed ya da hızlı TREE_CONNECT/TREE_DISCONNECT dizileri ve ksmbd çalıştıran bir host'a beklenmedik gelen 445 bağlantıları. IDS/NIDS SMB2 decoder'ları ve Zeek smb logları burada yardımcı olur.
  • EDR/host sinyalleri. Ardından service restart'ları gelen beklenmedik ksmbd kernel worker crash'leri ya da harici SMB trafiği ile korele olan kernel module fault'ları.

Mitigation

  • Patch. Linux 5.15.61, 5.18.18 ve 5.19.2'de fix'lendi. Patch'lenmiş bir stable kernel'e güncelle.
  • Kullanılmıyorsa module'ü devre dışı bırak. modprobe -r ksmbd ve onu blacklist'le; mümkün olduğunda CONFIG_SMB_SERVER olmadan build et.

Warning

ksmbd'nin performansı özellikle gerekmedikçe ve kernel güncel tutulmadıkça, genel file sharing için in-kernel ksmbd yerine olgun userspace Samba'yı (smbd) tercih et. Kernel-context protocol parser'ları remote attack surface'i dramatik biçimde genişletir.

  • Maruziyeti kısıtla. TCP/445'i güvenilir segment'lere firewall'la; ksmbd'yi asla internete açma. Host firewall'ları ve network segmentation kullan.
  • Defense in depth. UAF'leri erken açığa çıkarmak için test fleet'lerinde CONFIG_KASAN'ı etkinleştir ve production'da KASLR ile diğer kernel hardening'i etkin tut.

References