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).