
Regresiones independientes fuera de línea en los límites del protocolo para las correcciones publicadas de urllib3, con versiones fijadas y atribución upstream.
Publicado anteriormente como CVE Replay. El nombre del repositorio y la presentación cambiaron; las versiones fijadas, la atribución del reportero original, las rutas de los fixtures y los resultados registrados conservan su identidad original.
Estudios offline independientes comparan correcciones publicadas usando versiones exactas y fixtures acotados. Cada estudio mantiene explícitos su comportamiento medido, su límite de transporte y su atribución.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · reproducido el 27 de septiembre de 2026
Una petición transporta tres cabeceras sensibles a un origen. Una redirección cambia el destino. ¿La siguiente petición las sigue transportando?
Esta regresión independiente ejecuta la implementación real de redirección de dos versiones exactas de urllib3. La versión 2.6.3 conserva las tres cabeceras a través de la API de bajo nivel afectada. La versión 2.7.0 las elimina. Una cabecera benigna sobrevive, y las peticiones ordinarias siguen funcionando.
| Fixture | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| Redirección cross-origin de bajo nivel | 3 cabeceras sensibles conservadas | 0 conservadas |
| Mismo caso con nombres en minúsculas | 3 conservadas | 0 conservadas |
| Control de API de alto nivel | 0 conservadas | 0 conservadas |
| Respuesta 200 directa | 3 conservadas según lo previsto | 3 conservadas según lo previsto |
| Redirección deshabilitada explícitamente | Una llamada; 302 devuelto | Una llamada; 302 devuelto |
| El conjunto de eliminación personalizado añade un marcador benigno | Las 4 cabeceras conservadas | Las 4 eliminadas |
12/12 expectativas de escenario superadas. Cada escenario también comprueba el estado de la respuesta, el número de llamadas de transporte, el conjunto inicial de cabeceras, el resultado de la cabecera benigna y que las cabeceras del llamador no fueron mutadas. El resultado vulnerable es un resultado de línea base esperado, no una comprobación de seguridad superada.
Resultados legibles por máquina incluyen los argumentos capturados, los hashes exactos de los wheels, el runtime, los hashes del código fuente de las pruebas, la atribución y el momento de la reproducción.
El aviso upstream, publicado el 7 de mayo de 2026, identifica un problema de exposición de información en la ruta de redirección de bajo nivel con proxy de urllib3. Enumera las versiones >=1.23, <2.7.0 como afectadas. Llamar a ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) podía transportar cabeceras sensibles configuradas hacia una petición redirigida a otro origen. La API de alto nivel del manager ya las eliminaba.
La corrección upstream aplica Retry.remove_headers_on_redirect antes de la petición recursiva de bajo nivel. Nuestro caso de cabeceras en minúsculas sigue la atención de la regresión upstream al uso de mayúsculas y minúsculas en los nombres de cabecera. El caso de eliminación personalizada comprueba que la regla respeta el conjunto configurado, más allá de solo los tres nombres por defecto.
El aviso acredita a christos-cantina-security como reportero, a illia-v como coordinador y a sethmlarson como revisor de la remediación. La contribución de Sergio Rodriguez aquí es el arnés offline independiente y el análisis antes/después. Esta es una reproducción de su CVE publicado.
Usa Python 3.10 o posterior. No es necesario pip install ni un entorno virtual: cada versión se importa directamente desde su wheel de Python puro en un subproceso aislado nuevo.
Desde la raíz del repositorio del portafolio:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
El primer comando descarga los dos wheels exactos en el directorio ignorado .cache/wheels/ del laboratorio y comprueba sus hashes SHA-256 contra el manifiesto. El segundo comando usa esa caché sin descargar. Para un checkout de código fuente independiente, ejecuta python -B run_replay.py --fetch, y luego el mismo comando sin --fetch. --cache acepta un directorio de caché local diferente.
HTTPConnectionPool._make_request se reemplaza por un transporte de dos respuestas: un 302 con una ubicación fija, y luego un 200. El fixture captura los argumentos que llegan a ese límite. El parsing, la política de reintentos, el filtrado de cabeceras y el manejo recursivo de redirecciones de urllib3 se ejecutan sin cambios desde el wheel seleccionado.
Todos los destinos son nombres reservados .invalid fijos; todos los valores de cabecera comienzan con DUMMY. La construcción de sockets y las funciones DNS lanzan una excepción inmediatamente. La sonda de capacidad IPv6 en tiempo de importación de la librería se deniega y se registra por separado; los escenarios de replay no intentan ninguna operación de red. No hay servidor escuchando ni objetivo en vivo.
Esto valida el manejo de argumentos de redirección. No mide el tráfico de proxy de extremo a extremo. La versión 2.7.0 es la primera corrección para este CVE en particular; esta comparación histórica no es una recomendación para seleccionarla por encima de versiones soportadas más recientes.
Los scripts de fixture y el análisis son trabajo original del portafolio. urllib3 es un proyecto upstream distribuido bajo su licencia MIT; su código y sus wheels de versión no se redistribuyen en el archivo de código fuente del portafolio. Se descargan por separado desde PyPI y se importan sin cambios para el experimento.