
Независимая офлайн-регрессия CVE-2026-44431 для зафиксированных версий urllib3 с указанием авторства первоначального исследователя.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · воспроизведено 27 сентября 2026 г.
Запрос несёт три конфиденциальных заголовка к одному origin. Перенаправление меняет пункт назначения. Сохранит ли их следующий запрос?
Это независимое регрессионное исследование запускает реальную реализацию перенаправления из двух точных релизов 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) мог переносить настроенные конфиденциальные заголовки в перенаправленный запрос к другому origin. Высокоуровневый API менеджера уже удалял их.
Исправление upstream применяет Retry.remove_headers_on_redirect перед рекурсивным низкоуровневым запросом. Наш случай с заголовками в нижнем регистре следует вниманию регрессионного теста upstream к регистру имён заголовков. Случай с пользовательским удалением проверяет, что правило учитывает настроенный набор, а не только три имени по умолчанию.
В уведомлении указаны christos-cantina-security как сообщивший, illia-v как координатор и sethmlarson как проверяющий исправление. Вклад Sergio Rodriguez здесь — это независимый офлайн-стенд и анализ до/после. Это воспроизведение их опубликованного CVE.
Используйте Python 3.10 или новее. Установка через pip или виртуальное окружение не требуются: каждая версия импортируется напрямую из своего чисто-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 и импортируются без изменений для эксперимента.