
Regressões independentes de limite de protocolo offline para correções publicadas do urllib3, com versões fixadas e atribuição upstream.
Publicado anteriormente como CVE Replay. O nome do repositório e a apresentação mudaram; as versões fixadas, a atribuição do relator original, os caminhos dos fixtures e os resultados registrados mantêm a sua identidade original.
Estudos offline independentes comparam correções publicadas usando versões exatas e fixtures delimitados. Cada estudo mantém explícitos o seu comportamento medido, a fronteira de transporte e a atribuição.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · reproduzido em 27 de setembro de 2026
Um pedido transporta três cabeçalhos sensíveis para uma origem. Um redirecionamento altera o destino. O pedido seguinte ainda os transporta?
Esta regressão independente executa a implementação real de redirecionamento de duas versões exatas do urllib3. A versão 2.6.3 retém os três cabeçalhos através da API de baixo nível afetada. A versão 2.7.0 remove-os. Um cabeçalho benigno sobrevive, e os pedidos normais continuam a funcionar.
| Fixture | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| Redirecionamento de baixo nível entre origens | 3 cabeçalhos sensíveis retidos | 0 retidos |
| Mesmo caso com nomes em minúsculas | 3 retidos | 0 retidos |
| Controlo da API de alto nível | 0 retidos | 0 retidos |
| Resposta 200 direta | 3 retidos conforme pretendido | 3 retidos conforme pretendido |
| Redirecionamento explicitamente desativado | Uma chamada; 302 devolvido | Uma chamada; 302 devolvido |
| Conjunto de remoção personalizado adiciona marcador benigno | Todos os 4 cabeçalhos retidos | Todos os 4 removidos |
12/12 expectativas de cenário passaram. Cada cenário também verifica o estado da resposta, a contagem de chamadas de transporte, o conjunto inicial de cabeçalhos, o resultado do cabeçalho benigno e que os cabeçalhos do chamador não foram mutados. O resultado vulnerável é um resultado de base esperado, não uma verificação de segurança aprovada.
Resultados legíveis por máquina incluem os argumentos capturados, hashes exatos dos wheels, runtime, hashes do código-fonte dos testes, atribuição e hora de reprodução.
O aviso upstream, publicado a 7 de maio de 2026, identifica um problema de exposição de informação no caminho de redirecionamento de baixo nível com proxy do urllib3. Lista as versões >=1.23, <2.7.0 como afetadas. Chamar ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) podia transportar cabeçalhos sensíveis configurados para um pedido redirecionado para outra origem. A API de alto nível do gestor já os removia.
A correção upstream aplica Retry.remove_headers_on_redirect antes do pedido recursivo de baixo nível. O nosso caso de cabeçalhos em minúsculas segue a atenção da regressão upstream à capitalização dos nomes dos cabeçalhos. O caso de remoção personalizada verifica que a regra respeita o conjunto configurado, para além dos três nomes predefinidos.
O aviso credita christos-cantina-security como relator, illia-v como coordenador e sethmlarson como revisor da remediação. A contribuição de Sergio Rodriguez aqui é o harness offline independente e a análise antes/depois. Esta é uma reprodução do CVE publicado por eles.
Use Python 3.10 ou posterior. Não é necessário pip install nem ambiente virtual: cada versão é importada diretamente do seu wheel em Python puro num subprocesso isolado novo.
A partir da raiz do repositório do portfólio:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
O primeiro comando descarrega os dois wheels exatos para o diretório ignorado .cache/wheels/ do laboratório e verifica os seus hashes SHA-256 contra o manifesto. O segundo comando usa essa cache sem descarregar. Para um checkout de código-fonte autónomo, execute python -B run_replay.py --fetch, depois o mesmo comando sem --fetch. --cache aceita um diretório de cache local diferente.
HTTPConnectionPool._make_request é substituído por um transporte de duas respostas: um 302 com uma localização fixa, depois um 200. O fixture captura os argumentos que chegam a essa fronteira. O parsing, a política de retry, a filtragem de cabeçalhos e o tratamento recursivo de redirecionamentos do urllib3 executam-se inalterados a partir do wheel selecionado.
Todos os destinos são nomes reservados .invalid fixos; todos os valores dos cabeçalhos começam por DUMMY. A construção de sockets e as funções DNS falham imediatamente. A sondagem de capacidade IPv6 em tempo de importação da biblioteca é negada e registada separadamente; os cenários de replay não tentam quaisquer operações de rede. Não há servidor à escuta nem alvo ativo.
Isto valida o tratamento de argumentos de redirecionamento. Não mede tráfego de proxy ponta a ponta. A versão 2.7.0 é a primeira correção para este CVE em particular; esta comparação histórica não é uma recomendação para a escolher em vez de versões suportadas mais recentes.
Os scripts de fixture e a análise são trabalho original do portfólio. O urllib3 é um projeto upstream distribuído sob a sua licença MIT; o seu código e wheels de lançamento não são redistribuídos no arquivo de código-fonte do portfólio. São descarregados separadamente do PyPI e importados inalterados para a experiência.