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).
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.
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.
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.
Jądro Linux z włączoną obsługą TLS (CONFIG_TLS) — wersje wskazane w referencjach producenta (patche dostępne przez stable kernel tree).
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:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H