
Regressão offline independente do CVE-2026-44431 em versões fixadas do urllib3, com atribuição ao relator original.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · reproduzido em 27 de setembro de 2026
Uma requisição carrega três cabeçalhos sensíveis para uma origem. Um redirecionamento altera o destino. A próxima requisição ainda os carrega?
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 todos os três cabeçalhos através da API de baixo nível afetada. A versão 2.7.0 os remove. Um cabeçalho benigno sobrevive, e requisições comuns continuam funcionando.
| Fixture | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| Redirecionamento cross-origin de baixo nível | 3 cabeçalhos sensíveis retidos | 0 retidos |
| Mesmo caso com nomes em minúsculas | 3 retidos | 0 retidos |
| Controle da API de alto nível | 0 retidos | 0 retidos |
| Resposta 200 direta | 3 retidos conforme esperado | 3 retidos conforme esperado |
| Redirecionamento explicitamente desabilitado | Uma chamada; 302 retornado | Uma chamada; 302 retornado |
| Conjunto de remoção personalizado adiciona marcador benigno | Todos os 4 cabeçalhos retidos | Todos os 4 removidos |
12/12 expectativas de cenário atendidas. Cada cenário também verifica o status 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 linha 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, tempo de execução, hashes do código-fonte dos testes, atribuição e horário de reprodução.
O aviso upstream, publicado em 7 de maio de 2026, identifica um problema de exposição de informações no caminho de redirecionamento de baixo nível com proxy do urllib3. Ele lista as versões >=1.23, <2.7.0 como afetadas. Chamar ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) poderia carregar cabeçalhos sensíveis configurados em uma requisição redirecionada para outra origem. A API de alto nível do gerenciador já os removia.
A correção upstream aplica Retry.remove_headers_on_redirect antes da requisição recursiva de baixo nível. Nosso caso de cabeçalhos em minúsculas segue a atenção da regressão upstream quanto à capitalização dos nomes de cabeçalho. O caso de remoção personalizada verifica que a regra respeita o conjunto configurado, além apenas dos três nomes padrão.
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 da CVE publicada por eles.
Use Python 3.10 ou posterior. Não é necessário pip install nem ambiente virtual: cada versão é importada diretamente de seu wheel em Python puro, em um subprocesso isolado e 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 baixa os dois wheels exatos para o diretório ignorado .cache/wheels/ do laboratório e verifica seus hashes SHA-256 contra o manifesto. O segundo comando usa esse cache sem baixar. Para um checkout de código-fonte independente, 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 localização fixa, depois um 200. A 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 redirecionamento do urllib3 executam sem alterações a partir do wheel selecionado.
Todos os destinos são nomes reservados .invalid fixos; todos os valores de cabeçalho começam com DUMMY. A construção de socket e as funções de DNS lançam erro imediatamente. A sondagem de capacidade IPv6 em tempo de importação da biblioteca é negada e registrada separadamente; os cenários de replay não tentam nenhuma operação de rede. Não há servidor escutando nem alvo ativo.
Isso valida o tratamento de argumentos de redirecionamento. Não mede o tráfego de proxy de ponta a ponta. A versão 2.7.0 é a primeira correção para esta CVE específica; esta comparação histórica não é uma recomendação para selecioná-la em vez de versões suportadas mais recentes.
Os scripts da fixture e a análise são trabalho original do portfólio. O urllib3 é um projeto upstream distribuído sob sua licença MIT; seu código e wheels de versão não são redistribuídos no arquivo de código-fonte do portfólio. Eles são baixados separadamente do PyPI e importados sem alterações para o experimento.