
Contenedor nginx 1.25.5 construido desde el código fuente con corrección retroportada de CVE-2026-42945, actualización de OpenSSL, cadena de procedencia completa y atestación VEX.
nginx:1.25-bookwormUna imagen de contenedor nginx 1.25.5 compilada desde fuente que remedia dos CVEs presentes en la imagen oficial nginx:1.25-bookworm mientras preserva el comportamiento de ejecución del upstream.
| CVE | Componente | Severidad | Técnica | Modelo de verificación |
|---|---|---|---|---|
| CVE-2024-6119 | OpenSSL / libssl3 | Alta | Actualización de versión de dependencia | Verificable por escáner: libssl3 3.0.20 visible en la base de datos de dpkg |
| CVE-2026-42945 | nginx ngx_http_rewrite_module | Crítico | Parche de fuente adaptado (backport) | Verificable por procedencia: derivación del parche + prueba de regresión + atestación de compilación + VEX |
Éstos representan dos modelos de remediación distintos:
Los argumentos de configuración de nginx -V de esta imagen coinciden con los de nginx:1.25-bookworm (comparados carácter por carácter después de normalizar la ruta de compilación -ffile-prefix-map; verificado en test/compat.py::test_nginx_version). El conjunto de pruebas (make test) valida 89 comprobaciones que cubren metadatos de la imagen, módulos dinámicos, diseño del sistema de archivos, comportamiento del punto de entrada, empaquetado dpkg y manejo de solicitudes HTTP contra la imagen upstream en vivo.
Diferencias conocidas respecto al upstream (no validadas como idénticas):
built with OpenSSL X.X.X en nginx -V refleja la versión de libssl-dev del compilador, que puede diferir del OpenSSL en tiempo de compilación del upstream.debian:bookworm-slim en lugar del árbol de paquetes heredado de la imagen oficial.libssl3 en tiempo de ejecución es la que bookworm proporciona actualmente (3.0.20 en el momento de escribir esto), no la versión fijada en la imagen upstream.make image
make test
make test-cve
make verify-patch
make scan
Un comando para construir, probar y escanear:```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)
---
## Proceso de compilación
### Arquitectura```
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/
El Containerfile NO copia /etc/nginx desde upstream. Todos los archivos
de configuración se incluyen dentro del .deb y son gestionados por el mecanismo
de archivos de configuración de dpkg. Esto es necesario para el script de
entrada 10-listen-on-ipv6-by-default.sh, que utiliza dpkg-query para detectar
si default.conf ha sido modificado por el usuario.
./configure && make dentro de un contenedor Debian limpio.
Sin binarios de upstream, sin apt install nginx.build.sh solo descarga los archivos fuente
anclados (pinned).La compilación es mayormente reproducible pero no hermética:
Dockerfile.build pero no tienen
versiones ancladas.Para mejorar la reproducibilidad, ancle el digest de la imagen base:```bash docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}'
---
## Detalles de Remediación de CVE
### CVE-2024-6119 - Actualización de Versión de OpenSSL
| Campo | Valor |
| -------------------- | ---------------------------------------------------- |
| **Componente** | OpenSSL / libssl3 |
| **Gravedad** | Alta (CVSS 7.5) |
| **Tipo** | Denegación de Servicio mediante verificaciones de nombre X.509 |
| **Versión base** | 3.0.11-1~deb12u2 |
| **Versión corregida**| 3.0.14-1~deb12u2 (o posterior) |
| **Nuestra versión** | 3.0.20-1~deb12u1 |
| **NVD** | https://nvd.nist.gov/vuln/detail/CVE-2024-6119 |
| **Aviso** | https://openssl-library.org/news/secadv/20240903.txt |
**Cómo funciona la corrección:**
El paquete `.deb` declara `Depends: libssl3 (>= 3.0.14)`, lo que fuerza a
`apt-get install` a obtener una versión de OpenSSL que incluya la corrección. Los
repositorios actuales de Debian bookworm proporcionan 3.0.20, que corrige CVE-2024-6119 y
decenas de otros CVEs de OpenSSL de la versión base (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).
**Comportamiento del escáner:** Grype y Trivy ven `libssl3 3.0.20` en la base de datos
dpkg y reconocen que 3.0.20 ≥ 3.0.14, por lo que CVE-2024-6119 ya no se reporta.
No se necesita VEX: el aumento de versión es evidente.
**Verificación:**```bash
grep "CVE-2024-6119" baseline-grype.txt # present
grep "CVE-2024-6119" fixed-grype.txt # absent
Vulnerabilidad:
ngx_http_script_regex_end_code() en src/http/ngx_http_script.c no restablecía e->is_args al procesar un resultado de expresión regular de reescritura. Si is_args era establecido por una operación previa del motor de scripts, los cálculos subsiguientes de la longitud del búfer en la ruta de redirección/reescritura serían incorrectos, causando un desbordamiento de búfer de montón (heap) de tamaño controlado por el atacante mediante URIs de solicitud manipuladas.
La corrección (una línea):```c // Added before the existing e->quote = 0; at line 1205 e->is_args = 0;
**Procedencia del parche:**
| Evidencia | Ubicación / Valor |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Commit upstream | [`2046b45aa0c6e712c216b9075886f3f26e9b4ca9`](https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9) |
| Autor upstream | Roman Arutyunyan (arut), confirmado por Sergey Kandaurov (pluknet), 2026-05-13 |
| PR upstream | [nginx/nginx#1350](https://github.com/nginx/nginx/pull/1350) |
| Etiquetas upstream | `release-1.31.0`, `release-1.30.1` |
| Corrección previa relacionada| [`74d9399`](https://github.com/nginx/nginx/commit/74d939974d430a2c2e71b0134114d2a7b04dcc20) (2012, problema similar de escape `is_args`)|
| Archivo de parche | `build/patches/CVE-2026-42945.patch` |
| Metadatos de procedencia | `build/patches/CVE-2026-42945.provenance.json` |
| Tarball fuente (vulnerable) | `https://nginx.org/download/nginx-1.25.5.tar.gz` SHA256:`2fe2294f8af4144e7e842eaea884182a84ee7970e...` |
| Tarball fuente (corregido) | `https://nginx.org/download/nginx-1.30.1.tar.gz` SHA256:`99765000d974896b31ca5882d8c279ce3fe7ef6f...` |
| SHA256 del archivo vulnerable| `c4b10c95b00e43d731a61f2380d406155e037f3cfb40a3bf58711ecefddc799a` |
| SHA256 del archivo corregido| `a6182175a22d88f66b9a61ae051bdcfece10d1bb2e643f7f175eb07589143403` |
| Método de derivación | `diff src/http/ngx_http_script.c` entre los dos tarballs (confirmado idéntico al commit upstream) |
| Líneas cambiadas | 1 (solo adición) |
| El parche se aplica limpio | Verificado: `patch --dry-run -p1 < build/patches/CVE-2026-42945.patch` termina con 0 |
| Verificación en tiempo de compilación| `build.sh` verifica que `e->is_args = 0` esté presente en el código fuente después de aplicar el parche; aborta la compilación si no|
| Atestación en tiempo de compilación| Se escribe en `artifacts/patch-attestation.json` durante la compilación |
| Prueba de regresión | `test/test_cve_2026_42945.py` - ejercita la ruta de código vulnerable |
| Script de verificación del parche| `make verify-patch` - deriva de nuevo el parche independientemente de los tarballs upstream |
**Cómo se creó el parche:**
1. Se descargó `nginx-1.25.5.tar.gz` (SHA256 verificado contra el hash fijado)
2. Se descargó `nginx-1.30.1.tar.gz` (SHA256 verificado: `99765000d974896b31ca5882d8c279ce3fe7ef6f5c6f9f0a967ed7fd3407f9cc`)
3. Se ejecutó `diff src/http/ngx_http_script.c` entre los dos árboles
4. El diff produjo exactamente una línea: la adición de `e->is_args = 0;`
5. Se extrajo como un parche diff unificado con líneas de contexto
6. Se verificó que el parche se aplica limpiamente a nginx 1.25.5
7. Ambos árboles fuente se conservan en `research/` para verificación independiente
**Pruebas de regresión:**
El conjunto de pruebas `test/test_cve_2026_42945.py` ejercita la ruta de código
vulnerable enviando solicitudes a través de reglas de reescritura que manipulan
el estado de la cadena de consulta (`is_args`). Valida:
- Las redirecciones de reescritura con `?` final (eliminación de consulta) generan respuestas bien formadas
- Las reescrituras encadenadas que alternan el estado `is_args` no provocan un fallo del worker
- Las cadenas de consulta largas (4KB+) no causan artefactos de desbordamiento de búfer (bytes nulos, cabeceras Location demasiado largas)
- 100 solicitudes mixtas rápidas no provocan fallos del worker
- El proceso worker sobrevive a todos los casos de prueba sin SIGSEGV ni corrupción del montón
Ejecutar: `make test-cve`
**Comportamiento del escáner:**
Debido a que la versión del paquete sigue siendo `1.25.5`, los escáneres marcarán CVE-2026-42945
cuando el aviso esté presente en su base de datos. Esto es esperado: los escáneres
coinciden por `(nombre-paquete, versión-upstream)` y no pueden inspeccionar si el código fuente
ha sido parcheado. El documento VEX suprime este hallazgo con una justificación
legible por máquina. La supresión del escáner es un mecanismo de comunicación, no la
evidencia principal de la corrección. La evidencia principal es la cadena de procedencia del parche
y la prueba de regresión anterior.
---
## VEX (Intercambio de Explotabilidad de Vulnerabilidades)
### Por qué se necesita VEX
Los escáneres identifican paquetes por `(nombre, versión)` desde la base de datos dpkg.
Nuestro paquete es `nginx 1.25.5-1~bookworm+echo1`: los escáneres lo interpretan como
versión upstream 1.25.5 y marcan todos los CVE que afectan a nginx ≤ 1.25.5.
Para correcciones backporteadas, el escáner no puede determinar que el código vulnerable
ha sido parcheado. La versión se mantiene intencionalmente como 1.25.5 para preservar
la compatibilidad del paquete. VEX proporciona una atestación legible por máquina de que el
CVE ha sido abordado, vinculada a evidencia verificable.
### Cadena de credibilidad de VEX
La declaración VEX para CVE-2026-42945 NO es mero papeleo. Está respaldada por:
1. **Procedencia del parche** - `build/patches/CVE-2026-42945.provenance.json`
documenta la fuente upstream exacta, el método de derivación y los hashes de los archivos
2. **Verificación en tiempo de compilación** - `build.sh` afirma que el marcador de corrección está presente
en el código fuente compilado, abortando la compilación en caso de fallo
3. **Atestación de compilación** - `artifacts/patch-attestation.json` registra
los hashes de archivos antes y después del parche generados durante la compilación
4. **Prueba de regresión** - `test/test_cve_2026_42945.py` ejercita la ruta de código
vulnerable sin fallos ni corrupción
5. **Re-derivación independiente** - `make verify-patch` descarga ambos tarballs
upstream y demuestra que el parche confirmado es el diff de seguridad mínimo
### Lo que cubre el VEX
| CVE | Estado | Justificación | Evidencia |
| -------------- | ------- | ----------------------------- | ----------------------------------------------------------- |
| CVE-2026-42945 | `fixed` | `vulnerable_code_not_present` | Parche backport + procedencia + prueba de regresión + compuerta de compilación |
El alcance de VEX es intencionalmente estrecho: solo se cubren los CVE que este proyecto haya
corregido activamente con evidencia verificable. Los hallazgos que simplemente se "espera que estén
mitigados" por la versión distribuida no se suprimen, para evitar usar VEX como una herramienta de supresión generalizada.
### Cómo funciona
El script `build/generate-vex.sh` produce un documento OpenVEX v0.2.0.
El comando del escáner para aplicarlo:```bash
# Without VEX - CVE is reported (version-based match):
grype nginx-fixed > fixed-grype.txt
# With VEX - CVE is suppressed with justification:
grype nginx-fixed --vex vex.json > fixed-grype-vex.txt
La supresión VEX es observable en los artefactos de escaneo guardados. Tenga en cuenta que las bases de datos del escáner se reconstruyen periódicamente y la presencia de CVE puede variar entre ejecuciones. Los archivos guardados baseline-grype.txt y fixed-grype.txt son evidencia puntual. La validez del documento VEX NO depende del estado de la base de datos del escáner; es verificable de forma independiente a través de la cadena de proveniencia anterior.
El paquete se llama nginx (no nginx-custom). Esto es crítico porque:
nginx permite que satisfaga dependencias y sea gestionado por las herramientas estándar de Debian.Las bases de datos de avisos del escáner se reconstruyen periódicamente. Un CVE presente una semana puede estar ausente la siguiente. Este proyecto NO depende de la salida del escáner como prueba principal de corrección. La cadena de evidencia es:
Los archivos de escaneo guardados son solo evidencia puntual.
| Package | Version | CVE-2024-6119 | CVE-2026-42945 |
|---|---|---|---|
| libssl3 | 3.0.20-1~deb12u1 | No reportado (corregido por versión) | n/a |
| nginx | 1.25.5-1~bookworm+echo1 | n/a | Reportado cuando está en BD (backport invisible al escáner) |
Con --vex vex.json, el hallazgo de CVE-2026-42945 (si está presente en la BD del escáner) se suprime. La validez del documento VEX se establece mediante la cadena de proveniencia (derivación del parche, atestación de compilación, prueba de regresión), no solo por la salida del escáner.
El conjunto de pruebas (test/compat.py) inicia tanto nginx:1.25-bookworm como nginx-fixed como contenedores Docker y compara el comportamiento. Cada aserción prueba directamente la imagen corregida en vivo contra la imagen original en vivo.
89 aserciones. Todas pasan.
Además, test/test_cve_2026_42945.py proporciona ~20 aserciones específicamente dirigidas a la corrección del CVE retroportado (ver "Pruebas de regresión" arriba).
--with-http_v3_module; no se envía tráfico UDP/QUIC).so están presentes en el discoEjecutar:```bash make test
---
## Tamaño de la imagen
| Imagen | Tamaño (arm64, `docker images`) |
| -------------------- | ------------------------------- |
| `nginx:1.25-bookworm` | ~278 MB |
| `nginx-fixed` | ~332 MB |
La imagen fija es más grande que la de referencia. Esto es esperado: la imagen oficial
utiliza binarios precompilados en capas optimizadas, mientras que la nuestra instala
artefactos de compilación y dependencias de ejecución completas (incluyendo bibliotecas
para los 12 módulos dinámicos) en una base `debian:bookworm-slim`. La diferencia de
tamaño es una compensación por el control de compilación a nivel de fuente, no una
regresión en funcionalidad.
---
## Evaluación de Riesgos Residuales
### CVEs que permanecen en la imagen fija
La imagen fija aún contiene vulnerabilidades en bibliotecas del sistema que no son
abordadas por este proyecto (puntuales; ejecute `make scan` para el estado actual):
| Nivel de Riesgo | Paquete | CVE(s) | Notas |
| --------------- | -------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Alta | nginx | CVE-2023-44487 | Mitigado en nginx ≥ 1.25.3 según el upstream; el escáner aún lo marca porque el tracker de Debian no ha cerrado el aviso |
| Crítica | libgnutls30 | CVE-2026-42010, CVE-2026-33845 | No hay corrección disponible en bookworm |
| Crítica | libc6/libc-bin | CVE-2026-5450 | No se corregirá en esta versión de Debian |
| Alta | libc6/libc-bin | CVE-2026-5928, CVE-2026-5435, CVE-2026-4437 | glibc no se corregirá para bookworm |
| Alta | dpkg | CVE-2025-6297, CVE-2026-2219 | Corregible (actualizar a 1.21.23) |
| Alta | libldap-2.5-0 | CVE-2023-2953 | No se corregirá |
| Alta | curl/libcurl4 | CVE-2026-5773, CVE-2026-6276 | No se corregirá |
| Alta | ncurses | CVE-2025-69720 | No se corregirá |
Estas son heredadas de `debian:bookworm-slim` y están fuera del alcance de la
remediación de CVE centrada en nginx de este proyecto.
### Limitaciones de este enfoque
1. **No hermético.** La imagen base y los paquetes apt se resuelven en tiempo de
compilación desde repositorios Debian en vivo. Fijar el SHA de la imagen base y
usar instantáneas de apt mejoraría la reproducibilidad.
2. **Sin pruebas QUIC de comportamiento.** El soporte HTTP/3 está compilado
(verificado por bandera) pero no se ejercita tráfico QUIC en el conjunto de pruebas.
3. **Sin validación de rendimiento.** La prueba de 50 solicitudes concurrentes
demuestra corrección, no rendimiento o latencia equivalente.
4. **Solo carga de módulos.** Los módulos dinámicos (GeoIP, image_filter, XSLT) se
verifican que estén presentes y se puedan cargar, pero su comportamiento de
funcionalidad no se ejercita más allá de la carga básica.
5. **Evidencia de una sola arquitectura.** Las pruebas se ejecutan únicamente en la
arquitectura del host de compilación (arm64 en desarrollo; se necesitaría CI para
multi-arquitectura).
### Mejoras futuras (no implementadas)
1. Fijar el digest de la imagen base y usar URLs de instantáneas de apt para
compilaciones herméticas.
2. Eliminar paquetes innecesarios (ncurses, util-linux) traídos como dependencias
transitivas.
3. Generar SBOM (el objetivo `make sbom` existe, usa `syft`) y enlazar a VEX mediante
purl de SBOM.
4. Firmar la imagen con `cosign` y adjuntar VEX + SBOM + atestación de parche como
atestaciones OCI.
5. Añadir canal de CI (GitHub Actions) para compilación → prueba → escaneo → push
automatizados.
6. Añadir prueba de protocolo HTTP/3 (cliente QUIC, configuración de certificados,
puerto UDP).
7. Considerar una base distroless para eliminar por completo el ruido de CVE a nivel
de SO.
8. Añadir variante de compilación con ASan (AddressSanitizer) para demostrar que no
hay corrupción de heap bajo carga de prueba.
---
## Banderas de Compilación vs. Upstream
Las banderas `./configure` en `build.sh` son idénticas a las reportadas por
`nginx -V` en la imagen oficial `nginx:1.25-bookworm`. Esto se verifica
por `test/compat.py::test_nginx_version`, que normaliza la
diferencia `-ffile-prefix-map=<path>` y compara las banderas restantes
carácter por carácter.
Banderas notables (presentes en ambas imágenes):
| Bandera / característica | Propósito |
| ----------------------------------- | ------------------------------------------------------------------------------- |
| `--prefix=/etc/nginx` | Convención de imagen Docker (no `/usr/share/nginx` de Debian) |
| `--with-http_v3_module` | Stack QUIC integrado (independiente de la API QUIC de OpenSSL) |
| `--with-pcre` (PCRE2) | Enlaza contra `libpcre2-8-0` (no el legado PCRE1) |
| `--with-stream` | Módulo proxy TCP/UDP (dinámico) |
| Endurecimiento de seguridad | `-fstack-protector-strong`, `FORTIFY_SOURCE=2`, RELRO, PIE |
| Módulos dinámicos (×12) | geoip, stream_geoip, image_filter, xslt, http_js, stream_js (release + debug) |
| `--with-debug` (debug) | Binario nginx-debug compilado por separado con banderas idénticas + debug |
---
## Paquete Debian
Los metadatos del paquete `.deb`:```
Package: nginx
Version: 1.25.5-1~bookworm+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.0~alpha~), 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
Decisiones clave de empaquetado:
libssl3 (>= 3.0.14) - requiere explícitamente OpenSSL parcheado (upstream declara >= 3.0.0). Este es el mecanismo que aplica la corrección de CVE-2024-6119.Provides: nginx-r1.25.5 - satisface los paquetes de módulos dinámicos que dependen de este paquete virtual./etc/nginx/nginx.conf y /etc/nginx/conf.d/default.conf. Esto es necesario para la verificación de dpkg-query --showformat del script de entrada IPv6./bin/false (coincidiendo con upstream - verificado en el conjunto de pruebas)..so, el árbol completo de configuración /etc/nginx, archivos init.d/systemd/logrotate, página man, HTML predeterminado, y el enlace simbólico /etc/nginx/modules → /usr/lib/nginx/modules.Paquete nombrado nginx, no nginx-custom. Si se renombra, los escáneres no lo compararían con los avisos de nginx - todos los CVE de nginx desaparecerían silenciosamente de los informes, incluidos los no corregidos. Mantener el nombre nginx asegura informes honestos del escáner y hace que VEX tenga sentido.
VEX requiere visibilidad de CVE. El propósito de VEX es suprimir un CVE que ya ha sido reportado. Si el escáner no encuentra el CVE (debido a renombramiento del paquete o sincronización de BD), VEX no tiene nada que suprimir.
libssl3 (>= 3.0.14) como dependencia del paquete. En lugar de esperar que la base de ejecución tenga casualmente un OpenSSL parcheado, el .deb requiere de forma estricta una versión que contenga la corrección para CVE-2024-6119.
Volatilidad de la base de datos del escáner. Las bases de datos de avisos se reconstruyen periódicamente. Un CVE presente una semana puede estar ausente la siguiente. Los archivos de escaneo guardados en este repositorio son evidencia en un momento dado; los escaneos actuales pueden diferir.
Herramientas de IA utilizadas. GitHub Copilot asistió con el análisis de parches (comparando los árboles fuente de nginx 1.25.5 y 1.30.1), la estructura del conjunto de pruebas, la identificación del problema de evasión del escáner por renombramiento del paquete, y la redacción del documento VEX. Los detalles de empaquetado Debian y las heurísticas de coincidencia de versiones de Grype requirieron verificación manual.
| Campo | Valor |
|---|
| Componente | nginx ngx_http_rewrite_module |
| Gravedad | Medio (clasificación de nginx.org) |
| Versión base | nginx 1.25.5 |
| Corregido en | nginx 1.30.1 (publicado el 2026-05-13) |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 |
| Aviso | https://my.f5.com/manage/s/article/K000161019 |
| Upstream CHANGES | nginx 1.30.1 CHANGES: "desbordamiento de búfer de memoria dinámica (heap) en el módulo de reescritura" |
| Categoría | Qué se compara | Número de aserciones |
|---|
| Metadatos de imagen | Entrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels | 7 |
| Argumentos nginx -V | Banderas de configuración idénticas (normalizadas para ruta -ffile-prefix-map) | 1 |
| Módulos dinámicos | Todos los 12 archivos .so de upstream presentes + enlace simbólico /etc/nginx/modules | 13 |
| Binario nginx-debug | --with-debug y --with-http_v3_module presentes en debug -V | 2 |
| Estructura del sistema de archivos | ~20 rutas clave, enlaces simbólicos de registro a /dev/stdout y /dev/stderr | ~20 |
| Configuración de usuario/grupo | Salida de getent passwd/group nginx idéntica | 2 |
| Archivos de configuración dpkg | dpkg-query reporta default.conf y nginx.conf como archivos de configuración | 1 |
| Provides del paquete | dpkg -s nginx muestra Provides: nginx-r1.25.5 | 1 |
| Binario NJS | njs -v devuelve 0.8.4 | 1 |
| Punto de entrada IPv6 | 10-listen-on-ipv6-by-default.sh modifica default.conf de forma idéntica | 1 |
| Plantillas Envsubst | La sustitución de plantillas NGINX_ENVSUBST produce la misma salida | 1 |
| Registros de inicio | Todas las líneas de registro del entrypoint coinciden con el formato upstream | 1 |
| HTTP GET/HEAD/POST | Cuerpo de respuesta, estado, cabeceras coinciden para múltiples endpoints | ~10 |
| Solicitud malformada | Respuesta de error TCP sin procesar idéntica | 1 |
| Servicio de archivos estáticos | Archivo montado servido con contenido correcto | 1 |
| Terminación TLS | HTTPS con certificado autofirmado funciona de manera idéntica | 1 |
| Apagado graceful | SIGQUIT produce salida limpia (código 0) | 1 |
| Recarga de configuración | SIGHUP aplica nueva configuración sin reiniciar | 1 |
| Solicitudes concurrentes | 50 solicitudes paralelas todas devuelven 200 | 1 |