CVE-2026-98643 in Linuxinformazioni

Riassunto

di VulDB • 19/10/2026

Nel kernel Linux, è stata risolta la seguente vulnerabilità:

bpf: Correzione della lettura fuori dai limiti (out-of-bounds) di rtt_min in sock_ops

Un programma sockops che legge skops->rtt_min non verifica mai il tipo di socket: nel percorso tcp_conn_request(), sock_ops->sk è un request_sock (non completo/full), e la riscrittura del contesto lo trasforma in un tcp_sock (completo/full) leggendo rtt_min oltre la fine del request_sock, restituendo memoria adiacente sporca.

SEC("sockops") int prog(struct bpf_sock_ops *skops) {
switch (skops->op) {
case BPF_SOCK_OPS_RWND_INIT: leak = skops->rtt_min; /* legge la request_sock OOB */ ... } }

Ad esempio, una di queste letture ha restituito rtt_min=0xffff8881, la parte alta di un puntatore del kernel trapelato.

Proteggere quella cast è esattamente ciò che fa SOCK_OPS_GET_FIELD(): verifica is_locked_tcp_sock e restituisce 0 quando sock_ops->sk non è un socket completo (full) bloccato. Ogni altro campo tcp_sock in sock_ops passa attraverso di esso; rtt_min è l'unico codificato manualmente, quindi salta il controllo.

Leggere rtt_min tramite SOCK_OPS_GET_FIELD() anche per questo caso. rtt_min ha una natura particolare: è un struct minmax e vogliamo solo il minimo corrente, quindi si passa a rtt_min.s[0].v. Questo è equivalente al vecchio offset calcolato manualmente:

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

(s[0] si trova in rtt_min + 0 e .v in + sizeof(.t), ovvero ciò che restituisce minmax_get()), quindi il campo caricato rimane invariato e viene aggiunto solo il controllo per i socket completi. I due BUILD_BUG_ON() che proteggevano l'offset calcolato manualmente non sono più necessari.

Prima della patch:

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

Dopo la patch:

0: *(u64 *)(r1 +56) = r9 1: r9 = *(u8 *)(r1 +50) ; is_locked_tcp_sock 2: if r9 == 0 goto pc+4 ; non è un socket completo bloccato -> restituisce 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: goto pc+2 7: r9 = *(u64 *)(r1 +56) 8: r1 = 0

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

Responsabile

Linux

Prenotare

25/09/2026

Divulgazione

18/10/2026

Moderazione

accettato

EPSS

0.00000

KEV

no

Attività

basso

Fonti

Want to stay up to date on a daily basis?

Enable the mail alert feature now!