CVE-2026-74714 in Linuxinfo

Zusammenfassung

von VulDB • 23.08.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

bpf: tcp: Behebung eines Use-After-Free in bpf_iter_tcp_established_batch()

reqsk_queue_hash_req() veröffentlicht einen request_sock mit dem Status TCP_NEW_SYN_RECV an der ehash-Kette, gibt das Bucket-Sperre frei und setzt erst danach rsk_refcnt auf 3.

Lockless-Leser wie __inet_lookup_established() behandeln dies mit refcount_inc_not_zero(), während bpf_iter_tcp_established_batch() plain sock_hold() verwendet, solange die Bucket-Sperre gehalten wird, in der Annahme, dass die Sperre sk_refcnt > 0 garantiert. Diese Annahme gilt für request_sock nicht:

CPU 0 CPU 1 ----- ----- tcp_conn_request() reqsk_queue_hash_req() inet_ehash_insert(req) spin_lock(bucket) __sk_nulls_add_node_rcu(req) // rsk_refcnt == 0 spin_unlock(bucket) bpf_iter_tcp_established_batch() spin_lock(bucket) sock_hold(req) <-- Addition auf 0 spin_unlock(bucket) refcount_set(&req->rsk_refcnt, 3) // überschreibt gesättigten Wert

was sich äußert als:

refcount_t: addition on 0; use-after-free. WARNING: lib/refcount.c:25 at refcount_warn_saturate+0x48/0x90, CPU#1 Call Trace: bpf_iter_tcp_established_batch+0x14e/0x170 bpf_iter_tcp_batch+0x53/0x200 bpf_iter_tcp_seq_next+0x27/0x70 bpf_seq_read+0x107/0x410 vfs_read+0xb9/0x380

Die vom Iterator gestohlene Referenz geht verloren, wenn refcount_set() der veröffentlichenden CPU den Zähler überschreibt, wodurch das Socket um eine Referenz verkürzt wird. Wenn der letzte legitime Besitzer seine Referenz freigibt, wird reqsk freigegeben, ist aber weiterhin erreichbar, was zu einem Use-After-Free führt.

Dies lässt sich in Sekunden reproduzieren mit tcp_syncookies=0, einer Handvoll Threads, die connect()/close() an einen lokalen Listener ausführen, während andere eine iter/tcp-Verbindung in einer engen Schleife lesen.

Es wird refcount_inc_not_zero() verwendet und das Socket bei einem Fehler übersprungen. Ein überspringtes Socket ist weiterhin Teil des Buckets, daher muss es in expected mitgezählt werden. Die Neuzuordnungen sind von expected dimensioniert, und ein request_sock, dessen Refcount während des Lock-Haltens über die letzte Realloc hinweg veröffentlicht wird, muss bereits Platz haben.

Ein übersprungenes Socket wird in expected gezählt, aber nicht gebatcht, sodass end_sk bei einem tatsächlich vollständigen Batch unter expected liegen kann. Die Vollständigkeit wird stattdessen dadurch entschieden, ob der Walk ein Socket zurückgelassen hat. Der WARN nach dem gesperrten Realloc prüft dasselbe und ersetzt eine end_sk == expected-Prüfung, die auf diesem Pfad seit Commit cdec67a489d4 ("bpf: tcp: Make sure iter->batch always contains a full bucket snapshot") nicht zutreffen konnte.

Wenn jedes passende Socket in einem Bucket mitten in der Initialisierung ist (Refcount 0), bleibt end_sk bei 0. Es wird zum nächsten Bucket gewechselt, anstatt einen Batch-Eintrag zurückzugeben, der in dieser Runde nie gefüllt wurde.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Zuständig

Linux

Reservieren

15.08.2026

Veröffentlichung

22.08.2026

Moderieren

akzeptiert

Eintrag

VDB-394508

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

low

Quellen

Want to stay up to date on a daily basis?

Enable the mail alert feature now!