Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/nimaarek/cve-2026-8932-poc
Análise de VulnerabilidadesExploraçãoCriptografiaTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHubnimaarek/cve-2026-8932-poc

CVE-2026-8932-PoC

Prova de conceito que reproduz o CVE-2026-8932, uma falha de correspondência em configuração mTLS incompleta na reutilização de conexões do libcurl, com um servidor de laboratório local e PoC em C.

Ver Repositório
há 11h 48mAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-8932 PoC

Reprodução de prova de conceito de CVE-2026-8932, um problema de correspondência incompleta de configuração mTLS na reutilização de conexões do libcurl.

Visão Geral

CVE-2026-8932 afeta a lógica de reutilização de conexões do libcurl quando a configuração de mutual TLS (mTLS) muda entre requisições.

Em condições vulneráveis, o libcurl pode reutilizar uma conexão TLS existente mesmo que uma opção de configuração relacionada a mTLS tenha mudado e deveria ter impedido que essa conexão fosse reutilizada.

Esta PoC demonstra o problema alterando a senha da chave privada entre duas requisições, enquanto utiliza o mesmo certificado de cliente e chave privada.

A primeira requisição usa a senha correta:

root@kitploit:~
correct-password

A segunda requisição usa intencionalmente uma senha inválida:

root@kitploit:~
WRONG-PASSWORD

Se o libcurl reutilizar incorretamente a conexão TLS existente, a segunda requisição não exigirá outro handshake TLS. Consequentemente, a senha inválida da chave privada nunca será necessária para estabelecer uma nova conexão TLS e a requisição será bem-sucedida.

A PoC, portanto, demonstra a condição de reutilização de conexão associada a CVE-2026-8932.


Detalhes da Vulnerabilidade

PropriedadeValor
CVECVE-2026-8932
Componentelibcurl
Tipo de VulnerabilidadeCorrespondência incompleta de configuração mTLS
CWECWE-305 — Authentication Bypass by Primary Weakness
Área AfetadaReutilização de conexão TLS
ProtocoloHTTPS / mTLS
ClienteAPI libcurl
CLI curlNão afetado
Escopo da PoCAmbiente de laboratório local

A vulnerabilidade é um problema de lógica/correspondência de configuração, e não uma vulnerabilidade tradicional de segurança de memória, como buffer overflow ou use-after-free.


Contexto Técnico

O libcurl mantém informações de conexão e pode reutilizar uma conexão existente quando uma requisição subsequente é considerada compatível com a configuração da conexão.

Para conexões TLS, a configuração da conexão deve, portanto, ser comparada cuidadosamente antes da reutilização.

A implementação vulnerável não incluía todos os campos relevantes de configuração mTLS na lógica de correspondência de conexão.

Entre as configurações afetadas estão:

root@kitploit:~
cert_type
key
key_type
key_passwd
key_blob

A configuração importante usada por esta PoC é:

root@kitploit:~
key_passwd

A PoC estabelece uma conexão TLS usando uma chave privada de cliente criptografada e a senha correta:

root@kitploit:~
correct-password

Em seguida, realiza outra requisição usando o mesmo certificado e chave, mas altera a senha para:

root@kitploit:~
WRONG-PASSWORD

Uma implementação vulnerável de correspondência de conexão ainda pode considerar a conexão existente reutilizável.


Conceito da PoC

O teste consiste em duas requisições HTTP.

Requisição A

A primeira requisição estabelece a conexão TLS:

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

Certificado do cliente:
client.crt

Chave privada:
client.key

Senha da chave:
correct-password

A conexão TLS permanece persistente porque o servidor suporta HTTP keep-alive.

Requisição B

A segunda requisição usa o mesmo certificado e chave privada, mas altera a senha da chave:

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

Certificado do cliente:
client.crt

Chave privada:
client.key

Senha da chave:
WRONG-PASSWORD

Se o libcurl criar uma nova conexão TLS, o carregamento da chave privada criptografada com a senha errada deve falhar.

No entanto, se o libcurl reutilizar incorretamente a conexão existente, nenhum novo handshake TLS será necessário.

A senha inválida, portanto, não impede que a requisição HTTP seja bem-sucedida.


Arquitetura de Teste

A configuração do laboratório consiste em:

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)

A observação importante é que /A e /B devem chegar na mesma conexão TLS.


Estrutura do Repositório

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

O diretório certs/ é intencionalmente mantido vazio no repositório. Certificados e chaves privadas devem ser gerados localmente.


Reprodução

Requisitos

A PoC foi testada no seguinte ambiente:

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

Architecture:
x86_64

libcurl:
8.14.1

OpenSSL:
3.5.7

GCC:
14.2.0

A instalação vulnerável do libcurl usada para a reprodução foi:

root@kitploit:~
libcurl/8.14.1

Verifique a versão instalada:

root@kitploit:~
curl --version

e:

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

1. Criar o Diretório do Laboratório

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

cd ~/cve-2026-8932-lab

2. Gerar a 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. Gerar o Certificado do Servidor

Gere a chave privada do servidor:

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

Gere a CSR:

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

Crie as extensões do certificado:

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

Assine o certificado usando a CA de teste:

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. Gerar o Certificado do Cliente

Gere a chave privada do cliente:

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

Gere a CSR:

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

Converta a chave privada para o formato PKCS#8 criptografado:

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

A chave privada resultante é criptografada com:

root@kitploit:~
correct-password

Crie as extensões do certificado do cliente:

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

Assine o certificado do 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

Neste ponto, os arquivos necessários devem existir:

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

5. Iniciar o Servidor mTLS

Mova-se para o diretório do servidor:

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

Inicie o servidor:

root@kitploit:~
python3 server.py

O servidor escuta em:

root@kitploit:~
0.0.0.0:8443

A autenticação por certificado de cliente é obrigatória.

O servidor também mantém conexões HTTP/1.1 ativas para que o libcurl possa reutilizar a conexão TLS.


6. Compilar a PoC

Abra outro 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. Executar a PoC

Execute:

root@kitploit:~
./poc

A PoC usa:

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

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

Comportamento Vulnerável Esperado

A evidência mais importante do lado do cliente é:

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

A requisição então recebe:

root@kitploit:~
< HTTP/1.1 200 OK

e a PoC reporta:

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

Isso é significativo porque /B usa uma senha de chave privada intencionalmente inválida.

A observação principal não é simplesmente que /B é bem-sucedida.

A evidência crítica é que o libcurl reporta explicitamente:

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

Portanto, a segunda requisição não precisa realizar outro handshake TLS usando a configuração de chave modificada.


Evidência do Lado do Servidor

A saída do servidor fornece confirmação independente da reutilização da conexão.

A saída relevante é:

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

A observação importante é:

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

Ambas as requisições HTTP foram, portanto, recebidas através da mesma conexão TLS.

O servidor também reporta a mesma identidade de cliente:

root@kitploit:~
Client-A

para ambas as requisições.


Por Que a Senha Errada Não Causa uma Falha TLS

A chave privada usada pela PoC é criptografada.

A primeira requisição usa:

root@kitploit:~
correct-password

o que permite ao libcurl/OpenSSL acessar a chave privada e estabelecer a conexão TLS.

A segunda requisição altera a configuração para:

root@kitploit:~
WRONG-PASSWORD

Se uma nova conexão TLS tivesse que ser estabelecida, o libcurl precisaria processar novamente a chave privada criptografada e a senha incorreta deveria causar falha na operação.

No entanto, quando a conexão TLS existente é reutilizada, a sessão TLS já está estabelecida.

Nenhuma nova operação de autenticação de cliente é necessária para /B.

Conceitualmente:

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

Reutilização de Conexão vs Retomada de Sessão TLS

Esta PoC demonstra reutilização de conexão, não retomada de sessão TLS.

Os dois mecanismos são diferentes.

Reutilização de Conexão

Uma conexão TLS já estabelecida permanece aberta e é usada para outra requisição HTTP:

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

Nenhum segundo handshake TLS é necessário.

Retomada de Sessão TLS

Uma nova conexão TCP/TLS é criada, mas informações criptográficas de sessão de uma conexão anterior são usadas para encurtar o novo handshake TLS.

Não é nisso que esta PoC se baseia.

A PoC compartilha intencionalmente:

root@kitploit:~
CURL_LOCK_DATA_CONNECT

entre os dois easy handles, enquanto não compartilha:

root@kitploit:~
CURL_LOCK_DATA_SSL_SESSION

Isso mantém a demonstração focada na reutilização de conexão.


Evidências

O repositório contém a saída capturada da reprodução bem-sucedida.

Saída da PoC no Lado do Cliente

PoC output

A saída capturada demonstra:

  • versão do libcurl
  • conexão TLS inicial
  • requisição /A bem-sucedida
  • senha da chave alterada
  • Re-using existing https: connection
  • requisição /B bem-sucedida

A saída completa do terminal também está disponível em:

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

Saída do Lado do Servidor

Server output

A evidência do lado do servidor demonstra que:

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

A saída completa do servidor está disponível em:

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

Nota Importante Sobre Números de Conexão

Se um teste manual com curl for realizado antes de executar a PoC, o servidor pode exibir uma conexão anterior:

root@kitploit:~
TLS connection #1

Essa conexão não está relacionada à execução real da PoC.

Por exemplo, a requisição de validação 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

pode criar a conexão #1.

A PoC real pode então criar a conexão #2.

A condição relevante, portanto, não é o número absoluto da conexão, mas que:

root@kitploit:~
/A and /B

apareçam na mesma conexão TLS durante a execução da PoC.


Correção Relevante do libcurl

A correção upstream é:

root@kitploit:~
7541ae569d82fb308a5e2d94916027da4fa3ba3e

Commit:

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

A correção adiciona as comparações de configuração mTLS ausentes à lógica de correspondência de conexão.

Conceitualmente, a lógica de correspondência agora considera valores incluindo:

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)

A mudança importante para esta PoC é a comparação de:

root@kitploit:~
key_passwd

Uma alteração na senha da chave privada deve, portanto, impedir que a conexão existente seja considerada compatível para reutilização.


Teste de Regressão

A correção upstream também introduziu cobertura de regressão para o comportamento de correspondência de configuração TLS.

O teste relevante está associado a:

root@kitploit:~
test 3303

O teste de regressão cobre diferenças na configuração mTLS, incluindo:

root@kitploit:~
key_passwd
key
key_type
cert_type

Por exemplo, configurações idênticas devem corresponder:

root@kitploit:~
config A == config B

enquanto alterar a senha da chave não deve:

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

        ↓

connection match = false

Esta é a mesma dimensão de configuração exercitada por esta PoC.


Solução de Problemas

/B falha

Se /B falhar, primeiro verifique se o libcurl realmente reutilizou a conexão.

A saída verbosa deve conter:

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

Se esta linha não aparecer, a condição de vulnerabilidade não foi demonstrada.


/A e /B aparecem em conexões TLS diferentes

O servidor deve mostrar:

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

Se, em vez disso, você vir:

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

então a segunda requisição criou uma nova conexão TLS e a condição pretendida não foi reproduzida.

Verifique se:

  • CURL_LOCK_DATA_CONNECT está compartilhado.
  • CURLOPT_FORBID_REUSE não está habilitado.
  • CURLOPT_FRESH_CONNECT não está habilitado.
  • O servidor envia Connection: keep-alive.
  • HTTP/1.1 está sendo usado.
  • Ambas as requisições têm como alvo o mesmo host e porta.

Erros de senha da chave privada

A chave privada do cliente deve ser gerada usando:

root@kitploit:~
correct-password

A PoC então usa intencionalmente:

root@kitploit:~
WRONG-PASSWORD

Não altere a senha incorporada no comando de geração da chave privada, a menos que o valor correspondente na PoC também seja alterado.


Considerações de Segurança

Este repositório destina-se a pesquisa de segurança controlada e reprodução de vulnerabilidades.

A PoC foi projetada para operar contra um servidor de teste hospedado localmente:

root@kitploit:~
127.0.0.1:8443

Não use a PoC contra sistemas sem autorização.

Chaves privadas e certificados gerados devem permanecer fora do controle de versão.

O repositório deve conter apenas:

root@kitploit:~
certs/.gitkeep

em vez de chaves privadas geradas.


Referências

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

Créditos

O design da PoC, a metodologia de laboratório, a implementação e a análise técnica foram desenvolvidos por AliReza com assistência do OpenAI ChatGPT (GPT-5.6 Luna).

A verificação humana, execução, testes e reprodução foram realizados pelo autor do repositório.


Aviso Legal

Este repositório é fornecido para fins de pesquisa de segurança, análise de vulnerabilidades e fins educacionais.

Use-o apenas em sistemas e ambientes para os quais você tenha autorização explícita.

Baixar ferramenta