Odebrany

CVE-2026-98643

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

bpf: Napraw odczyt poza granicami rtt_min w sock_ops

Program sockops czytający skops->rtt_min nigdy nie sprawdza typu sk: on the
ścieżka tcp_conn_request() sock_ops->sk to request_sock (niepełna), a ścieżka
ctx rewrite rzutuje go do tcp_sock (pełny) i odczytuje rtt_min po końcu
request_sock, zwracając brudną sąsiednią pamięć.

SEC("skarpety")
int prog(struct bpf_sock_ops *skops)
{
przełącznik (skops->op) {
przypadek BPF_SOCK_OPS_RWND_INIT:
wyciek = skops->rtt_min; /* czyta żądanie_sock OOB */
...
}
}

Na przykład jeden taki odczyt zwrócił rtt_min=0xffff8881, wyższą połowę a
wyciekł wskaźnik jądra.

Ochrona tego rzutowania jest dokładnie tym, co robi SOCK_OPS_GET_FIELD() - sprawdza
is_locked_tcp_sock i zwraca 0, gdy sock_ops->sk nie jest zablokowaną pełną
gniazdo. Każde inne pole tcp_sock w sock_ops przechodzi przez to; rtt_min jest
jedyny kod otwarty, więc pomija kontrolę.

Przeczytaj także rtt_min przez SOCK_OPS_GET_FIELD(). rtt_min jest nieco wyjątkowy:
jest to struktura minmax i chcemy tylko bieżącej min, więc pomiń
rtt_min.s[0].v. Jest to odpowiednik starego, ręcznie obliczanego przesunięcia

offsetof(struct tcp_sock, rtt_min) + sizeof_field(struct minmax_sample, t)

(s[0] znajduje się w rtt_min + 0, a .v w + sizeof(.t), tj. co minmax_get()
zwraca), więc załadowane pole pozostaje niezmienione i pozostaje tylko osłona z pełną skarpetą
dodano. Dwie funkcje BUILD_BUG_ON() chroniące ręcznie obliczone przesunięcie
nie są już potrzebne.

Przed łatką:

0: r1 = *(u64 *)(r1 +0) ; r1 = skops->sk
1: r1 = *(u32 *)(r1 +2324) ; ((tcp_sock *)sk)->rtt_min.s[0].v

Po łatce:

0: *(u64 *)(r1 +56) = r9
1: r9 = *(u8 *)(r1 +50) ; is_locked_tcp_sock
2: if r9 == 0 goto pc+4 ; nie zamknięta pełna skarpeta -> 0
3: r9 = *(u64 *)(r1 +56)
4: r1 = *(u64 *)(r1 +0) ; r1 = skops->sk
5: r1 = *(u32 *)(r1 +2324) ; rtt_min.s[0].v
6: przejdź do komputera+2
7: r9 = *(u64 *)(r1 +56)
8: r1 = 0

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org