CVE-2026-98643 in Linux
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.