
Verifica builds locais de curl/libcurl quanto à exposição à use-after-free no upload HTTP/2 da CVE-2026-92392, com inventário passivo, varredura de imagens montadas e uma sonda PoC limitada em loopback.
cve_2026_92392_check.py avalia artefatos locais de curl e libcurl quanto à
CVE-2026-92392, um use-after-free em
upload HTTP/2 no curl/libcurl.
Ele oferece suporte a inventário local passivo, avaliação de banners fornecidos, varredura de imagens montadas sem execução e uma sonda de protocolo HTTP/2 limitada em loopback. A sonda é defensiva e não armamentizada. Ela não contém payload de comando, shellcode, manipulação de endereço de memória, lógica de vazamento de informações nem payload de RCE.
A sonda ativa vincula-se apenas a 127.0.0.1, não aceita URL ou host de alvo
remoto e executa apenas o binário curl local selecionado.
O verificador separa quatro níveis distintos de evidência:
| Nível de evidência | O que estabelece | O que não estabelece |
|---|---|---|
| Classificação de build | Se um artefato curl/libcurl qualificado por versão está fora do intervalo afetado upstream, afetado upstream com estado de patch do fornecedor desconhecido, ou confirmadamente afetado usando evidência de estado de patch fornecida | Se uma aplicação realmente usa o caminho de upload HTTP/2 afetado |
| Contexto de exposição em tempo de execução | Se fatos fornecidos da aplicação indicam que uploads HTTP/2 podem alcançar um endpoint controlado pelo atacante | Se a vulnerabilidade foi acionada |
| Estímulo de protocolo | Se o harness de loopback local entregou ambas as variantes de reset documentadas com dois uploads em uma única conexão HTTP/2 | Um use-after-free, causa de crash ou execução de código |
| Resultado de sanitizer atribuído à CVE | Se a sequência candidata, um heap-use-after-free do AddressSanitizer, uma identidade de artefato afetada upstream e uma pilha HTTP/2 correspondente foram todos observados | Confiabilidade ou explorabilidade prática em outro sistema |
Uma execução limpa, uma execução de protocolo incompleta ou uma execução de sanitizer sem crash não provam que um build é seguro.
A CVE-2026-92392 afeta o tratamento de upload HTTP/2 no curl/libcurl. Durante um
upload, um build afetado pode processar um RST_STREAM HTTP/2 contendo
REFUSED_STREAM ou HTTP_1_1_REQUIRED. Dados de upload em buffer podem então
ser interpretados como uma nova requisição depois que o estado HTTP/2 da
transferência original foi desanexado. Um callback HTTP/2 posterior pode
desreferenciar um ponteiro Curl_easy obsoleto.
A comparação REA usada para revisar este verificador confirmou a diferença relevante na ordenação de limpeza:
Curl_conn_ev_data_done, processa handles
pendentes e só então chama Curl_req_done.Curl_req_done chega a req_flush, enquanto o caminho de data-done do
HTTP/2 já limpou o contexto do stream.Curl_req_done antes de
Curl_conn_ev_data_done, eliminando essa ordenação obsoleta.Esta é uma evidência de implementação que sustenta o modelo de prova do verificador. O estado de patch do fornecedor ainda requer verificação independente.
O aviso upstream identifica a implementação vulnerável como introduzida no curl 8.12.0. O verificador classifica as versões upstream da seguinte forma:
| Condição da versão | Classificação |
|---|---|
| Anterior a 8.12.0 | NOT AFFECTED |
| 8.12.0 até 8.22.0, excluindo backports corrigidos | Afetada upstream |
| Ramo 8.14 na versão 8.14.3 ou posterior | Backport corrigido |
| Ramo 8.16 na versão 8.16.2 ou posterior | Backport corrigido |
| Ramo 8.20 na versão 8.20.2 ou posterior | Backport corrigido |
| 8.23.0 ou posterior | NOT AFFECTED |
| Desenvolvimento, snapshot, nightly ou versão ambígua | INDETERMINATE |
Um fornecedor pode aplicar o backport da correção sem alterar a string de versão upstream do curl. Portanto, uma versão upstream afetada é evidência de inventário, não prova conclusiva de que um build do fornecedor não foi corrigido.
Use --patch-state apenas quando o estado semântico da correção downstream
tiver sido verificado por meio de avisos do fornecedor, changelogs de pacotes,
comparação de código-fonte ou outro método confiável em nível de artefato.
valor de --patch-state | Significado |
|---|---|
unknown | Padrão. Uma versão upstream afetada produz UPSTREAM-AFFECTED VERSION. |
absent | O operador verificou de forma independente que a correção downstream está ausente. Uma build afetada com suporte a HTTP/2 produz AFFECTED BUILD. |
present | O operador verificou de forma independente que a correção semântica downstream está presente. Esta é uma afirmação do operador, não uma prova automática de equivalência binária com a correção upstream do curl. |
--poc.--poc-proof asan.openssl apenas quando --tls é usado.O modo PoC ativo recusa scripts, wrappers, executáveis nativos não identificados e binários PE/Windows. A avaliação passiva permanece disponível para banners e sistemas de arquivos montados.
Inspecione o binário curl encontrado no PATH:
python3 cve_2026_92392_check.py
Emitir JSON:
python3 cve_2026_92392_check.py --json
Execute testes internos:
python3 cve_2026_92392_check.py --self-test
python3 -O cve_2026_92392_check.py --self-test
Inspecione um executável curl selecionado e a biblioteca compartilhada libcurl:
python3 cve_2026_92392_check.py \
--curl-binary /opt/curl/bin/curl \
--libcurl-path /opt/curl/lib/libcurl.so \
--json
Avalie um banner curl confiável sem executar um binário:
python3 cve_2026_92392_check.py \
--version-string 'curl 8.12.0 libcurl/8.12.0 nghttp2/1.61.0' \
--json
Uma versão simples como 8.12.0 não é aceita como evidência verificada de identidade do curl/libcurl.
O verificador deliberadamente não contacta hosts remotos. Obtenha o banner através de um canal administrativo autorizado, guarde-o localmente e depois avalie-o localmente:
ssh [email protected] 'curl --version' > host-curl-version.txt
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use unknown \
--untrusted-upload unknown \
--https-certificate unknown \
--json
Se a revisão da aplicação ou um rastreamento confiável estabelecer que os uploads usam HTTP/2, conseguem alcançar um endpoint controlado pelo atacante e aceitam seu certificado HTTPS, forneça esses fatos explicitamente:
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use yes \
--untrusted-upload yes \
--https-certificate yes \
--patch-state unknown \
--json
Para h2c em texto claro, use --https-certificate not-applicable.
--http2-use yes identifica o uso de HTTP/2 em tempo de execução. Isso não prova que o
artefato foi compilado com suporte a HTTP/2. Da mesma forma, --untrusted-upload yes
descreve o fluxo de dados da aplicação, enquanto --https-certificate yes registra a
condição de confiança HTTPS separada.
Use --root para escanear uma imagem de contêiner montada, imagem de VM ou sistema de
arquivos extraído sem executar os arquivos descobertos:
python3 cve_2026_92392_check.py \
--root /mnt/rootfs \
--json
A varredura raiz: