
CVE-2026-97629에 대한 개념 증명 익스플로잇, 근본 원인 분석 및 한 줄 패치로, 클라이언트 인증서(mTLS) 인증을 우회하는 nginx TLS 세션 티켓 위조 취약점입니다.
C 한 줄. 하나의 위조된 TLS 세션. **PhiNode Labs**가 발견하고, 종단 간 입증했으며, 수정까지 조율했습니다.
CVE-2026-97629에 대한 개념 증명 익스플로잇, 근본 원인 분석, 한 줄짜리 패치, 그리고 재현 증거입니다. 이 취약점은 nginx의 TLS 세션 티켓 위조로, 클라이언트 인증서(mutual-TLS) 인증을 우회할 수 있습니다. 조율된 공개 절차에 따라 F5에 공개되었으며 PhiNode Labs에 공로가 인정되었습니다.
전체 분석 글 읽기: https://phinode.io/nginx-cve-2026-97629.html
"F5는 이 문제를 알려주고 조율된 공개 절차의 최고 기준을 준수한 PhiNode Labs에 감사를 표합니다." — F5 보안 권고 K000162606
| CVE | CVE-2026-97629 |
| 권고 | F5 K000162606 · GHSA-862p-pr69-37gq |
| 심각도 | CVSS 3.1 6.5 / CVSS 4.0 8.3 (F5). mutual-TLS 배포 환경에서는 최대 10.0 |
| 약점 | CWE-908 — 초기화되지 않은 리소스 사용 |
| 구성 요소 | ngx_http_ssl_module — ngx_ssl_rotate_ticket_keys() |
| 영향 받는 버전 | nginx 1.23.2 – 1.31.6, NGINX Plus R37(37.0.5)까지, 그리고 nginx 기반으로 빌드된 F5 제품 |
| 수정 버전 | nginx 1.31.7 및 1.30.6, NGINX Plus 37.0.5.1 / 37.1.0.1 |
| 공로 | PhiNode Labs — [email protected] |
TLS 연결을 빠르게 재개하기 위해 nginx는 회전하는 키로 세션 티켓을 봉인하며,
워커마다 current, previous, next 세 개의 키를 유지합니다.
키 회전 중에 ngx_ssl_rotate_ticket_keys()는 세 슬롯 중 두 개만 각 워커에
복사했고, 세 번째 슬롯은 시작 이후 한 번도 기록되지 않았습니다. 기본 Linux 빌드에서
이 메모리는 전부 0이며, 모든 기본 배포의 모든 워커에서 동일하고 예측 가능한 값입니다.
복호화 콜백은 세 슬롯을 모두 검사합니다. 클라이언트는 16바이트 키 이름이 전부 0인 위조된 티켓을 제출하여 손대지 않은 세 번째 슬롯과 일치시키고, 누구나 추측할 수 있는 전부 0인 AES 및 HMAC 키로 nginx가 이를 복호화하도록 할 수 있습니다. 이를 통해 공격자는 자신이 선택한 키로 유효한 세션을 위조하고 실제 핸드셰이크를 완료하지 않고 암호화된 연결을 재개합니다. 서버가 클라이언트 인증서를 신뢰하여 접근 허용 여부를 결정하는 환경에서는 해당 검사가 우회됩니다.
수정은 단 한 글자입니다:
ngx_memcpy(keys->elts, cache->ticket_keys,
- 2 * sizeof(ngx_ssl_ticket_key_t));
+ 3 * sizeof(ngx_ssl_ticket_key_t));
적용 준비가 완료된 diff는 patch/를 참조하십시오.
nginx는 전체 웹사이트의 약 3분의 1을 서비스합니다. F5가 인정한 영향 — 클라이언트 인증서 검증 우회 — 은 상호 TLS(mutual TLS) 에 가장 심각하게 영향을 미칩니다: 오픈 뱅킹(PSD2 / FAPI), 의료 데이터 교환, 5G 코어 네트워크 기능, Kubernetes 인그레스, 제로 트러스트 및 디바이스 플릿과 같이 인증서가 곧 접근 결정의 전부인 환경입니다. 이러한 배포 환경에서 이 위조는 완전한 클라이언트 인증 우회이며, 최대 심각도로 해석됩니다.
모든 것이 로컬에서, 일회용 자체 서명 인증서를 사용하는 루프백 리스너 상에서 이루어집니다. 익스플로잇은 poc/ 를, 캡처된 출력은 evidence/ 를 참조하십시오: nginx가 전부 0인 키를 수용하는 모습, 축약된 핸드셰이크, 그리고 위조된 세션을 통한 전체 읽기/쓰기(복호화된 HTTP 404).
cd poc
python3 make_forged_session.py # patch the session_id_context
python3 forge_ticket.py # -> VERDICT: TICKET ACCEPTED
python3 forge_ticket_full.py # -> full read/write over the forged session
ssl_session_tickets off;ssl_session_ticket_key 파일을 구성하십시오.서버는 다음 조건이 모두 충족될 때만 노출됩니다: 취약한 버전,
ssl_session_cache shared:…, 키 파일 없이 티켓이 활성화된 상태, 그리고
접근을 결정하는 인증서.
| 날짜 | 사건 |
|---|---|
| 2026년 6월 | PhiNode Labs가 슬롯 불일치를 식별하고 종단 간 입증 |
| 2026년 8월 | F5 SIRT에 보고; NGINX Product Engineering으로 전달 |
| 2026년 9월 | NGINX PE가 취약점으로 분류 |
| 2026년 10월 12일 | CVE-2026-97629 할당 (F5 NPS-179) |
| 2026년 10월 14일 | F5가 K000162606 게시; 수정 사항이 nginx 1.31.7 / 1.30.6에 포함되어 배포 |
이 개념 증명은 수정 사항이 배포된 후 그리고 F5의 조정된 릴리스와 함께 공개되며, 방어자가 자신의 서버를 검증할 수 있도록 하기 위한 것입니다. 소유하거나 운영하지 않는 시스템에 대해서는 사용하지 마십시오.
PhiNode Labs는 응용 프로그램 분석 연구소입니다. 우리는 스캐너와 언어 모델이 지나쳐 버리는 결함을 찾아냅니다 — 주입된 문자열도, 명백히 잘못된 함수도 없이, 단지 세 개여야 할 크기가 두 개였을 뿐인 결함을 — 프로그램의 메모리가 런타임에 실제로 무엇을 담고 있는지 추론함으로써 말입니다. 증인 없는 주장은 없습니다.
키워드: CVE-2026-97629, nginx, TLS 세션 티켓, 세션 티켓 위조, 세션 재개, 상호 TLS, mTLS, 클라이언트 인증서 우회, ngx_http_ssl_module, ngx_ssl_rotate_ticket_keys, F5, NGINX Plus, 개념 증명, PoC, 익스플로잇, CWE-908, PhiNode Labs, 프로그램 분석.