Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
nginx-cve-fix — 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. | Kitploit
Herramientas/GitHubGitHub/barappteam/nginx-cve-fix
Escáneres de VulnerabilidadesSeguridad de ContenedoresAnálisis de VulnerabilidadesAuditoría de ConfiguraciónDevSecOpsSeguridad de Cadena de Suministro
GitHubbarappteam/nginx-cve-fix

nginx-cve-fix

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.

Ver Repositorio
hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Nginx CVE Fix - Drop-in compilado desde fuente para nginx:1.25-bookworm

Una 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.

CVEComponenteSeveridadTécnicaModelo de verificación
CVE-2024-6119OpenSSL / libssl3AltaActualización de versión de dependenciaVerificable por escáner: libssl3 3.0.20 visible en la base de datos de dpkg
CVE-2026-42945nginx ngx_http_rewrite_moduleCríticoParche 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:

  1. Actualización de versión (CVE-2024-6119) - la versión de la biblioteca corregida es directamente visible para los escáneres a través de la base de datos de dpkg. No se necesita atestación adicional.
  2. Adaptación de fuente (CVE-2026-42945) - la versión del paquete sigue siendo 1.25.5, por lo que los escáneres no pueden distinguir el binario parcheado de uno sin parchear. La remediación se demuestra a través de la procedencia de la fuente, la verificación en tiempo de compilación y las pruebas de regresión. VEX proporciona la señal a nivel de escáner.

Estado de paridad

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):

  • La línea 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.
  • El contenido binario no es idéntico byte por byte (entorno de compilación diferente, marcas de tiempo de invocación de la cadena de herramientas diferentes).
  • El conjunto de paquetes de la imagen difiere: base debian:bookworm-slim en lugar del árbol de paquetes heredado de la imagen oficial.
  • La versión de 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.

Inicio rápido```bash

Build everything (builder → .deb → final image)

make image

Run automated compatibility tests

make test

Run CVE-2026-42945 regression test

make test-cve

Verify patch provenance (re-derives from upstream tarballs)

make verify-patch

Scan and demonstrate VEX

make scan

root@kitploit:~
Un comando para construir, probar y escanear:```bash
make all

Estructura del Repositorio```

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)

root@kitploit:~
---
## 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.

Garantías de Integridad

  • Archivos fuente comprimidos (tarballs): Todos los archivos fuente (nginx, NJS) se verifican mediante SHA256 contra hashes codificados antes de la extracción. La compilación se aborta en caso de discrepancia.
  • Compilar desde el código fuente: ./configure && make dentro de un contenedor Debian limpio. Sin binarios de upstream, sin apt install nginx.
  • Sin acceso a la red durante la compilación: las dependencias se instalan en la capa de la imagen Docker del compilador; build.sh solo descarga los archivos fuente anclados (pinned).

Reproducibilidad

La compilación es mayormente reproducible pero no hermética:

  • La versión de nginx y su SHA256 están anclados y verificados antes de la extracción.
  • La versión de NJS y su SHA256 están anclados y verificados antes de la extracción.
  • Las dependencias del compilador están enumeradas en Dockerfile.build pero no tienen versiones ancladas.
  • Los paquetes de Debian en tiempo de ejecución se resuelven desde los repositorios activos de bookworm en el momento de la compilación, por lo que las versiones menores pueden variar entre compilaciones.

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}}'

Then use: FROM debian:bookworm-slim@sha256:

root@kitploit:~
---

## 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

CVE-2026-42945 - Parche retroportado

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;

root@kitploit:~
**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

Evidencia del escáner

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.


Integridad del Escáner

Decisión de nombre del paquete

El paquete se llama nginx (no nginx-custom). Esto es crítico porque:

  1. Información honesta: Si el paquete se renombrara, los escáneres no lo reconocerían como nginx y TODOS los CVE de nginx desaparecerían silenciosamente, incluidos los no corregidos. Eso es una falsa sensación de seguridad.
  2. Demostración de VEX: VEX solo puede suprimir un CVE que el escáner realmente reporte. Los paquetes renombrados hacen que VEX sea innecesario (y no comprobable).
  3. Gestión de paquetes: Llamarlo nginx permite que satisfaga dependencias y sea gestionado por las herramientas estándar de Debian.

Volatilidad de la base de datos del escáner

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:

  1. Proveniencia del parche (verificable independientemente de cualquier escáner)
  2. Atestación en tiempo de compilación (generada durante la compilación)
  3. Prueba de regresión (ejercita la ruta de código vulnerable)
  4. Supresión VEX (reconocimiento a nivel de escáner)

Los archivos de escaneo guardados son solo evidencia puntual.

Qué ven los escáneres (imagen corregida)

PackageVersionCVE-2024-6119CVE-2026-42945
libssl33.0.20-1~deb12u1No reportado (corregido por versión)n/a
nginx1.25.5-1~bookworm+echo1n/aReportado 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.


Prueba de compatibilidad

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).

Qué NO se prueba

  • Comportamiento del protocolo HTTP/3 QUIC (solo se verifica la presencia de la bandera --with-http_v3_module; no se envía tráfico UDP/QUIC)
  • Características de rendimiento o latencia bajo carga
  • Todas las directivas de configuración posibles de nginx
  • Comportamiento de módulos dinámicos poco utilizados (GeoIP, image_filter, XSLT) más allá de verificar que los archivos .so están presentes en el disco

Ejecutar:```bash make test

root@kitploit:~
---

## 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.
  • Conffiles registrados con dpkg: /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.
  • postinst crea el usuario/grupo nginx con uid/gid 101 y shell /bin/false (coincidiendo con upstream - verificado en el conjunto de pruebas).
  • Incluye: binario nginx, binario nginx-debug, los 12 módulos .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.

Decisiones de diseño y compensaciones

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Descargar herramienta
CampoValor
Componentenginx ngx_http_rewrite_module
GravedadMedio (clasificación de nginx.org)
Versión basenginx 1.25.5
Corregido ennginx 1.30.1 (publicado el 2026-05-13)
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-42945
Avisohttps://my.f5.com/manage/s/article/K000161019
Upstream CHANGESnginx 1.30.1 CHANGES: "desbordamiento de búfer de memoria dinámica (heap) en el módulo de reescritura"
CategoríaQué se comparaNúmero de aserciones
Metadatos de imagenEntrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels7
Argumentos nginx -VBanderas de configuración idénticas (normalizadas para ruta -ffile-prefix-map)1
Módulos dinámicosTodos los 12 archivos .so de upstream presentes + enlace simbólico /etc/nginx/modules13
Binario nginx-debug--with-debug y --with-http_v3_module presentes en debug -V2
Estructura del sistema de archivos~20 rutas clave, enlaces simbólicos de registro a /dev/stdout y /dev/stderr~20
Configuración de usuario/grupoSalida de getent passwd/group nginx idéntica2
Archivos de configuración dpkgdpkg-query reporta default.conf y nginx.conf como archivos de configuración1
Provides del paquetedpkg -s nginx muestra Provides: nginx-r1.25.51
Binario NJSnjs -v devuelve 0.8.41
Punto de entrada IPv610-listen-on-ipv6-by-default.sh modifica default.conf de forma idéntica1
Plantillas EnvsubstLa sustitución de plantillas NGINX_ENVSUBST produce la misma salida1
Registros de inicioTodas las líneas de registro del entrypoint coinciden con el formato upstream1
HTTP GET/HEAD/POSTCuerpo de respuesta, estado, cabeceras coinciden para múltiples endpoints~10
Solicitud malformadaRespuesta de error TCP sin procesar idéntica1
Servicio de archivos estáticosArchivo montado servido con contenido correcto1
Terminación TLSHTTPS con certificado autofirmado funciona de manera idéntica1
Apagado gracefulSIGQUIT produce salida limpia (código 0)1
Recarga de configuraciónSIGHUP aplica nueva configuración sin reiniciar1
Solicitudes concurrentes50 solicitudes paralelas todas devuelven 2001