Skip to content

TLS subsystem vulnerability (CVE-2025-39946)

Bir kTLS (net/tls) strparser receive path'i, bozuk bir TLS record header'da stream'i abort etmeyi başaramaz; fragment indekslemesi allocate edilmiş frags[] array'inin ötesine geçip stale fragment pointer'larına erişene kadar anchor SKB uzunluğunu tekrar tekrar ilerletir — bir out-of-bounds primitive'i.

Mechanism

Note

CVE-2025-39946, net/tls (kTLS) strparser receive path'indedir. Fix commit'inin başlığı "tls: make sure to abort the stream if headers are bogus"tur. tls_rx_msg_size(), TLS record header'ını parse eder; üç yerden çağrılır, ama yalnızca tls_strp_read_sock() bir parse hatasında tls_strp_abort_strp() çağırıyordu. tls_strp_copyin_frag() path'inde (küçük socket buffer'larıyla kullanılır; tam bir record buffer'lanmadan önce veri işlenir), bozuk bir header tls_rx_msg_size()'ın, anchor SKB (strp->anchor) üzerindeki skb->len ve fragment boyutu zaten artırıldıktan sonra ve parser'ı abort etmeden bir hata döndürmesine yol açar. Bunu tekrarlamak, fragment-index hesaplamasını (skb->len / PAGE_SIZE) skb_shinfo(skb)->frags'in allocate edilmiş entry'lerinin ötesine sürükler ve daha önce free edilmiş SKB'lerden stale pointer tutan initialize edilmemiş frags[] slot'larına erişir — bu da bir out-of-bounds erişim verir (skb_copy_bits() üzerinden stale-pointer bir fragment'a yapılan bir write).

Walkthrough

tls_strp_read_copy(), anchor'ı kabaca beş fragment için ön boyutlandırır (TLS_MAX_PAYLOAD_SIZE + PAGE_SIZE). Küçük bir SO_RCVBUF'lu bir kTLS socket üzerinden bozuk TLS record header'ları tekrar tekrar besleyerek, abort edilmemiş parser skb->len'i artırmaya devam eder ve sonunda frags[5], frags[6], … (initialize edilmemiş) indeksler; bu noktada bir kopyalama stale bir fragment pointer'ı üzerinden yazar — bir OOB write primitive'i. Bug, Google kernelCTF üzerinden ortaya çıktı. Fix, tls_strp_abort_strp() çağrısını tls_rx_msg_size() içine taşır ki her caller abort etsin ve frags'i indekslemeden önce bir length check ekler.

Warning

Kaynaklar kesin etkilenen/düzeltilen aralık konusunda hemfikir değil (bir kCTF analizi 6.12.49'da bir fix'e atıf yapar; bir aggregator 6.1.154'ten itibaren fix'leri listeler). Kesin sayısal aralığı ve CVSS'i doğrulanmamış kabul et; subsystem (net/tls), commit başlığı, bug tipi ve tls_rx_msg_size / tls_strp_copyin_frag / tls_strp_abort_strp / skb_shinfo->frags mekaniği doğrulanmıştır.

Detection

Bozuk TLS record header'ları akışları alan anormal kTLS socket'leri veya stream teardown olmadan tekrarlanan strparser parse hataları, davranışsal sinyaldir.

Mitigation

  • Düzeltilmiş stable kernel'i uygula — patch (bozuk bir header'da strparser'ı her zaman abort etmek, artı fragment indeksini bounds-check etmek) mitigation'dır.
  • Mümkünse, attack surface'i kaldırmak için kTLS'i devre dışı bırak (CONFIG_TLS=n).

References