CRITICAL🇬🇧 English

CVE-2026-64047

Linux kernel TLS: błąd off-by-one w łańcuchowaniu scatterlist sk_msg

CVSS 9.8pub. 2026-07-19upd. 2026-07-30

Podatność w podsystemie TLS jądra Linux dotyczy błędu off-by-one podczas łańcuchowania (sg_chain) wpisów scatterlist w pierścieniu sk_msg. Błąd może prowadzić do naruszenia integralności pamięci z konsekwencjami obejmującymi pełen zakres: ujawnienie danych, modyfikację oraz niedostępność systemu (CVSS 9.8 — krytyczny).

Pokaż oryginał (EN)

In the Linux kernel, the following vulnerability has been resolved: net: tls: fix off-by-one in sg_chain entry count for wrapped sk_msg ring When an sk_msg scatterlist ring wraps (sg.end < sg.start), tls_push_record() chains the tail portion of the ring to the head using sg_chain(). An extra entry in the sg array is reserved for this: struct sk_msg_sg { [...] /* The extra two elements: * 1) used for chaining the front and sections when the list becomes * partitioned (e.g. end < start). The crypto APIs require the * chaining; * 2) to chain tailer SG entries after the message. */ struct scatterlist data[MAX_MSG_FRAGS + 2]; The current code uses MAX_SKB_FRAGS + 1 as the ring size: sg_chain(&msg_pl->sg.data[msg_pl->sg.start], MAX_SKB_FRAGS - msg_pl->sg.start + 1, msg_pl->sg.data); This places the chain pointer at sg_chain(data[start], (MAX_SKB_FRAGS - msg_start + 1) .. = &data[start] + (MAX_SKB_FRAGS - msg_start + 1) - 1 = data[start + (MAX_SKB_FRAGS - start + 1) - 1] = data[MAX_SKB_FRAGS] instead of the true last entry. This is likely due to a "race" of the commit under Fixes landing close to commit 031097d9e079 ("bpf: sk_msg, zap ingress queue on psock down") Convert to ARRAY_SIZE and drop the data[start] / - start (as suggested by Sabrina).

🤖 Analiza AI
Jak działa

Gdy pierścień scatterlist sk_msg zawija się (sg.end < sg.start), funkcja tls_push_record() łączy ogon i głowę pierścienia za pomocą sg_chain(). Aktualny kod przekazuje jako rozmiar łańcucha wartość MAX_SKB_FRAGS - msg_pl->sg.start + 1, co powoduje umieszczenie wskaźnika łańcucha na elemencie data[MAX_SKB_FRAGS] zamiast na faktycznie ostatnim zarezerwowanym wpisie tablicy. Skutkuje to błędem off-by-one: wskaźnik łańcucha trafia do niewłaściwego miejsca w tablicy scatterlist, co może wywołać nieprzewidywalne zachowanie i uszkodzenie pamięci przy operacjach kryptograficznych TLS.

Skutki

Atakujący sieciowy bez uwierzytelnienia może potencjalnie doprowadzić do ujawnienia poufnych danych, modyfikacji danych lub odmowy dostępu do usługi (crash jądra) na podatnym systemie.

Mitygacja

Należy zastosować patche dostępne w repozytorium stable jądra Linux zgodnie z referencjami (commity: 131ef12057d9, 285943c6e7ca, 2fb0dc7e0099, 47110c3a9ac2, 66339b71f105). Poprawka zastępuje ręczne obliczenie rozmiaru łańcucha wywołaniem ARRAY_SIZE, eliminując błąd off-by-one.

Kogo dotyczy

Jądro Linux z włączoną obsługą TLS (CONFIG_TLS) — wersje wskazane w referencjach producenta (patche dostępne przez stable kernel tree).

Uwagi

Opis wskazuje, że błąd powstał prawdopodobnie w wyniku kolizji temporalnej z commitem 031097d9e079 ('bpf: sk_msg, zap ingress queue on psock down'). Poprawka została zaproponowana przez Sabrinę (imię wymienione w opisie EN).

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
🔵
ZWERYFIKUJ U PRODUCENTA
Brak jednoznacznych danych o patchu. Sprawdź referencje od producenta.
Referencje