
Независимые офлайн-регрессии на границах протокола для опубликованных исправлений urllib3, с закреплёнными релизами и указанием первоисточника.
Ранее публиковалось как CVE Replay. Название репозитория и оформление изменились; закреплённые релизы, атрибуция первоначального исследователя, пути к фикстурам и записанные результаты сохраняют свою исходную идентичность.
Независимые офлайн-исследования сравнивают опубликованные исправления, используя точные релизы и ограниченные фикстуры. Каждое исследование явно фиксирует измеренное поведение, границу транспорта и атрибуцию.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · воспроизведено 27 сентября 2026
Запрос несёт три чувствительных заголовка к одному источнику. Перенаправление меняет пункт назначения. Сохраняет ли их следующий запрос?
Эта независимая регрессия запускает реальную реализацию перенаправления из двух точных релизов urllib3. Версия 2.6.3 сохраняет все три заголовка через затронутый низкоуровневый API. Версия 2.7.0 удаляет их. Безобидный заголовок сохраняется, и обычные запросы по-прежнему работают.
| Фикстура | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| Низкоуровневое кросс-доменное перенаправление | 3 чувствительных заголовка сохранены | 0 сохранено |
| Тот же случай с именами в нижнем регистре | 3 сохранено | 0 сохранено |
| Контроль высокоуровневого API | 0 сохранено | 0 сохранено |
| Прямой ответ 200 | 3 сохранено, как и задумано | 3 сохранено, как и задумано |
| Перенаправление явно отключено | Один вызов; возвращён 302 | Один вызов; возвращён 302 |
| Пользовательский набор удаления добавляет безобидный маркер | Все 4 заголовка сохранены | Все 4 удалены |
12/12 ожиданий сценариев пройдено. Каждый сценарий также проверяет статус ответа, количество транспортных вызовов, исходный набор заголовков, результат для безобидного заголовка и то, что заголовки вызывающей стороны не были изменены. Уязвимый исход — это ожидаемый базовый результат, а не пройденная проверка безопасности.
Машиночитаемые результаты включают захваченные аргументы, точные хеши wheel-файлов, среду выполнения, хеши исходников тестов, атрибуцию и время воспроизведения.
Уведомление upstream, опубликованное 7 мая 2026, описывает проблему раскрытия информации в проксируемом низкоуровневом пути перенаправления urllib3. В нём указаны версии >=1.23, <2.7.0 как затронутые. Вызов ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) мог переносить настроенные чувствительные заголовки в перенаправленный запрос к другому источнику. Высокоуровневый API менеджера уже удалял их.
Исправление upstream применяет Retry.remove_headers_on_redirect перед рекурсивным низкоуровневым запросом. Наш случай с заголовками в нижнем регистре следует вниманию upstream-регрессии к регистру имён заголовков. Случай с пользовательским удалением проверяет, что правило учитывает настроенный набор, а не только три имени по умолчанию.
В уведомлении указаны christos-cantina-security как исследователь, illia-v как координатор и sethmlarson как рецензент исправления. Вклад Sergio Rodriguez здесь — это независимый офлайн-стенд и анализ до/после. Это воспроизведение их опубликованного CVE.
Используйте Python 3.10 или новее. Установка через pip или виртуальное окружение не требуется: каждая версия импортируется напрямую из своего pure-Python wheel-файла в свежем изолированном подпроцессе.
Из корня репозитория портфолио:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
Первая команда загружает два точных wheel-файла в игнорируемый каталог лаборатории .cache/wheels/ и сверяет их хеши SHA-256 с манифестом. Вторая команда использует этот кеш без загрузки. Для отдельной копии исходников запустите python -B run_replay.py --fetch, затем ту же команду без --fetch. --cache принимает другой локальный каталог кеша.
HTTPConnectionPool._make_request заменяется на транспорт с двумя ответами: 302 с фиксированным location, затем 200. Фикстура захватывает аргументы, достигающие этой границы. Парсинг urllib3, политика повторных попыток, фильтрация заголовков и рекурсивная обработка перенаправлений выполняются без изменений из выбранного wheel-файла.
Все пункты назначения — фиксированные зарезервированные имена .invalid; все значения заголовков начинаются с DUMMY. Создание сокетов и функции DNS немедленно вызывают исключение. Проверка поддержки IPv6 во время импорта библиотеки запрещается и записывается отдельно; сценарии воспроизведения не выполняют никаких сетевых операций. Нет ни слушающего сервера, ни живого целевого узла.
Это проверяет обработку аргументов перенаправления. Это не измеряет сквозной прокси-трафик. Версия 2.7.0 — первое исправление для этого конкретного CVE; это историческое сравнение не является рекомендацией выбирать её вместо более новых поддерживаемых релизов.
Скрипты фикстур и анализ — оригинальная работа портфолио. urllib3 — это upstream-проект, распространяемый под его лицензией MIT; его код и релизные wheel-файлы не распространяются в исходном архиве портфолио. Они загружаются отдельно из PyPI и импортируются без изменений для эксперимента.