Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-8932-PoC — Prueba de concepto que reproduce CVE-2026-8932, un fallo de coincidencia en la configuración incompleta de mTLS en la reutilización de conexiones de libcurl, con un servidor de laboratorio local y un PoC en C. | Kitploit
Herramientas/GitHubGitHub/nimaarek/cve-2026-8932-poc
Análisis de VulnerabilidadesExplotaciónCriptografíaPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHubnimaarek/cve-2026-8932-poc

CVE-2026-8932-PoC

Prueba de concepto que reproduce CVE-2026-8932, un fallo de coincidencia en la configuración incompleta de mTLS en la reutilización de conexiones de libcurl, con un servidor de laboratorio local y un PoC en C.

Ver Repositorio
hace 11h 24mAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-8932 PoC

Reproducción de prueba de concepto de CVE-2026-8932, un problema de coincidencia incompleta de configuración mTLS en la reutilización de conexiones de libcurl.

Descripción general

CVE-2026-8932 afecta la lógica de reutilización de conexiones de libcurl cuando la configuración de TLS mutuo (mTLS) cambia entre solicitudes.

En condiciones vulnerables, libcurl puede reutilizar una conexión TLS existente aunque una opción de configuración relacionada con mTLS haya cambiado y debería haber impedido que esa conexión se reutilizara.

Esta PoC demuestra el problema cambiando la contraseña de la clave privada entre dos solicitudes mientras se utiliza el mismo certificado de cliente y la misma clave privada.

La primera solicitud utiliza la contraseña correcta:

root@kitploit:~
correct-password

La segunda solicitud utiliza intencionalmente una contraseña no válida:

root@kitploit:~
WRONG-PASSWORD

Si libcurl reutiliza incorrectamente la conexión TLS existente, la segunda solicitud no requiere otro handshake TLS. En consecuencia, la contraseña no válida de la clave privada nunca es necesaria para establecer una nueva conexión TLS y la solicitud tiene éxito.

Por lo tanto, la PoC demuestra la condición de reutilización de conexión asociada con CVE-2026-8932.


Detalles de la vulnerabilidad

PropiedadValor
CVECVE-2026-8932
Componentelibcurl
Tipo de vulnerabilidadCoincidencia incompleta de configuración mTLS
CWECWE-305 — Omisión de autenticación por debilidad primaria
Área afectadaReutilización de conexión TLS
ProtocoloHTTPS / mTLS
ClienteAPI de libcurl
CLI de curlNo afectado
Alcance de la PoCEntorno de laboratorio local

La vulnerabilidad es un problema de lógica/coincidencia de configuración, en lugar de una vulnerabilidad tradicional de seguridad de memoria como un desbordamiento de búfer o un use-after-free.


Antecedentes técnicos

libcurl mantiene información de conexión y puede reutilizar una conexión existente cuando una solicitud posterior se considera compatible con la configuración de la conexión.

Para las conexiones TLS, la configuración de la conexión debe compararse cuidadosamente antes de su reutilización.

La implementación vulnerable no incluía todos los campos de configuración mTLS relevantes en la lógica de coincidencia de conexiones.

Entre las configuraciones afectadas se encuentran:

root@kitploit:~
cert_type
key
key_type
key_passwd
key_blob

La configuración importante utilizada por esta PoC es:

root@kitploit:~
key_passwd

La PoC establece una conexión TLS utilizando una clave privada de cliente cifrada y la contraseña correcta:

root@kitploit:~
correct-password

Luego realiza otra solicitud utilizando el mismo certificado y la misma clave, pero cambia la contraseña a:

root@kitploit:~
WRONG-PASSWORD

Una implementación vulnerable de coincidencia de conexiones puede seguir considerando reutilizable la conexión existente.


Concepto de la PoC

La prueba consta de dos solicitudes HTTP.

Solicitud A

La primera solicitud establece la conexión TLS:

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

Client certificate:
client.crt

Private key:
client.key

Key password:
correct-password

La conexión TLS permanece persistente porque el servidor admite HTTP keep-alive.

Solicitud B

La segunda solicitud utiliza el mismo certificado y la misma clave privada, pero cambia la contraseña de la clave:

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

Client certificate:
client.crt

Private key:
client.key

Key password:
WRONG-PASSWORD

Si libcurl crea una nueva conexión TLS, cargar la clave privada cifrada con la contraseña incorrecta debería fallar.

Sin embargo, si libcurl reutiliza incorrectamente la conexión existente, no se requiere un nuevo handshake TLS.

Por lo tanto, la contraseña no válida no impide que la solicitud HTTP tenga éxito.


Arquitectura de la prueba

La configuración del laboratorio consta de:

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)

La observación importante es que /A y /B deben llegar en la misma conexión TLS.


Estructura del repositorio

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

El directorio certs/ se mantiene intencionalmente vacío en el repositorio. Los certificados y las claves privadas deben generarse localmente.


Reproducción

Requisitos

La PoC se probó en el siguiente entorno:

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

Architecture:
x86_64

libcurl:
8.14.1

OpenSSL:
3.5.7

GCC:
14.2.0

La instalación vulnerable de libcurl utilizada para la reproducción fue:

root@kitploit:~
libcurl/8.14.1

Verifique la versión instalada:

root@kitploit:~
curl --version

y:

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

1. Crear el directorio del laboratorio

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

cd ~/cve-2026-8932-lab

2. Generar 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. Generar el certificado del servidor

Genere la clave privada del servidor:

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

Genere la CSR:

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

Cree las extensiones del certificado:

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

Firme el certificado utilizando la CA de prueba:

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. Generar el certificado del cliente

Genere la clave privada del cliente:

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

Genere la CSR:

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

Convierta la clave privada al formato PKCS#8 cifrado:

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

La clave privada resultante se cifra con:

root@kitploit:~
correct-password

Cree las extensiones del certificado del cliente:

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

Firme el certificado del cliente:

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

En este punto, los archivos requeridos deberían existir:

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

5. Iniciar el servidor mTLS

Muévase al directorio del servidor:

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

Inicie el servidor:

root@kitploit:~
python3 server.py

El servidor escucha en:

root@kitploit:~
0.0.0.0:8443

Se requiere autenticación mediante certificado de cliente.

El servidor también mantiene activas las conexiones HTTP/1.1 para que libcurl pueda reutilizar la conexión TLS.


6. Compilar la PoC

Abra otra terminal:

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

Compile:

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

7. Ejecutar la PoC

Ejecute:

root@kitploit:~
./poc

La PoC utiliza:

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

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

Comportamiento vulnerable esperado

La evidencia más importante del lado del cliente es:

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 solicitud luego recibe:

root@kitploit:~
< HTTP/1.1 200 OK

y la PoC informa:

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

Esto es significativo porque /B utiliza una contraseña de clave privada intencionalmente no válida.

La observación clave no es simplemente que /B tenga éxito.

La evidencia crítica es que libcurl informa explícitamente:

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

Por lo tanto, la segunda solicitud no necesita realizar otro handshake TLS utilizando la configuración de clave modificada.


Evidencia del lado del servidor

La salida del servidor proporciona confirmación independiente de la reutilización de la conexión.

La salida relevante es:

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

La observación importante es:

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

Por lo tanto, ambas solicitudes HTTP se recibieron a través de la misma conexión TLS.

El servidor también informa la misma identidad de cliente:

root@kitploit:~
Client-A

para ambas solicitudes.


Por qué la contraseña incorrecta no provoca un fallo de TLS

La clave privada utilizada por la PoC está cifrada.

La primera solicitud utiliza:

root@kitploit:~
correct-password

lo que permite a libcurl/OpenSSL acceder a la clave privada y establecer la conexión TLS.

La segunda solicitud cambia la configuración a:

root@kitploit:~
WRONG-PASSWORD

Si tuviera que establecerse una nueva conexión TLS, libcurl necesitaría procesar de nuevo la clave privada cifrada y la contraseña incorrecta debería provocar que la operación fallara.

Sin embargo, cuando se reutiliza la conexión TLS existente, la sesión TLS ya está establecida.

No es necesaria ninguna nueva operación de autenticación de cliente para /B.

Conceptualmente:

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

Reutilización de conexión vs reanudación de sesión TLS

Esta PoC demuestra reutilización de conexión, no reanudación de sesión TLS.

Los dos mecanismos son diferentes.

Reutilización de conexión

Una conexión TLS ya establecida permanece abierta y se utiliza para otra solicitud HTTP:

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

No se requiere un segundo handshake TLS.

Reanudación de sesión TLS

Se crea una nueva conexión TCP/TLS, pero se utiliza información criptográfica de sesión de una conexión anterior para acortar el nuevo handshake TLS.

Eso no es en lo que se basa esta PoC.

La PoC comparte intencionalmente:

root@kitploit:~
CURL_LOCK_DATA_CONNECT

entre los dos easy handles sin compartir:

root@kitploit:~
CURL_LOCK_DATA_SSL_SESSION

Esto mantiene la demostración centrada en la reutilización de conexión.


Evidencia

El repositorio contiene la salida capturada de la reproducción exitosa.

Salida de la PoC del lado del cliente

PoC output

La salida capturada demuestra:

  • versión de libcurl
  • conexión TLS inicial
  • solicitud /A exitosa
  • contraseña de clave modificada
  • Re-using existing https: connection
  • solicitud /B exitosa

La salida completa de la terminal también está disponible en:

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

Salida del lado del servidor

Server output

La evidencia del lado del servidor demuestra que:

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

La salida completa del servidor está disponible en:

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

Nota importante sobre los números de conexión

Si se realiza una prueba manual con curl antes de ejecutar la PoC, el servidor puede mostrar una conexión anterior:

root@kitploit:~
TLS connection #1

Esta conexión no está relacionada con la ejecución real de la PoC.

Por ejemplo, la solicitud de validación manual:

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

puede crear la conexión #1.

La PoC real puede entonces crear la conexión #2.

Por lo tanto, la condición relevante no es el número absoluto de conexión, sino que:

root@kitploit:~
/A and /B

aparezcan en la misma conexión TLS durante la ejecución de la PoC.


Corrección relevante de libcurl

La corrección upstream es:

root@kitploit:~
7541ae569d82fb308a5e2d94916027da4fa3ba3e

Commit:

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

La corrección añade las comparaciones de configuración mTLS faltantes a la lógica de coincidencia de conexiones.

Conceptualmente, la lógica de coincidencia ahora considera valores que incluyen:

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)

El cambio importante para esta PoC es la comparación de:

root@kitploit:~
key_passwd

Por lo tanto, un cambio en la contraseña de la clave privada debería impedir que la conexión existente se considere compatible para su reutilización.


Prueba de regresión

La corrección upstream también introdujo cobertura de regresión para el comportamiento de coincidencia de configuración TLS.

La prueba relevante está asociada con:

root@kitploit:~
test 3303

Las pruebas de regresión cubren diferencias en la configuración mTLS, incluyendo:

root@kitploit:~
key_passwd
key
key_type
cert_type

Por ejemplo, las configuraciones idénticas deberían coincidir:

root@kitploit:~
config A == config B

mientras que cambiar la contraseña de la clave no debería:

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

        ↓

connection match = false

Esta es la misma dimensión de configuración ejercitada por esta PoC.


Solución de problemas

/B falla

Si /B falla, primero verifique si libcurl realmente reutilizó la conexión.

La salida detallada debería contener:

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

Si esta línea no aparece, la condición de vulnerabilidad no se ha demostrado.


/A y /B aparecen en conexiones TLS diferentes

El servidor debería mostrar:

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

Si en cambio ve:

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

entonces la segunda solicitud creó una nueva conexión TLS y la condición prevista no se reprodujo.

Verifique que:

  • CURL_LOCK_DATA_CONNECT se comparte.
  • CURLOPT_FORBID_REUSE no está habilitado.
  • CURLOPT_FRESH_CONNECT no está habilitado.
  • El servidor envía Connection: keep-alive.
  • Se está utilizando HTTP/1.1.
  • Ambas solicitudes apuntan al mismo host y puerto.

Errores de contraseña de la clave privada

La clave privada del cliente debe generarse utilizando:

root@kitploit:~
correct-password

La PoC luego utiliza intencionalmente:

root@kitploit:~
WRONG-PASSWORD

No cambie la contraseña incluida en el comando de generación de la clave privada a menos que también se cambie el valor correspondiente de la PoC.


Consideraciones de seguridad

Este repositorio está destinado a la investigación de seguridad controlada y a la reproducción de vulnerabilidades.

La PoC está diseñada para operar contra un servidor de prueba alojado localmente:

root@kitploit:~
127.0.0.1:8443

No utilice la PoC contra sistemas sin autorización.

Las claves privadas y los certificados generados deben permanecer fuera del control de versiones.

El repositorio solo debe contener:

root@kitploit:~
certs/.gitkeep

en lugar de claves privadas generadas.


Referencias

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

Créditos

El diseño de la PoC, la metodología de laboratorio, la implementación y el análisis técnico fueron desarrollados por AliReza con la asistencia de OpenAI ChatGPT (GPT-5.6 Luna).

La verificación humana, la ejecución, las pruebas y la reproducción fueron realizadas por el autor del repositorio.


Descargo de responsabilidad

Este repositorio se proporciona con fines de investigación de seguridad, análisis de vulnerabilidades y educación.

Úselo solo en sistemas y entornos para los que tenga autorización explícita.

Descargar herramienta