Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
cve-2026-52910-poc — Reproducteur de race et boîte à outils de stress pour CVE-2026-52910, un use-after-free du noyau Linux dans les programmes sélecteurs cBPF de reuseport, avec vérifications dmesg et de fuites. | Kitploit
Outils/GitHubGitHub/yolkfull/cve-2026-52910-poc
Outils DéfensifsAnalyse des VulnérabilitésExploitationFuzzingArticles et RechercheExploitation de Binaires
GitHubyolkfull/cve-2026-52910-poc

cve-2026-52910-poc

Reproducteur de race et boîte à outils de stress pour CVE-2026-52910, un use-after-free du noyau Linux dans les programmes sélecteurs cBPF de reuseport, avec vérifications dmesg et de fuites.

Voir le dépôt
il y a 20h 7mPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-52910 — Reproducteur de use-after-free dans le sélecteur cBPF reuseport

CI

Un reproducteur de race et une boîte à outils de stress pour CVE-2026-52910, un use-after-free (UAF) dans la gestion par le noyau Linux des programmes sélecteurs reuseport en BPF classique (cBPF), corrigé en amont par le commit "bpf: Free reuseport cBPF prog after RCU grace period".

CVECVE-2026-52910
TypeUse-after-free / lecture hors limites (CWE-125), CVSS 3.1 7.8 HIGH AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Introduitv4.5 (avec le support cBPF reuseport)
Corrigé dans5.10.259, 5.15.210, 6.1.176, 6.6.143, 6.12.94, 6.18.36, 7.0.13 (stable) ; mainline v7.1
Splat amontBUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock (net/core/sock_reuseport.c:596)
Rapporté parEulgyu Kim

[!WARNING] Ceci est un outil de stress du noyau. Sur un noyau vulnérable, il élargit délibérément une fenêtre de race use-after-free ; un déclenchement peut faire planter ou corrompre la machine. Ne l'exécutez que sur des machines que vous possédez ou pour lesquelles vous êtes explicitement autorisé à tester (VM de test, machines CI jetables), jamais sur des systèmes de production.

Le bug en une minute

SO_REUSEPORT permet à de nombreux sockets de se lier au même port UDP ; pour chaque paquet entrant, le noyau choisit un socket du groupe dans reuseport_select_sock() (net/core/sock_reuseport.c). Un groupe peut installer un programme sélecteur — un programme BPF classique attaché avec setsockopt(SO_ATTACH_REUSEPORT_CBPF) — qui décide par paquet quel socket du groupe le reçoit. Le programme s'exécute dans la softirq RX (traitement de réception réseau) à l'intérieur d'une section critique de lecture RCU.

Le bug : lorsque le programme est remplacé ou détaché via setsockopt() (reuseport_attach_prog() / reuseport_detach_prog()), l'ancien programme cBPF est libéré immédiatement par sk_reuseport_prog_free(), sans attendre les lecteurs RCU en cours. Un CPU qui parcourt encore les instructions du programme libéré lit de la mémoire vmalloc libérée :

root@kitploit:~
sequenceDiagram
    autonumber
    participant C as CPU0 — churner thread
    participant K as setsockopt() path
    participant R as CPU1 — RX softirq

    R->>R: rcu_read_lock()
    R->>R: prog = rcu_dereference(reuse->prog)
    C->>K: setsockopt(SO_ATTACH_REUSEPORT_CBPF, progB)
    K->>K: swap progA → progB
    K->>K: sk_reuseport_prog_free(progA)
    Note right of K: unfixed kernels: bpf_prog_free()<br/>runs NOW — no RCU grace period
    R->>R: execute progA->insns (run_bpf_filter)
    Note right of R: progA was already freed<br/>KASAN: vmalloc-out-of-bounds
    Note over K: fix: call_rcu(sk_reuseport_prog_free_rcu) —<br/>free deferred by one RCU grace period

Le chemin sélecteur eBPF (SO_ATTACH_REUSEPORT_EBPF) n'est pas affecté : il libère déjà les programmes via les étapes différées de bpf_prog_put(). Le correctif applique le même traitement au chemin cBPF — une période de grâce RCU avant que l'ancien programme ne soit libéré.

Le rapport KASAN amont (sur un noyau de debug 7.0) :

root@kitploit:~
BUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock+0xedc/0x1220
Read of size 4 at addr ffffc9000051e004 by task slowme/10208
 net/core/sock_reuseport.c:596

Contenu de ce dépôt

FichierObjectif
reuseport_race_hammer.cLe reproducteur : un marteau multithreadé qui fait tourner le sélecteur cBPF sous pleine charge UDP, puis vérifie l'intégrité de la livraison.
run_hammer.shWrapper d'exécution unique : augmente net.core.optmem_max, exécute le marteau, puis vérifie dmesg pour les splats, /proc/vmallocinfo pour les allocations bpf_prog fuitées, et optionnellement kmemleak.
livepatch_cycle.shApplique/révoque un livepatch contenant le correctif pendant que le marteau tourne — traque les dangers du cycle de vie des livepatches du correctif basé sur call_rcu().
MakefileCompile le marteau.
.github/workflows/ci.ymlCI : build + shellcheck (pas de tests noyau à l'exécution ; voir CI).

Démarrage rapide

Sur une machine de test Linux :

root@kitploit:~
$ make
$ sudo ./run_hammer.sh 600        # 10-minute run
...
== result: RC=0 (0 clean / 1 setup / 2 splat / 3 leak / 4 integrity) ==

Prérequis :

  • Une machine de test Linux que vous pouvez faire planter (VM ou bare metal). Un noyau avec KASAN activé est fortement recommandé — sans KASAN, un déclenchement de race peut passer complètement inaperçu.
  • gcc et bash.
  • Root pour les vérifications du wrapper (dmesg, /proc/vmallocinfo, sysctl) ; le marteau lui-même s'exécute sans privilèges (le repro amont tournait en UID 1000).
  • Une machine au repos : le trafic de fond et les autres utilisateurs de BPF ajoutent du bruit à la vérification des fuites.
  • Le marteau lie des ports UDP à partir de 21000 (un port par groupe reuseport) — assurez-vous qu'ils sont libres.

Résultats attendus :

  • Noyau vulnérable — splat KASAN dans dmesg → RC=2 ; parfois la vérification d'intégrité du marteau se déclenche en premier → RC=4.
  • Noyau corrigé — exécution propre, RC=0, compteur vmalloc bpf_prog stable.

La fenêtre de race est minuscule (libération vs. exécution RX en cours), donc considérez une seule exécution propre comme non concluante. Pour un vrai test, exécutez pendant des heures, par exemple :

root@kitploit:~
$ sudo ./run_hammer.sh 86400 512 8 16 4 127.0.0.1 0

Le marteau : reuseport_race_hammer

root@kitploit:~
$ ./reuseport_race_hammer [dur_sec] [insns] [nports] [nsocks] [nsenders] [ip] [ebpf]
ArgumentDéfautSignification
dur_sec300 (min 45)durée totale d'exécution en secondes
insns256instructions de remplissage dans le programme cBPF churné ; un programme plus gros est une région libérée plus grande à toucher. Si l'attache échoue avec ENOMEM, augmentez net.core.optmem_max (le wrapper le fait pour vous).
nports4 (max 64)groupes reuseport (un port UDP chacun, à partir de 21000)
nsocks8 (max 512)sockets par groupe
nsenders4 (max 32)threads émetteurs UDP par groupe
ip127.0.0.1adresse cible ; utilisez l'IP d'une NIC physique pour répartir les softirqs RX sur les CPUs (RSS)
ebpf01 = churner aussi l'attache/détache SO_ATTACH_REUSEPORT_EBPF (nécessite CAP_BPF/CAP_NET_ADMIN) ; ce chemin n'est pas vulnérable, c'est pour la comparaison/couverture

Chaque groupe exécute un thread churner qui échange et détache le sélecteur cBPF via setsockopt() en boucle serrée, et des threads sender qui inondent le groupe de datagrammes UDP de 64 octets pendant que les récepteurs comptent la livraison par socket.

Phases d'exécution (T = dur_sec) :

root@kitploit:~
time ──────────────────────────────────────────────────────────────►
 [0 ──────────── T-15s)   [T-15s ── T-10s)   [T-10s ─────────── T]
       CHURN + FLOOD             SETTLE               MEASURE
 churner swaps/detaches    churn frozen,       deterministic program
 the selector prog at      final program       (selects the LAST
 max rate under full       attached             socket): EVERY packet
 UDP flood — THE           (selects LAST        must land on the LAST
 race window open          socket)              socket; snapshot A →
                                               run → snapshot B

Vérification d'intégrité : pendant la phase de mesure, le programme final sélectionne de manière déterministe le dernier socket du groupe. Si les paquets reçus par le groupe pendant cette fenêtre n'ont pas tous atterri sur ce socket, la sélection a mal tourné (un effet possible de l'UAF même sans KASAN) → code de sortie 2.

Codes de sortie du marteau : 0 PASS · 1 erreur de configuration/exécution · 2 WARN d'intégrité.

run_hammer.sh — wrapper d'exécution unique

Exécute le marteau et ajoute les vérifications qui rendent une exécution unique significative :

  1. capture le nombre d'allocations bpf_prog dans /proc/vmallocinfo ;
  2. augmente net.core.optmem_max pour que les programmes cBPF de plusieurs Ko s'attachent proprement ;
  3. exécute le marteau ;
  4. attend DRAIN (30s par défaut) que les libérations différées RCU/workqueue se terminent ;
  5. scanne dmesg pour les nouveaux splats (BUG:, Oops:, WARNING:, RIP:, leaked, stuck) ;
  6. compare le compteur vmalloc bpf_prog avant/après (vérification des fuites), et scanne optionnellement kmemleak si /sys/kernel/debug/kmemleak existe.
EnvDéfautSignification
HAMMER./reuseport_race_hammerbinaire du marteau
DRAIN30secondes d'attente après l'exécution avant la vérification
OPTMEM_MAX131072valeur pour net.core.optmem_max ; 0 = ne pas toucher

Codes de sortie : 0 propre · 1 erreur de configuration (y compris échec de configuration du marteau) · 2 splat noyau détecté · 3 fuite bpf_prog possible · 4 WARN d'intégrité du marteau.

livepatch_cycle.sh — test du cycle de vie des livepatches

Le correctif libère l'ancien programme cBPF depuis un callback call_rcu(). Si vous livrez le correctif sous forme de livepatch (kernel live patching — code patché dans un noyau en cours d'exécution), la fonction de callback elle-même réside dans le module de patch : une révocation/déchargement alors que des callbacks sont encore en attente libère le texte du module sous les pieds du callback. Ce script exerce des cycles d'application/révocation pendant que le marteau maintient la fenêtre de race chaude, et surveille /sys/kernel/livepatch/*/transition et dmesg.

root@kitploit:~
$ MODE=rcu ./livepatch_cycle.sh 20 120    # 20 cycles × 120s hammer each
ModeComportement
cycle (défaut)appliquer → révoquer, les deux sous charge de marteau soutenue
rcurévoquer immédiatement au churn maximal — le cas à risque ci-dessus
safearrêter le marteau → dormir GRACE (30s par défaut, une période de grâce) → révoquer
EnvDéfautSignification
APPLY_CMD / REVERT_CMDkpatch load $PATCH / kpatch unload $PATCHcommandes livepatch
PATCH./livepatch-reuseport.komodule de patch
HAMMER./reuseport_race_hammerbinaire du marteau
HAMMER_ARGS256 4 8 4 127.0.0.1 0arguments du marteau
TRANSITION_TIMEOUT60secondes max d'attente d'une transition livepatch
GRACE30sommeil de période de grâce pour MODE=safe
FORCE01 = exécuter même si aucune transition livepatch n'est détectée

Codes de sortie : 0 propre · 1 échec de commande · 2 splat ou transition bloquée · 4 WARN d'intégrité du marteau.

CI

La CI compile le marteau avec deux jeux de flags et exécute shellcheck sur les scripts. Les tests noyau à l'exécution ne sont intentionnellement pas exécutés sur les runners CI partagés : le reproducteur a besoin du contrôle sur la version du noyau du runner (et sur un noyau vulnérable, il pourrait faire planter le runner). Exécutez-les sur de vraies machines de test.

Références

  • Enregistrement NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-52910
  • Correctif : bpf: Free reuseport cBPF prog after RCU grace period — backports stables : 08264d5bba0b, 18fc650ccd7d, 298db6167f81, 87dfb977bdb6, 90e47dc5c572, c3e3fddda6b5, f8b8f1d4bb76, fec41484e7c2
  • Suivi Red Hat : https://bugzilla.redhat.com/show_bug.cgi?id=2490779

Licence

GPL-2.0-only — voir LICENSE.

Télécharger l’outil