sch_sfq qlen underflow 0x0000 OOB write (CVE-2025-37752)¶
SFQ qdisc'inde bir
qlenunderflow'u (tc/netfilter classful queueing üzerinden ulaşılır), 2-byte'lık bir0x0000değerini ~262 KB out of bounds yazar ve bir page use-after-free ile root'a pivot eder.
Mechanism¶
Note
CVE-2025-37752 bu wave'de netfilter/nf_tables ailesi altında dosyalanmıştır,
ama birincil kaynaklar (NVD, kernel CVE kaydı ve araştırmacı writeup'ı) bug'ı
packet scheduler'a yerleştirir — net/sched/sch_sfq.c, Stochastic
Fairness Queueing (SFQ) qdisc'i. İhlal ettiği invariant basittir: per-qdisc
backlog counter'ı qlen asla sıfırın altına decrement edilmemelidir.
SFQ, yapılandırılan limit'i yetersiz biçimde valide eder:
1'lik bir limit reachable'dır (örneğin maxdepth = 1, maxflows = 1).
Kernel kaydı çekirdek sorunu belirtir: "It is not sufficient to directly validate
the limit on the data that the user passes as it can be updated based on how the
other parameters are changed." SFQ, limit = 1'li bir TBF (Token Bucket Filter)
qdisc'inin child'ı olarak çalıştığında ve packet'lar burst edildiğinde, bir
TBF↔SFQ enqueue/dequeue etkileşimleri zinciri, sfq_dec() içinde qlen'i
sıfırdan decrement eder. Underflow eden qlen ardından sfq_link() içinde dep
array'ine bir index olarak kullanılır ve allocation'dan kabaca 262,636 byte
ötede 16-bit'lik bir 0x0000 yazar.
Warning
Write değeri ve offset'i attacker-chosen değildir — her zaman sabit, devasa bir mesafede 2-byte'lık bir zero'dur. Exploit'in marifeti, write'ı yönlendirmek değil, o offset'e düşecek faydalı bir victim object'i groom etmektir.
Walkthrough¶
Teknik CONFIG_NET_SCH_SFQ ve CONFIG_USER_NS gerektirir; 6.6.84 / 6.6.86
üzerinde gösterildi.
Kavramsal tekrar üretim (örnekleyici, public writeup'tan):
# unprivileged user namespace gives CAP_NET_ADMIN over the new netns
unshare -Urn
# build TBF(limit=1) -> SFQ(limit=1) and burst traffic so SFQ underflows qlen
tc qdisc add dev lo root handle 1: tbf rate 1kbit burst 1b limit 1
tc qdisc add dev lo parent 1: handle 2: sfq limit 1
Syst3m Failure tarafından raporlanan exploitation chain'i:
- Corrupt edilen structure
qdisc_bstats_update()'ten sağ çıksın diyesfq_slotsspray'leyin (kmalloc-64'teki object'ler). - Type-confused bir skb dequeue path'inden kaçınmak için TBF'yi (rate / overhead) yeniden yapılandırın.
- kmalloc-cg-192'deki bir
pipe_inode_infoile ilgili object'inpipe->files'a komşu field'ını hedefleyin; OOB0x0000onu corrupt ederek bir page use-after-free tetikler. - Free edilen page'i
signalfdfile object'leri ile reclaim edin ve arbitrary read/write elde edin. - Root almak için credential'ları swap edin.
Fix (araştırmacı writeup'ına göre)
İki commit bunu ele alır: 8c0cea59d40cf6dd13c2950437631dd614fbade6 geçici bir
processing alanı tanıtır, ve b3bf8f63e6179076b57c9de660c9f80b5abefe70
limit check'ini fonksiyonun sonuna taşır, böylece türetilen parametreler
finalize edildikten sonra valide edilir.
Detection¶
- KASAN, bir debug kernel'inde
sfq_link()içindeki OOB store'u hemen işaretler. - Telemetri: bir unprivileged process'in taze bir user namespace içinde
tc(rtnetlink üzerinden RTM_NEWQDISC) ilelimit=1'li bir TBF→SFQ stack'i oluşturması anormaldir.
Mitigation¶
- Patch'lenmiş kernel'ler, SFQ limit'ini bağımlı parametreler oturduktan sonra valide eder.
- Unprivileged user namespace'leri devre dışı bırakmak
(
kernel.unprivileged_userns_clone=0/user.max_user_namespaces=0),CAP_NET_ADMIN-in-netns reach'ini kaldırır.