unix_stream_sendpage UAF (CVE-2023-4622)¶
unix_stream_sendpage(), queue lock'unu tutmadan peer'in son receive-queue skb'sine append eder ve tam da o skb'yi free ediyor olabilecek AF_UNIX garbage collection'ı ile race eder — LPE'ye yükseltilebilir bir use-after-free.
Mechanism¶
AF_UNIX stream sendpage implementasyonu (net/unix/af_unix.c, unix_stream_sendpage()), her zaman yeni bir skb allocate etmek yerine yeni page verisini peer socket'in receive queue'sunda zaten duran son skb'ye birleştirmeye çalışarak zero-copy send'leri optimize eder.
Note
Geçilen sınır concurrency altında object lifetime safety'dir — bir Time-of-Check / Time-of-Use race (double-fetch-user-kernel-toctou.md kavramsal kuzenidir). unix_stream_sendpage(), peer'in tail skb'sine lock'suz göz atar ve yazar. AF_UNIX'in, in-flight file-descriptor reference cycle'larında yakalanan socket'leri/skb'leri reclaim eden bir garbage collector'ı vardır. GC, sender'ın check'i ile use'u arasında tail skb'yi free ederse, send yolu free edilmiş bellek üzerinde işlem yapar — bir race-condition.md ile yürütülen bir use-after-free.md. skb'ler ve head verileri kernel slab cache'lerinden geldiğinden, free edilen slot saldırganın seçtiği bir nesneyle reclaim edilebilir.
Upstream fix commit 790c2f9d15b594350ae9bca7b236f2b1859de02c'dir; bu, GC onu serbest bırakırken receive queue'nun sendpage tarafından mutate edilememesi için düzgün locking ekler. (Mainline daha sonra sendpage altyapısını sendmsg/MSG_SPLICE_PAGES lehine kaldırdı ve bu yüzeyi emekliye ayırdı.)
Walkthrough¶
Public NVD/distro advisory'lerinden yüksek seviyeli yeniden kurgu; offset ya da silahlandırılmış primitive tekrar üretilmez.
- Cycle'ı kur. Bağlı
AF_UNIXSOCK_STREAMsocket pair'leri oluştur ve üzerlerinden file descriptor'ları geçir ki AF_UNIX GC socket'leri in-flight ve collection'a uygun saysın. -
Queue'yu race et. Bir thread'den, socket'e
sendfile()/splice()sür ki kernel peer'in tail skb'sine karşıunix_stream_sendpage()coalescing yolunu alsın. Başka birinden, garbage collection'ı tetikle ki o skb'yi eşzamanlı free etsin — lock'suz pencere race'tir. -
Free edilen nesneyi reclaim et. Race'i kazan ki skb (ya da lineer verisi) free edilsin, sonra dangling allocation'ı işgal etmek için aynı slab cache'e derhal kontrol edilen bir nesne spray'le. Güvenilirlik tipik olarak heap grooming'e ve hardened slab-cache layout'ları için bir cross-cache-attack.md'e dayanır; ayrıca bkz. heap-grooming-feng-shui.md.
- Yüksel. Free edilen slot saldırgan kontrolündeyken, dangling reference üzerinden sonraki write/operation root'a ulaşmak için bir privilege-escalation primitive'ine (bir pointer'ı ya da credential taşıyan bir yapıyı corrupt ederek) yönlendirilir.
Warning
Trigger sıradan, unprivileged socket I/O'sudur (socketpair, sendfile/splice) — özel bir capability ya da namespace kesinlikle gerekmez, bu da yüzeyi yamasız kernel'lerde geniş ölçüde erişilebilir kılar.
Detection¶
- Crash telemetrisi. Kaybedilen race'ler ve güvenilmez reclaim,
dmesgUAF oops'ları,general protection fault, slab-corruption uyarıları ya daunix_stream_sendpage/ AF_UNIX GC'ye (unix_gc) işaret eden KASAN use-after-free raporları olarak görünür. - Davranışsal sinyal. Unprivileged process'lerin AF_UNIX socket'lere sıkı
splice/sendfiledöngüleri yapması, yoğun FD-passing (SCM_RIGHTS) ve çok sayıda kısa ömürlü socketpair ile birlikte, bir EDR'nin baseline'layabileceği olağandışı bir desendir. - Post-exploitation belirtileri. Unprivileged parent'lardan uid-0 geçişleri, beklenmedik privileged child'lar ve bilinen escalation hedeflerine (
modprobe_path,core_pattern) yazmalar.
Mitigation¶
- Patch.
790c2f9d15b594350ae9bca7b236f2b1859de02c'yi içeren kernel'leri uygula: örneğin Ubuntu5.15.0-87.97/5.4.0-165.182/4.15.0-219.230ve eşdeğer Red Hat/SUSE/Oracle/Amazon backport'ları.sendpage'i içermeyecek kadar yeni kernel'ler etkilenmez. - Maruziyeti azalt. Mümkün olan yerde unprivileged user/network namespace'leri kısıtla ve güvenilmeyen workload'lar için gereksiz
sendfile/splice/SCM_RIGHTSkullanımını engelleyen seccomp filter'ları uygula. - Defense in depth. Slab hardening — CONFIG_SLAB_FREELIST_RANDOM, CONFIG_SLAB_FREELIST_HARDENED, CONFIG_INIT_ON_FREE_DEFAULT_ON — ve test build'lerinde KASAN, free edilen skb'yi reclaim etmenin maliyetini ve tespit edilebilirliğini artırır.