CVE-2026-98643 in Linuxinfo

Zusammenfassung

von VulDB • 19.10.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

bpf: Korrektur eines Out-of-Bounds-Lesezugriffs auf rtt_min in sock_ops

Ein sockops-Programm, das skops->rtt_min liest, überprüft niemals den Socket-Typ (sk type): Auf dem Pfad von tcp_conn_request() ist sock_ops->sk ein request_sock (nicht vollständig), und die Kontext-Umwandlung castet ihn zu einem tcp_sock (vollständig) und liest rtt_min über das Ende des request_sock hinaus zurück, wodurch verschmutzte benachbarte Speicherbereiche gelesen werden.

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

Ein solcher Lesezugriff lieferte beispielsweise rtt_min=0xffff8881, die hohe Hälfte eines geleakten Kernel-Pointers.

Das Absichern dieses Casts ist genau das, was SOCK_OPS_GET_FIELD() tut – es überprüft is_locked_tcp_sock und gibt 0 zurück, wenn sock_ops->sk kein gesperrter vollständiger Socket (locked full socket) ist. Jedes andere tcp_sock-Feld in sock_ops wird darüber abgedeckt; rtt_min war das einzige Feld, das handcodiert wurde, sodass die Überprüfung übersprungen wurde.

Lesen Sie rtt_min ebenfalls über SOCK_OPS_GET_FIELD(). rtt_min ist etwas speziell: Es handelt sich um eine struct minmax und wir möchten nur den aktuellen Minimalwert, also wird rtt_min.s[0].v übergeben. Dies entspricht dem alten manuell berechneten Offset

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

(s[0] befindet sich bei rtt_min + 0 und .v bei + sizeof(.t), d.h. das, was minmax_get() zurückgibt). Das geladene Feld bleibt also unverändert, und es wird nur der Guard für den vollständigen Socket hinzugefügt. Die beiden BUILD_BUG_ON()-Anweisungen, die den manuell berechneten Offset geschützt haben, sind nicht mehr erforderlich.

Vor dem Patch:

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

Nach dem Patch:

0: *(u64 *)(r1 +56) = r9 1: r9 = *(u8 *)(r1 +50) ; is_locked_tcp_sock 2: if r9 == 0 goto pc+4 ; kein gesperrter vollständiger Socket -> 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

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Zuständig

Linux

Reservieren

25.09.2026

Veröffentlichung

18.10.2026

Moderieren

akzeptiert

Eintrag

VDB-422174

EPSS

0.00000

KEV

nein

Aktivitäten

low

Quellen

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!