
로컬 curl/libcurl 빌드가 CVE-2026-92392 HTTP/2 업로드 use-after-free 취약점에 노출되어 있는지 검사하며, 수동 인벤토리, 마운트된 이미지 스캔, 제한된 루프백 PoC 프로브를 제공합니다.
cve_2026_92392_check.py는 로컬 curl 및 libcurl 아티팩트가
CVE-2026-92392에 노출되어 있는지 평가합니다. 이 취약점은 curl/libcurl의 HTTP/2 업로드
use-after-free입니다.
이 도구는 수동적 로컬 인벤토리, 제공된 배너 평가, 비실행 방식의 마운트된 이미지 스캔, 그리고 범위가 제한된 루프백 HTTP/2 프로토콜 프로브를 지원합니다. 이 프로브는 방어적이며 무기화되지 않았습니다. 명령 페이로드, 셸코드, 메모리 주소 조작, 정보 유출 로직, 또는 RCE 페이로드가 없습니다.
능동 프로브는 127.0.0.1에만 바인딩하며, 원격 대상 URL이나
호스트를 받지 않고, 선택된 로컬 curl 바이너리만 실행합니다.
이 검사기는 네 가지 서로 다른 증거 수준을 구분합니다:
| 증거 수준 | 확립하는 것 | 확립하지 않는 것 |
|---|---|---|
| 빌드 분류 | 버전이 확인된 curl/libcurl 아티팩트가 업스트림 영향 범위 밖에 있는지, 업스트림 영향 대상이지만 벤더 패치 상태가 알려지지 않았는지, 또는 제공된 패치 상태 증거를 사용하여 영향받는 것으로 확인되었는지 여부 | 애플리케이션이 실제로 영향받는 HTTP/2 업로드 경로를 사용하는지 여부 |
| 런타임 노출 컨텍스트 | 제공된 애플리케이션 정보가 HTTP/2 업로드가 공격자가 제어하는 엔드포인트에 도달할 수 있음을 나타내는지 여부 | 취약점이 트리거되었는지 여부 |
| 프로토콜 자극 | 로컬 루프백 하네스가 하나의 HTTP/2 연결에서 두 번의 업로드로 문서화된 두 가지 리셋 변형을 모두 전달했는지 여부 | use-after-free, 크래시 원인, 또는 코드 실행 |
| CVE 귀속 새니타이저 결과 | 후보 시퀀스, AddressSanitizer 힙 use-after-free, 업스트림 영향 아티팩트 식별 정보, 그리고 일치하는 HTTP/2 스택이 모두 관찰되었는지 여부 | 다른 시스템에서의 신뢰성 또는 실질적 익스플로잇 가능성 |
깨끗한 실행, 불완전한 프로토콜 실행, 또는 크래시가 없는 새니타이저 실행은 빌드가 안전하다는 것을 증명하지 않습니다.
CVE-2026-92392는 curl/libcurl의 HTTP/2 업로드 처리에 영향을 미칩니다. 업로드 중에
영향받는 빌드는 REFUSED_STREAM 또는 HTTP_1_1_REQUIRED를 담은
HTTP/2 RST_STREAM을 처리할 수 있습니다. 그런 다음 버퍼링된 업로드 데이터가
원래 전송의 HTTP/2 상태가 분리된 후 새로운 요청으로
파싱될 수 있습니다. 이후의 HTTP/2 콜백이 오래된 Curl_easy 포인터를
역참조할 수 있습니다.
이 검사기를 개정하는 데 사용된 REA 비교는 관련 정리 순서 차이를 확인했습니다:
Curl_conn_ev_data_done을 호출하고, 대기 중인
핸들을 처리한 다음, 그 후에야 Curl_req_done을 호출합니다.Curl_req_done이 req_flush에 도달하는 반면, HTTP/2 데이터 완료 경로는
이미 스트림 컨텍스트를 지운 상태입니다.Curl_conn_ev_data_done 전에
Curl_req_done을 수행하여 해당 오래된 순서를 제거합니다.이것은 검사기의 증명 모델을 뒷받침하는 구현 증거입니다. 벤더 패치 상태는 여전히 독립적인 검증이 필요합니다.
업스트림 권고는 취약한 구현이 curl 8.12.0에서 도입되었다고 식별합니다. 검사기는 업스트림 릴리스를 다음과 같이 분류합니다:
| 릴리스 조건 | 분류 |
|---|---|
| 8.12.0 이전 | NOT AFFECTED |
| 8.12.0부터 8.22.0까지, 수정된 백포트 제외 | 업스트림 영향받음 |
| 8.14.3 이상의 8.14 브랜치 | 수정된 백포트 |
| 8.16.2 이상의 8.16 브랜치 | 수정된 백포트 |
| 8.20.2 이상의 8.20 브랜치 | 수정된 백포트 |
| 8.23.0 이상 | NOT AFFECTED |
| 개발, 스냅샷, 나이틀리, 또는 모호한 버전 | INDETERMINATE |
벤더는 curl의 업스트림 버전 문자열을 변경하지 않고 수정 사항을 백포트할 수 있습니다. 따라서 영향받는 업스트림 버전은 인벤토리 증거이지, 벤더 빌드가 패치되지 않았다는 결정적 증거가 아닙니다.
다운스트림의 의미론적 수정 상태가 벤더 권고, 패키지 체인지로그, 소스 비교, 또는
다른 신뢰할 수 있는 아티팩트 수준 방법을 통해 검증된 경우에만 --patch-state를
사용하십시오.
--patch-state 값 | 의미 |
|---|---|
unknown | 기본값. 영향을 받는 업스트림 버전은 UPSTREAM-AFFECTED VERSION을 생성합니다. |
absent | 운영자가 다운스트림 수정 사항이 없음을 독립적으로 확인했습니다. HTTP/2를 지원하는 영향을 받는 빌드는 AFFECTED BUILD를 생성합니다. |
present | 운영자가 다운스트림 의미론적 수정 사항이 존재함을 독립적으로 확인했습니다. 이는 운영자의 단정이며, curl의 업스트림 수정 사항과 바이너리가 동등하다는 자동 증명은 아닙니다. |
--poc를 위한 로컬 curl 실행 파일.--poc-proof asan을 위한 AddressSanitizer 계측 curl 빌드.--tls가 사용될 때만 openssl 명령.능동 PoC 모드는 스크립트, 래퍼, 식별되지 않은 네이티브 실행 파일, 그리고 PE/Windows 바이너리를 거부합니다. 수동 평가는 배너와 마운트된 파일 시스템에 대해 계속 사용할 수 있습니다.
PATH에서 발견된 curl 바이너리를 검사합니다:
python3 cve_2026_92392_check.py
JSON으로 출력하세요:
python3 cve_2026_92392_check.py --json
내부 자체 테스트 실행:
python3 cve_2026_92392_check.py --self-test
python3 -O cve_2026_92392_check.py --self-test
선택한 curl 실행 파일과 libcurl 공유 라이브러리를 검사합니다:
python3 cve_2026_92392_check.py \
--curl-binary /opt/curl/bin/curl \
--libcurl-path /opt/curl/lib/libcurl.so \
--json
신뢰할 수 있는 curl 배너를 바이너리를 실행하지 않고 평가합니다:
python3 cve_2026_92392_check.py \
--version-string 'curl 8.12.0 libcurl/8.12.0 nghttp2/1.61.0' \
--json
8.12.0과 같은 버전 번호만으로는 검증된 curl/libcurl 신원 증거로 인정되지 않습니다.
검사기는 의도적으로 원격 호스트에 접속하지 않습니다. 승인된 관리 채널을 통해 배너를 확보하여 로컬에 저장한 후, 로컬에서 평가하십시오:
ssh [email protected] 'curl --version' > host-curl-version.txt
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use unknown \
--untrusted-upload unknown \
--https-certificate unknown \
--json
애플리케이션 검토나 신뢰할 수 있는 추적을 통해 업로드가 HTTP/2를 사용하고, 공격자가 제어하는 엔드포인트에 도달할 수 있으며, 해당 HTTPS 인증서를 수용한다는 사실이 확인되면, 그 사실을 명시적으로 제공하십시오:
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use yes \
--untrusted-upload yes \
--https-certificate yes \
--patch-state unknown \
--json
일반 텍스트 h2c의 경우 --https-certificate not-applicable을 사용합니다.
--http2-use yes는 런타임 HTTP/2 사용을 식별합니다. 이는 해당 아티팩트가 HTTP/2 지원으로 컴파일되었음을 증명하지는 않습니다. 마찬가지로 --untrusted-upload yes는 애플리케이션 데이터 흐름을 설명하는 반면, --https-certificate yes는 별도의 HTTPS 신뢰 조건을 기록합니다.
--root를 사용하면 발견된 파일을 실행하지 않고 마운트된 컨테이너 이미지, VM 이미지 또는 추출된 파일 시스템을 스캔할 수 있습니다:
python3 cve_2026_92392_check.py \
--root /mnt/rootfs \
--json
루트 스캔:
curl, curl.exe, libcurl 아티팩트만 검사합니다.INDETERMINATE로 남을 수 있습니다.빌드 판정은 두 가지 조건에 의해 결정됩니다:
| 전제 조건 | 의미 |
|---|---|
| P1 | 영향을 받는 업스트림 범위 내에서 검증된 curl/libcurl 식별 정보 및 버전이며, 검증된 다운스트림 패치 상태가 적용됨 |
| P2 | 평가 대상 아티팩트에 HTTP/2 지원이 컴파일되어 있음 |
런타임 노출은 별도로 평가됩니다:
| 전제 조건 | 의미 |
|---|---|
| P3 | 평가 대상 업로드가 실제로 HTTP/2를 협상함 |
| P4 | 애플리케이션이 공격자가 제어하는 HTTP/2 엔드포인트로 업로드할 수 있음 |
| P5 | HTTPS 사용 시 HTTPS 인증서가 수락됨 |
| P6 | 아키텍처, libc, TLS 할당 동작, CA 번들 등 익스플로잇별 환경 세부 사항 |
| P7 | 업로드 크기, 동시성, 페이로드 윈도우, 타이밍 등 익스플로잇 측 안무 |
P1과 P2는 빌드 적용 가능성을 결정합니다. P3과 P4는 잠재적으로 영향을 받는 사용이 식별되는지 여부를 결정합니다. P5부터 P7까지는 원격 익스플로잇 조건에 영향을 미치며, HTTP/2 use-after-free가 존재하는지 여부와는 무관합니다.
| 판정 | 의미 |
|---|---|
NOT AFFECTED | 버전이 업스트림 영향 범위를 벗어나거나, 수정된 백포트가 식별되었거나, HTTP/2가 권위 있게 부재함. |
UPSTREAM-AFFECTED VERSION | HTTP/2 지원이 있는 영향받는 업스트림 버전이 식별되었으나 다운스트림 패치 상태는 알 수 없음. |
AFFECTED BUILD | 영향받는 업스트림 버전과 HTTP/2 지원이 식별되었고, --patch-state absent가 독립적으로 검증된 증거로 제공됨. |
INDETERMINATE | 제품 식별 정보, 버전, HTTP/2 지원 또는 릴리스 상태를 확립할 수 없음. |
기본 활성 프로브는 127.0.0.1에 바인딩된 서버를 대상으로 두 개의 합성
업로드를 실행합니다. 이는 문서화된 두 가지 리셋 변형을 모두 전달합니다:
REFUSED_STREAMHTTP_1_1_REQUIRED각 변형에 대해 하네스는 업로드 정지를 기다린 후 부분 응답을 보내고,
RST_STREAM을 보내며, 스트림 수준 증거를 기록합니다. 프로토콜 증명은 두 리셋
변형이 모두 전달되었고 각 변형에 대해 하나의 연결에서 두 개의 업로드 스트림이
관찰된 경우에만 충족됩니다.
python3 cve_2026_92392_check.py \
--curl-binary /path/to/curl \
--poc \
--poc-proof protocol \
--json
STIMULUS REPRODUCED라는 결과는 경계가 정해진 프로토콜 조건이 관찰되었음을 의미합니다. 이는 use-after-free, 크래시 인과관계, CVE 귀속 또는 코드 실행을 입증하지 않습니다.
기본적으로 선택된 아티팩트가 업스트림 영향을 받는 HTTP/2 지원 curl 빌드로 식별되지 않으면 PoC 모드는 건너뜁니다. --force는 로컬 네거티브 컨트롤에 대해 무해한 루프백 하네스를 실행하는 것을 허용하지만, 네이티브 형식 또는 제품 식별 검증을 우회하지는 않습니다.
python3 cve_2026_92392_check.py \
--curl-binary /path/to/known-fixed-curl \
--poc \
--force \
--json
AddressSanitizer 모드는 무해한 요청 유사 마커가 포함된 로컬에서 생성된 합성 업로드를 사용합니다. 이는 공개 익스플로잇 구조의 복사본이 아니라 후보 정리 경로 프로브입니다.
python3 cve_2026_92392_check.py \
--curl-binary /path/to/asan/curl \
--poc \
--poc-proof asan \
--json
검사기는 다음 조건이 모두 참일 때만 CVE-2026-92392 REPRODUCED를 보고합니다:
heap-use-after-free를 보고했다.on_begin_headers와 HTTP/2 컨텍스트를 포함한 curl의 공개된 HTTP/2 콜백 경로와 일치한다.일치하는 아이덴티티나 스택이 없는 일반적인 AddressSanitizer heap-use-after-free는 SANITIZER UAF OBSERVED로 보고됩니다. 이는 메모리 안전성 신호일 뿐, 확인된 CVE 귀속은 아닙니다.
지원되는 sanitizer 진단 없이 발생한 프로세스 시그널은 INCONCLUSIVE입니다.
AddressSanitizer 빌드 구성 예시:
CC=clang \
CFLAGS='-O1 -g -fno-omit-frame-pointer -fsanitize=address' \
LDFLAGS='-fsanitize=address' \
./configure --with-nghttp2 --disable-shared
make -j4