
고정된 urllib3 릴리스 전반에 걸친 CVE-2026-44431의 독립적인 오프라인 회귀 테스트로, 원래 보고자 출처 표기를 포함합니다.
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · 2026년 9월 27일 재현
하나의 요청이 세 개의 민감한 헤더를 특정 오리진으로 전달한다. 리다이렉트로 목적지가 바뀐다. 다음 요청에도 여전히 그 헤더들이 실려 있을까?
이 독립적인 회귀 테스트는 정확히 두 개의 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개 유지 |
| 리다이렉트 명시적 비활성화 | 호출 1회; 302 반환 | 호출 1회; 302 반환 |
| 사용자 지정 제거 집합에 무해한 마커 추가 | 헤더 4개 모두 유지 | 4개 모두 제거 |
12/12 시나리오 기대치 통과. 각 시나리오는 응답 상태, 전송 호출 횟수, 초기 헤더 집합, 무해한 헤더 결과, 그리고 호출자의 헤더가 변경되지 않았는지도 확인한다. 취약한 결과는 통과하는 보안 검사가 아니라 예상된 기준선 결과다.
기계 판독 가능 결과에는 캡처된 인수, 정확한 wheel 해시, 런타임, 테스트 소스 해시, 출처 표기, 재현 시각이 포함된다.
2026년 5월 7일 공개된 업스트림 권고는 urllib3의 프록시 경유 저수준 리다이렉트 경로에서의 정보 노출 문제를 식별한다. 영향을 받는 버전으로 >=1.23, <2.7.0을 나열한다. ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False)를 호출하면 구성된 민감한 헤더가 다른 오리진으로의 리다이렉트된 요청에 실려 갈 수 있었다. 고수준 매니저 API는 이미 이를 제거하고 있었다.
업스트림 수정은 재귀적 저수준 요청 전에 Retry.remove_headers_on_redirect를 적용한다. 우리의 소문자 헤더 케이스는 헤더 이름 대소문자에 대한 업스트림 회귀 테스트의 주의를 따른다. 사용자 지정 제거 케이스는 이 규칙이 세 가지 기본 이름에 그치지 않고 구성된 집합을 존중하는지 확인한다.
권고는 christos-cantina-security를 보고자로, illia-v를 조정자로, sethmlarson을 수정 검토자로 명시한다. 여기서 Sergio Rodriguez의 기여는 독립적인 오프라인 하네스와 전후 분석이다. 이는 그들이 공개한 CVE의 재현이다.
Python 3.10 이상을 사용한다. pip install이나 가상 환경은 필요하지 않다. 각 버전은 새로 격리된 서브프로세스에서 순수 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는 두 개의 응답을 주는 전송으로 대체된다: 고정된 location을 가진 302, 그다음 200. 픽스처는 그 경계에 도달하는 인수를 캡처한다. urllib3의 파싱, 재시도 정책, 헤더 필터링, 재귀적 리다이렉트 처리는 선택된 wheel에서 변경 없이 실행된다.
모든 목적지는 고정된 예약 .invalid 이름이며, 모든 헤더 값은 DUMMY로 시작한다. 소켓 생성과 DNS 함수는 즉시 예외를 발생시킨다. 라이브러리의 임포트 시점 IPv6 기능 탐지는 거부되고 별도로 기록되며, 재현 시나리오는 어떤 네트워크 작업도 시도하지 않는다. 수신 대기 서버나 라이브 대상은 없다.
이는 리다이렉트 인수 처리를 검증한다. 종단 간 프록시 트래픽을 측정하지는 않는다. 버전 2.7.0은 이 특정 CVE에 대한 첫 수정이다. 이 역사적 비교는 더 새로운 지원 릴리스 대신 이를 선택하라는 권장이 아니다.
픽스처 스크립트와 분석은 독자적인 포트폴리오 작업이다. urllib3는 MIT 라이선스로 배포되는 업스트림 프로젝트이며, 그 코드와 릴리스 wheel은 포트폴리오 소스 아카이브에 재배포되지 않는다. 이들은 PyPI에서 별도로 다운로드되어 실험을 위해 변경 없이 임포트된다.