Skip to content

sch_sfq qlen underflow 0x0000 OOB write (CVE-2025-37752)

SFQ qdisc'inde bir qlen underflow'u (tc/netfilter classful queueing üzerinden ulaşılır), 2-byte'lık bir 0x0000 değ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:

q->limit = min_t(u32, ctl->limit, q->maxdepth * q->maxflows);

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:

  1. Corrupt edilen structure qdisc_bstats_update()'ten sağ çıksın diye sfq_slots spray'leyin (kmalloc-64'teki object'ler).
  2. Type-confused bir skb dequeue path'inden kaçınmak için TBF'yi (rate / overhead) yeniden yapılandırın.
  3. kmalloc-cg-192'deki bir pipe_inode_info ile ilgili object'in pipe->files'a komşu field'ını hedefleyin; OOB 0x0000 onu corrupt ederek bir page use-after-free tetikler.
  4. Free edilen page'i signalfd file object'leri ile reclaim edin ve arbitrary read/write elde edin.
  5. 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) ile limit=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.

References