
Auditoría de CVE de servidores web consciente de los desencadenantes para nginx y Apache. Va más allá de la coincidencia de versiones al verificar si la ruta de código vulnerable es realmente alcanzable en su configuración. Clasifica los hallazgos como Active / Latent / Unverified. Archivo único de Python 3.5+, sin dependencias.
No preguntes si eres vulnerable. Pregunta si eres explotable.
Una herramienta Python de un solo archivo que audita nginx y Apache contra CVEs conocidos comprobando tanto la versión instalada como si la ruta de código vulnerable es realmente alcanzable a través de tu configuración.
La mayoría de los escáneres de CVE se detienen en la coincidencia de versiones: "nginx 1.18.0 — CVE-2026-42945, gravedad ALTA, eres vulnerable." Pero muchos CVEs requieren un patrón de configuración específico para ser explotables. Un escáner que ignora la configuración te inunda de alertas rojas que no reflejan el riesgo real — y peor aún, puede ocultar los riesgos latentes que se volverían reales si tu configuración cambiara mañana.
web_server_audit responde dos preguntas distintas por cada CVE:
Combinando ambas se obtienen tres clasificaciones honestas:
| Classification | Meaning |
|---|
| 🔴 Riesgo de explotación activa | Versión vulnerable y activador presente. Explotable hoy. |
| 🟡 Riesgo latente | Versión vulnerable, sin activador. Se vuelve explotable si la configuración introduce el patrón. |
| ⚪ No verificado | Configuración ilegible; estado desconocido. |
git clone https://github.com/YOUR_USERNAME/web-server-audit.git
cd web-server-audit
sudo python3 web_server_audit.py
| CVE | Gravedad | Patrón de activación |
|---|---|---|
| CVE-2026-42945 (Rift) | ALTA | rewrite + captura sin nombre ($1,$2) + ? en el reemplazo |
| CVE-2026-42946 | MEDIA | scgi_pass o uwsgi_pass en uso |
| CVE-2026-40701 | MEDIA | ssl_stapling on + resolver juntos |
| CVE-2026-42934 | BAJA | Directivas charset/charset_types/source_charset |
La lista de CVEs de Apache está actualmente vacía pero la estructura está lista — consulta Extensión más abajo.
Además de los CVEs, la herramienta también informa:
/proc/sys/kernel/randomize_va_space) — ASLR completo reduce materialmente la explotabilidad de errores de memoria RCEesm-infra y esm-appsnginx, apache2, systemctl, ss, journalctl cuando están disponibles; omite comprobaciones con elegancia en caso contrario# Compact report (default — hides OK lines)
sudo python3 web_server_audit.py
# All findings including OK lines
sudo python3 web_server_audit.py --verbose
# No ANSI colors (good for pipes, logs, CI output)
sudo python3 web_server_audit.py --no-color
# Machine-readable JSON
sudo python3 web_server_audit.py --json
| Código | Significado |
|---|---|
| 0 | Sin problemas |
| 1 | Solo advertencias o hallazgos críticos no relacionados con CVE |
| 2 | Al menos un CVE es activamente explotable |
El código de salida 2 es una señal natural de fallo en CI/CD.
========================================================================
Web Server Audit - 2026-05-16T01:24:55
Host: web-prod-01
web_server_audit.py v1.0.0 - SiberSAN - MIT License
========================================================================
[system]
------------------------------------------------------------------------
[OK] OK ASLR fully enabled (randomize_va_space=2)
[i] INFO OS: Ubuntu 18.04.6 LTS
[!] WARN Ubuntu 18.04 is in ESM-only support
[nginx] version 1.18.0 (active)
------------------------------------------------------------------------
[i] INFO nginx listening on: 0.0.0.0:80, 0.0.0.0:443
[i] INFO CVE-2026-42945 (HIGH): version vulnerable but NOT triggered
Trigger: rewrite + unnamed capture ($1,$2) + '?' in replacement
Evidence: No rewrite directives in configuration
[i] INFO CVE-2026-42946 (MEDIUM): version vulnerable but NOT triggered
[!] WARN nginx installed from PPA (1.18.0-3ubuntu1+bionic1)
========================================================================
Real-risk summary
------------------------------------------------------------------------
ACTIVE EXPLOITATION RISK: none detected.
LATENT RISK - vulnerable version, no trigger in config (3):
- [nginx] CVE-2026-42945 (HIGH)
- [nginx] CVE-2026-42946 (MEDIUM)
- [nginx] CVE-2026-42934 (LOW)
These become exploitable if config changes introduce the trigger.
Mitigation: config-change discipline + plan upgrade.
========================================================================
Findings: 0 critical, 2 warnings
========================================================================
Añadir un nuevo CVE requiere dos pasos.
1. Escribe una función de activación que recibe el texto completo de configuración (salida de nginx -T) y devuelve (triggered: bool, evidence: str):
def _trigger_my_cve(conf):
hits = [l for l in conf.splitlines() if re.search(r'risky_directive', l)]
if hits:
return True, "Found: " + hits[0]
return False, "Pattern not present"
2. Añade la entrada a NGINX_CVES (o APACHE_CVES):
{
"id": "CVE-XXXX-NNNNN",
"name": "Descriptive name",
"severity": "HIGH",
"affected": ("1.10.0", "1.25.0"),
"fixed_in": ["1.25.1"],
"trigger_desc": "Human-readable trigger description",
"trigger_fn": _trigger_my_cve,
},
Eso es todo. El framework maneja la clasificación, el formateo de salida, JSON, los códigos de salida y el resumen ejecutivo automáticamente.
--verbose para inspeccionar los detalles en caso de duda.Se aceptan pull requests, issues, nuevos detectores de CVE y soporte para servidores web adicionales (lighttpd, Caddy, HAProxy, etc.)
Al proponer un nuevo detector de CVE, por favor incluye:
Publicado bajo la Licencia MIT.
Copyright (c) 2026 SiberSAN