
소스 빌드된 nginx 1.25.5 컨테이너, 백포트된 CVE-2026-42945 수정, OpenSSL 업그레이드, 완전한 공급망 증명 체인, VEX 증명 포함.
| CVE | 구성 요소 | 심각도 | 기법 | 검증 모델 |
|---|
| CVE-2024-6119 | OpenSSL / libssl3 | 높음 | 종속성 버전 업 | 스캐너 검증 가능: dpkg 데이터베이스에서 libssl3 3.0.20 확인 가능 |
| CVE-2026-42945 | nginx ngx_http_rewrite_module | 심각 | 백포트된 소스 패치 | 출처 검증 가능: 패치 파생 + 회귀 테스트 + 빌드 증명 + VEX |
이 두 가지는 서로 다른 수정 모델을 나타냅니다:
이 이미지의 nginx -V 구성 인수는 nginx:1.25-bookworm의 구성 인수와 일치합니다 (-ffile-prefix-map 빌드 경로를 정규화한 후 문자별로 비교; test/compat.py::test_nginx_version에서 확인). 테스트 스위트(make test)는 라이브 업스트림 이미지에 대해 이미지 메타데이터, 동적 모듈, 파일시스템 레이아웃, 엔트리포인트 동작, dpkg 패키징, HTTP 요청 처리를 포함한 89개의 어설션을 검증합니다.
업스트림과의 알려진 차이점 (동일한 것으로 검증되지 않음):
nginx -V의 built with OpenSSL X.X.X 줄은 빌더의 libssl-dev 버전을 반영하며, 이는 업스트림의 컴파일 타임 OpenSSL과 다를 수 있습니다.debian:bookworm-slim 베이스를 사용합니다.libssl3 버전은 북웜이 현재 제공하는 버전(작성 시점 기준 3.0.20)이며, 업스트림 이미지의 고정 버전이 아닙니다.make image
make test
make test-cve
make verify-patch
make scan
하나의 명령으로 빌드, 테스트, 스캔:```bash
make all
build/ Dockerfile.build Builder image (debian:bookworm-slim + compilation deps) build.sh Fetch → verify → patch → compile → package nginx generate-vex.sh Generate OpenVEX document for backported CVE verify-patch.sh Re-derive patch from upstream tarballs (audit tool) patches/ CVE-2026-42945.patch Backported one-line fix from nginx 1.30.1 CVE-2026-42945.provenance.json Machine-readable patch provenance and derivation metadata
test/ compat.py 89-assertion compatibility test suite (runs against live upstream) test_cve_2026_42945.py CVE-specific regression test (exercises vulnerable code path)
artifacts/
patch-attestation.json Build-time patch attestation (tracked)
nginx_*.deb Compiled package (gitignored - rebuilt via make build-source)
nginx Compiled binary (gitignored)
Containerfile Final runtime image definition
Makefile Orchestrates build → test → scan pipeline
vex.json Generated OpenVEX v0.2.0 document
baseline-trivy.txt Point-in-time Trivy scan of nginx:1.25-bookworm
baseline-grype.txt Point-in-time Grype scan of nginx:1.25-bookworm
fixed-trivy.txt Trivy scan of the fixed image
fixed-grype.txt Grype scan of the fixed image (without VEX)
fixed-grype-vex.txt Grype scan of the fixed image (with VEX applied)
---
## 빌드 과정
### 아키텍처```
debian:bookworm-slim (builder)
└─ build.sh
├─ curl nginx-1.25.5.tar.gz (SHA256-verified)
├─ curl njs-0.8.4 from github.com/nginx/njs
├─ patch -p1 < CVE-2026-42945.patch
├─ ./configure (flags identical to upstream nginx -V)
├─ make: release binary, debug binary, 4 dynamic module families (×2 release/debug)
├─ make: NJS modules (×2 release/debug) + njs CLI binary
└─ dpkg-deb → nginx_1.25.5-1~bookworm+echo1_<arch>.deb
debian:bookworm-slim (runtime)
├─ apt-get install runtime deps (libssl3 ≥ 3.0.14 enforced)
├─ dpkg -i nginx_*.deb
└─ COPY --from=upstream /docker-entrypoint.sh + /docker-entrypoint.d/
Containerfile은 /etc/nginx를 업스트림에서 복사하지 않습니다. 모든 구성
파일은 .deb 안에 포함되어 있으며 dpkg의 conffile 메커니즘으로 추적됩니다.
이는 10-listen-on-ipv6-by-default.sh 진입점 스크립트에 필요하며,
이 스크립트는 dpkg-query를 사용하여 default.conf가 사용자에 의해 수정되었는지 감지합니다.
./configure && make를 실행합니다.
업스트림 바이너리나 apt install nginx는 사용하지 않습니다.build.sh는 고정된 소스 아카이브만 가져옵니다.빌드는 대부분 재현 가능하지만 완전히 밀폐(hermetic)되지는 않습니다:
Dockerfile.build에 열거되지만 버전이 고정되지는 않습니다.재현성을 개선하려면 기본 이미지 다이제스트를 고정하세요:```bash docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}'
---
## CVE 수정 세부 정보
### CVE-2024-6119 - OpenSSL 버전 업그레이드
| 필드 | 값 |
| -------------------- | ---------------------------------------------------- |
| **구성 요소** | OpenSSL / libssl3 |
| **심각도** | 높음 (CVSS 7.5) |
| **유형** | X.509 이름 검사를 통한 서비스 거부 |
| **기준 버전** | 3.0.11-1~deb12u2 |
| **수정 버전** | 3.0.14-1~deb12u2 (또는 이후) |
| **당사 버전** | 3.0.20-1~deb12u1 |
| **NVD** | https://nvd.nist.gov/vuln/detail/CVE-2024-6119 |
| **권고** | https://openssl-library.org/news/secadv/20240903.txt |
**수정 작동 방식:**
`.deb` 패키지는 `Depends: libssl3 (>= 3.0.14)`를 선언하므로,
`apt-get install`은 수정 사항이 포함된 OpenSSL 버전을 가져오도록 강제됩니다.
현재 Debian bookworm 저장소는 3.0.20을 제공하며, 이는 CVE-2024-6119 및
기준 버전의 다른 수많은 OpenSSL CVE(CVE-2024-2511, CVE-2024-5535,
CVE-2024-4741, CVE-2023-5678, CVE-2023-6129, CVE-2023-6237, CVE-2024-9143,
CVE-2025-15467, CVE-2025-69420)를 수정합니다.
**스캐너 동작:** Grype와 Trivy는 dpkg 데이터베이스에서 `libssl3 3.0.20`을 확인하고
3.0.20 ≥ 3.0.14임을 인식하므로 CVE-2024-6119가 더 이상 보고되지 않습니다.
VEX가 필요하지 않습니다. 버전 업그레이드만으로 충분히 명백합니다.
**검증:**```bash
grep "CVE-2024-6119" baseline-grype.txt # present
grep "CVE-2024-6119" fixed-grype.txt # absent
| 필드 | 값 |
|---|---|
| 구성 요소 | nginx ngx_http_rewrite_module |
| 심각도 | 중간 (nginx.org 분류) |
| 기준 버전 | nginx 1.25.5 |
| 수정 버전 | nginx 1.30.1 (2026-05-13 출시) |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 |
| 권고 | https://my.f5.com/manage/s/article/K000161019 |
| 업스트림 변경 사항 | nginx 1.30.1 변경 사항: "재작성 모듈의 힙 메모리 버퍼 오버플로우" |
취약점:
src/http/ngx_http_script.c에 있는 ngx_http_script_regex_end_code()는 재작성 정규식 결과를 처리할 때 e->is_args를 재설정하지 못했습니다. 이전 스크립트 엔진 작업에 의해 is_args가 설정된 경우, 리다이렉트/재작성 경로의 후속 버퍼 길이 계산이 잘못되어 제작된 요청 URI를 통해 공격자가 제어할 수 있는 크기의 힙 버퍼 오버플로우가 발생합니다.
수정 (한 줄):
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -3176,6 +3176,7 @@ ngx_http_script_regex_end_code(ngx_http_request_t *r,
}
e->status = NGX_HTTP_MOVED_TEMPORARILY;
+ e->is_args = 0;
return NGX_OK;
}
``````c
// Added before the existing e->quote = 0; at line 1205
e->is_args = 0;
패치 출처:
| 증거 | 위치 / 값 |
|---|---|
| 업스트림 커밋 | 2046b45aa0c6e712c216b9075886f3f26e9b4ca9 |
| 업스트림 작성자 | Roman Arutyunyan (arut), Sergey Kandaurov (pluknet)가 커밋, 2026-05-13 |
| 업스트림 PR | nginx/nginx#1350 |
| 업스트림 태그 | release-1.31.0, release-1.30.1 |
| 관련 이전 수정 | 74d9399 (2012, 유사한 is_args 이스케이프 문제) |
| 패치 파일 | build/patches/CVE-2026-42945.patch |
| 출처 메타데이터 | build/patches/CVE-2026-42945.provenance.json |
| 소스 tarball (취약 버전) | https://nginx.org/download/nginx-1.25.5.tar.gz SHA256:2fe2294f8af4144e7e842eaea884182a84ee7970e... |
| 소스 tarball (수정 버전) | https://nginx.org/download/nginx-1.30.1.tar.gz SHA256:99765000d974896b31ca5882d8c279ce3fe7ef6f... |
| 취약 파일 SHA256 | c4b10c95b00e43d731a61f2380d406155e037f3cfb40a3bf58711ecefddc799a |
| 수정 파일 SHA256 | a6182175a22d88f66b9a61ae051bdcfece10d1bb2e643f7f175eb07589143403 |
| 도출 방법 | diff src/http/ngx_http_script.c 두 tarball 간 비교 (업스트림 커밋과 동일함을 확인) |
| 변경된 라인 수 | 1 (추가만 있음) |
| 패치 적용 확인 | 확인됨: patch --dry-run -p1 < build/patches/CVE-2026-42945.patch 종료 코드 0 |
| 빌드 시 검증 | build.sh가 패치 후 소스에 e->is_args = 0 존재 여부를 확인하고, 없으면 빌드 중단 |
| 빌드 시 증명 | 빌드 중 artifacts/patch-attestation.json에 기록됨 |
| 회귀 테스트 | test/test_cve_2026_42945.py - 취약 코드 경로를 실행 |
| 패치 검증 스크립트 | make verify-patch - 업스트림 tarball에서 패치를 독립적으로 재도출 |
패치 생성 방법:
nginx-1.25.5.tar.gz 다운로드 (SHA256이 고정 해시와 일치하는지 확인)nginx-1.30.1.tar.gz 다운로드 (SHA256 확인: 99765000d974896b31ca5882d8c279ce3fe7ef6f5c6f9f0a967ed7fd3407f9cc)diff src/http/ngx_http_script.c 실행e->is_args = 0; 추가)만 생성됨research/에 보관됨회귀 테스트:
테스트 스위트 test/test_cve_2026_42945.py는 쿼리 문자열 상태(is_args)를 조작하는 다시쓰기 규칙을 통해 요청을 보내 취약한 코드 경로를 실행합니다. 다음을 검증합니다:
?가 있는 다시쓰기 리디렉션(쿼리 제거)이 올바른 응답을 생성하는지is_args 상태를 전환하는 연결된 다시쓰기가 작업자를 중단시키지 않는지실행: make test-cve
스캐너 동작:
패키지 버전이 1.25.5로 유지되므로, 스캐너는 해당 권고가 데이터베이스에 존재할 때 CVE-2026-42945를 플래그합니다. 이는 예상된 동작입니다. 스캐너는 (패키지 이름, 업스트림 버전)을 기준으로 매칭하며 소스에 패치가 적용되었는지 검사할 수 없습니다. VEX 문서는 기계가 읽을 수 있는 정당성을 통해 이 발견을 억제합니다. 스캐너 억제는 의사소통 메커니즘이며, 수정의 주요 증거는 아닙니다. 주요 증거는 위의 패치 출처 체인과 회귀 테스트입니다.
스캐너는 dpkg 데이터베이스에서 (이름, 버전)으로 패키지를 식별합니다. 우리 패키지는 nginx 1.25.5-1~bookworm+echo1입니다. 스캐너는 이를 업스트림 버전 1.25.5로 파싱하고 nginx ≤ 1.25.5에 영향을 미치는 모든 CVE를 플래그합니다.
백포트된 수정의 경우, 스캐너는 취약한 코드가 패치되었는지 확인할 수 없습니다. 패키지 호환성을 유지하기 위해 버전은 의도적으로 1.25.5로 유지됩니다. VEX는 검증 가능한 증거와 연결된 기계가 읽을 수 있는 증명을 제공합니다.
CVE-2026-42945에 대한 VEX 문은 단순한 문서 작업이 아닙니다. 다음에 의해 뒷받침됩니다:
build/patches/CVE-2026-42945.provenance.json은 정확한 업스트림 소스, 도출 방법 및 파일 해시를 문서화합니다.build.sh는 수정 마커가 컴파일된 소스에 존재하는지 확인하고, 실패 시 빌드를 중단합니다.artifacts/patch-attestation.json은 빌드 중 생성된 패치 전/후 파일 해시를 기록합니다.test/test_cve_2026_42945.py는 충돌이나 손상 없이 취약한 코드 경로를 실행합니다.make verify-patch는 두 업스트림 tarball을 다운로드하고 커밋된 패치가 최소한의 보안 diff임을 보여줍니다.| CVE | 상태 | 정당성 | 증거 |
|---|---|---|---|
| CVE-2026-42945 | 수정됨 | vulnerable_code_not_present | 백포트 패치 + 출처 + 회귀 테스트 + 빌드 게이트 |
VEX 범위는 의도적으로 좁습니다. 이 프로젝트가 검증 가능한 증거로 적극적으로 수정한 CVE만 다룹니다. 제공된 버전으로 "완화될 것으로 예상되는" 발견은 억제되지 않습니다. 이는 VEX를 포괄적인 억제 도구로 사용하는 것을 피하기 위함입니다.
build/generate-vex.sh 스크립트는 OpenVEX v0.2.0 문서를 생성합니다. 이를 적용하는 스캐너 명령어:```bash
grype nginx-fixed > fixed-grype.txt
grype nginx-fixed --vex vex.json > fixed-grype-vex.txt
### 스캐너 증거
VEX 억제는 저장된 스캔 아티팩트에서 확인할 수 있습니다. 스캐너 데이터베이스는 주기적으로 재구축되며 CVE 존재 여부는 실행 간에 달라질 수 있습니다. 저장된 `baseline-grype.txt` 및 `fixed-grype.txt` 파일은 특정 시점의 증거입니다. VEX 문서의 유효성은 스캐너 DB 상태에 의존하지 않으며, 위의 증명 체인을 통해 독립적으로 검증 가능합니다.
---
## 스캐너 무결성
### 패키지 네이밍 결정
패키지 이름은 **`nginx`**입니다 (`nginx-custom`이 아님). 이는 다음 이유로 중요합니다:
1. **정직한 보고:** 패키지 이름을 변경하면 스캐너가 이를 nginx로 인식하지 못하여 모든 nginx CVE가 조용히 사라집니다(수정되지 않은 것 포함). 이는 잘못된 안전감을 주는 것입니다.
2. **VEX 시연:** VEX는 스캐너가 실제로 보고하는 CVE만 억제할 수 있습니다. 이름이 변경된 패키지는 VEX를 불필요하게 만들고(테스트 불가능하게 만듭니다).
3. **패키지 관리:** `nginx`로 이름을 지정하면 종속성을 충족하고 표준 Debian 도구로 관리할 수 있습니다.
### 스캐너 데이터베이스 변동성
스캐너 권고 데이터베이스는 주기적으로 재구축됩니다. 한 주에 존재하는 CVE가 다음 주에는 없을 수 있습니다. 이 프로젝트는 스캐너 출력을 수정의 주요 증거로 사용하지 않습니다. 증거 체인은 다음과 같습니다:
1. 패치 출처(스캐너와 관계없이 독립적으로 검증 가능)
2. 빌드 시점 증명(컴파일 중 생성)
3. 회귀 테스트(취약한 코드 경로를 실행)
4. VEX 억제(스캐너 계층의 인정)
저장된 스캔 파일은 특정 시점의 증거일 뿐입니다.
### 스캐너가 보는 것(수정된 이미지)
| Package | Version | CVE-2024-6119 | CVE-2026-42945 |
| ------- | ----------------------- | ------------------------------- | --------------------------------------------------- |
| libssl3 | 3.0.20-1~deb12u1 | 보고되지 않음(버전으로 수정됨) | 해당 없음 |
| nginx | 1.25.5-1~bookworm+echo1 | 해당 없음 | DB에 있으면 보고됨(백포트가 스캐너에 보이지 않음) |
`--vex vex.json`을 사용하면 CVE-2026-42945 발견(스캐너 DB에 있는 경우)이 억제됩니다. VEX 문서의 유효성은 스캐너 출력만이 아니라 증명 체인(패치 파생, 빌드 증명, 회귀 테스트)에 의해 확립됩니다.
---
## 호환성 테스트
테스트 스위트(`test/compat.py`)는 `nginx:1.25-bookworm`과 `nginx-fixed`를 Docker 컨테이너로 부팅하고 동작을 비교합니다. 각 어설션은 수정된 라이브 이미지를 업스트림 라이브 이미지와 직접 테스트합니다.
**89개의 어설션. 모두 통과.**
또한 `test/test_cve_2026_42945.py`는 백포트된 CVE 수정을 구체적으로 대상으로 하는 약 20개의 어설션을 제공합니다(위의 "회귀 테스트" 참조).
| Category | What is compared | Assertion count |
| ------------------- | ------------------------------------------------------------------- | --------------- |
| 이미지 메타데이터 | Entrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels | 7 |
| nginx -V 인수 | 구성 플래그가 동일함(`-ffile-prefix-map` 경로에 대해 정규화됨) | 1 |
| 동적 모듈 | 업스트림 `.so` 파일 12개 모두 존재 + `/etc/nginx/modules` 심볼릭 링크 | 13 |
| nginx-debug 바이너리 | 디버그 -V에 `--with-debug` 및 `--with-http_v3_module` 존재 | 2 |
| 파일 시스템 레이아웃 | 약 20개의 주요 경로, /dev/stdout 및 /dev/stderr에 대한 로그 심볼릭 링크 | 약 20 |
| 사용자/그룹 구성 | `getent passwd/group nginx` 출력이 동일함 | 2 |
| dpkg 설정 파일 | `dpkg-query`가 default.conf 및 nginx.conf를 설정 파일로 보고 | 1 |
| 패키지 제공 | `dpkg -s nginx`가 `Provides: nginx-r1.25.5`를 표시 | 1 |
| NJS 바이너리 | `njs -v`가 0.8.4를 반환 | 1 |
| IPv6 엔트리포인트 | `10-listen-on-ipv6-by-default.sh`가 default.conf를 동일하게 변경 | 1 |
| Envsubst 템플릿 | `NGINX_ENVSUBST` 템플릿 대체가 동일한 출력을 생성함 | 1 |
| 시작 로그 | 모든 엔트리포인트 로그 줄이 업스트림 형식과 일치 | 1 |
| HTTP GET/HEAD/POST | 여러 엔드포인트에 대해 응답 본문, 상태, 헤더 일치 | 약 10 |
| 잘못된 요청 | 원시 TCP 오류 응답이 동일함 | 1 |
| 정적 파일 서빙 | 마운트된 파일이 올바른 내용으로 제공됨 | 1 |
| TLS 종료 | 자체 서명 인증서로 HTTPS가 동일하게 작동 | 1 |
| 정상 종료 | SIGQUIT가 깔끔한 종료(코드 0)를 생성 | 1 |
| 설정 리로드 | SIGHUP이 재시작 없이 새 구성을 적용함 | 1 |
| 동시 요청 | 50개의 병렬 요청이 모두 200을 반환 | 1 |
### 테스트되지 않은 것
- HTTP/3 QUIC 프로토콜 동작(`--with-http_v3_module` 플래그 존재만 확인, UDP/QUIC 트래픽은 전송되지 않음)
- 부하 시 성능 또는 지연 시간 특성
- 가능한 모든 nginx 구성 지시문
- 거의 사용되지 않는 동적 모듈(GeoIP, image_filter, XSLT)의 동작을 `.so` 파일이 디스크에 존재하는지 확인하는 것 외에는 테스트하지 않음
실행:```bash
make test
| 이미지 | 크기 (arm64, docker images) |
|---|---|
nginx:1.25-bookworm | ~278 MB |
nginx-fixed | ~332 MB |
고정 이미지는 업스트림보다 큽니다. 예상된 결과입니다. 공식 이미지는 사전 컴파일된 바이너리를 최적화된 레이어에 사용하지만, 저희는 빌드 아티팩트와 전체 런타임 종속성(12개 동적 모듈의 라이브러리 포함)을 debian:bookworm-slim 베이스에 설치합니다. 크기 차이는 소스 수준의 빌드 제어를 위한 절충안이며, 기능 회귀가 아닙니다.
고정 이미지에는 이 프로젝트에서 해결하지 않은 시스템 라이브러리의 취약점이 여전히 존재합니다(시점 기준, 현재 상태는 make scan 실행).
| 위험 수준 | 패키지 | CVE | 참고 |
|---|---|---|---|
| 높음 | nginx | CVE-2023-44487 | 업스트림에 따라 nginx ≥ 1.25.3에서 완화됨. Debian 추적기가 권고를 종료하지 않아 스캐너가 여전히 플래그 지정 |
| 치명적 | libgnutrl30 | CVE-2026-42010, CVE-2026-33845 | bookworm에서 사용 가능한 수정 사항 없음 |
| 치명적 | libc6/libc-bin | CVE-2026-5450 | 이 Debian 릴리스에서 수정되지 않음 |
| 높음 | libc6/libc-bin | CVE-2026-5928, CVE-2026-5435, CVE-2026-4437 | glibc, bookworm 수정 불가 |
| 높음 | dpkg | CVE-2025-6297, CVE-2026-2219 | 수정 가능 (1.21.23으로 업그레이드) |
| 높음 | libldap-2.5-0 | CVE-2023-2953 | 수정 불가 |
| 높음 | curl/libcurl4 | CVE-2026-5773, CVE-2026-6276 | 수정 불가 |
| 높음 | ncurses | CVE-2025-69720 | 수정 불가 |
이는 debian:bookworm-slim에서 상속된 것으로, 이 프로젝트의 nginx 중심 CVE 해결 범위를 벗어납니다.
make sbom 대상 존재, syft 사용) 및 SBOM purl을 통해 VEX 연결.cosign으로 이미지 서명 및 VEX + SBOM + 패치 증명을 OCI 증명으로 첨부.build.sh의 ./configure 플래그는 공식 nginx:1.25-bookworm 이미지의 nginx -V에서 보고된 플래그와 동일합니다. 이는 test/compat.py::test_nginx_version에서 -ffile-prefix-map=<path> 차이를 정규화하고 나머지 플래그를 문자별로 비교하여 확인합니다.
주목할 만한 플래그(두 이미지 모두에 존재):
| 플래그 / 기능 | 목적 |
|---|---|
--prefix=/etc/nginx | Docker 이미지 규칙 (Debian의 /usr/share/nginx 아님) |
--with-http_v3_module | 내장 QUIC 스택 (OpenSSL QUIC API와 무관) |
--with-pcre (PCRE2) | libpcre2-8-0 연결 (레거시 PCRE1 아님) |
--with-stream | TCP/UDP 프록시 모듈 (동적) |
| 보안 강화 | -fstack-protector-strong, FORTIFY_SOURCE=2, RELRO, PIE |
| 동적 모듈 (×12) | geoip, stream_geoip, image_filter, xslt, http_js, stream_js (릴리스 + 디버그) |
--with-debug (디버그) | nginx-debug 바이너리를 별도로 동일한 플래그 + 디버그로 빌드 |
.deb 패키지 메타데이터:```
Package: nginx
Version: 1.25.5-1bookworm+echo1
Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libpcre2-8-0 (>= 10.22),
libssl3 (>= 3.0.14), zlib1g (>= 1:1.2.11), libgeoip1 (>= 1.6.12),
libgd3 (>= 2.1.0alpha~), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25),
lsb-base (>= 3.0-6), adduser
Provides: httpd, nginx, nginx-r1.25.5
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
주요 패키징 결정 사항:
- **`libssl3 (>= 3.0.14)`** - 패치된 OpenSSL을 명시적으로 요구합니다 (업스트림은 `>= 3.0.0` 선언). 이는 CVE-2024-6119 수정을 강제하는 메커니즘입니다.
- **`Provides: nginx-r1.25.5`** - 이 가상 패키지에 의존하는 동적 모듈 패키지를 충족시킵니다.
- **Conffiles**가 dpkg에 등록됨: `/etc/nginx/nginx.conf` 및 `/etc/nginx/conf.d/default.conf`. 이는 IPv6 엔트리포인트 스크립트의 `dpkg-query --showformat` 검사에 필요합니다.
- **postinst**는 uid/gid 101 및 셸 `/bin/false`로 nginx 사용자/그룹을 생성합니다 (업스트림과 일치하며 테스트 스위트에서 확인됨).
- 포함 항목: nginx 바이너리, nginx-debug 바이너리, 모든 12개의 `.so` 모듈, 전체 `/etc/nginx` 설정 트리, init.d/systemd/logrotate 파일, man 페이지, HTML 기본값, 그리고 `/etc/nginx/modules` → `/usr/lib/nginx/modules` 심볼릭 링크.
---
## 설계 결정 및 절충점
1. **패키지 이름은 `nginx`이며 `nginx-custom`이 아닙니다.** 이름을 바꾸면 스캐너가 nginx 권고와 일치시키지 못합니다. 수정되지 않은 것을 포함한 모든 nginx CVE가 보고서에서 조용히 사라집니다. 이름을 `nginx`로 유지하면 정직한 스캐너 보고를 보장하고 VEX를 의미 있게 만듭니다.
2. **VEX는 CVE 가시성을 필요로 합니다.** VEX의 목적은 이미 보고된 CVE를 억제하는 것입니다. 스캐너가 CVE를 찾지 못하면 (패키지 이름 변경 또는 DB 타이밍으로 인해), VEX가 억제할 것이 없습니다.
3. **패키지 의존성으로 `libssl3 (>= 3.0.14)`.** 런타임 베이스가 우연히 패치된 OpenSSL을 가지고 있기를 기대하는 대신, `.deb`는 CVE-2024-6119 수정이 포함된 버전을 하드 요구합니다.
4. **스캐너 데이터베이스 변동성.** 권고 데이터베이스는 주기적으로 재구축됩니다. 한 주에 존재하는 CVE가 다음 주에는 없을 수 있습니다. 이 저장소에 저장된 스캔 파일은 특정 시점의 증거이며, 현재 스캔은 다를 수 있습니다.
5. **사용된 AI 도구.** GitHub Copilot이 패치 분석(nginx 1.25.5 및 1.30.1 소스 트리 비교), 테스트 스위트 구조, 패키지 이름 변경 스캐너 회피 문제 식별, VEX 문서 작성에 도움을 주었습니다. Debian 패키징 세부 사항 및 Grype 버전 일치 휴리스틱은 수동 검증이 필요했습니다.