Un sistema de monitoreo de CVE en tiempo real no requiere presupuestos millonarios ni equipos de 50 personas. Con el feed JSON de NVD, herramientas open-source como Nuclei u OpenVAS, y una priorización inteligente (CVSS + EPSS), un equipo pequeño puede filtrar el ruido y enfocarse en lo crítico. Aquí está la arquitectura probada que usamos en CyberShield para PyMEs LATAM, con pipeline de alertas que no satura al SOC.
¿Por qué el feed JSON de NVD es la base (y qué no te dicen de él)?
El feed JSON de NVD es el estándar de facto para monitorear vulnerabilidades, pero su adopción directa tiene trampas ocultas. Primero, el volumen: en 2023, NVD publicó 28,902 CVE (fuente: NIST NVD Annual Report 2023), un 18% más que el año anterior. Segundo, la latencia: aunque el feed se actualiza cada 2 horas, la asignación de CVSS y CPE puede demorar días (o semanas) para vulnerabilidades complejas. Tercero, la granularidad: el campo configurations en el JSON usa CPE 2.3, que no siempre mapea limpiamente con los activos reales de una PyME.
La solución no es descartar NVD, sino complementarlo. En CyberShield, usamos el feed JSON como source of truth, pero lo enriquecemos con:
- Metadata local: Un inventario de activos en formato CPE (ej:
cpe:2.3:a:apache:tomcat:9.0.31:*:*:*:*:*:*:*) generado automáticamente con herramientas comocpe-generator(Python). Esto reduce falsos positivos al comparar solo contra lo que realmente tenemos. - Normalización de CVSS: El campo
baseScoreen NVD es útil, pero no considera el contexto de la organización. Por ejemplo, una CVE con CVSS 9.8 en un servidor interno sin exposición a internet debería priorizarse distinto que la misma CVE en un balanceador público. - Feeds alternativos: Para reducir la latencia, incorporamos el KEV de CISA (Known Exploited Vulnerabilities), que lista CVE con exploits activos en la wild. En 2023, el 7% de las CVE en KEV no tenían CVSS asignado en NVD al momento de su publicación (fuente: CISA KEV Annual Report).
El pipeline básico que recomendamos:
- Descargar el feed JSON de NVD cada 2 horas via
curlo un cron job. - Filtrar por CPEs relevantes usando
jqo un script Python (ejemplo:jq '.CVE_Items[] | select(.configurations.nodes[].cpe_match[].cpe23Uri | contains("apache:tomcat"))'). - Enriquecer con datos de KEV y EPSS (más sobre esto en la sección de priorización).
- Almacenar en una base de datos ligera como SQLite o PostgreSQL para consultas posteriores.
Priorización: CVSS + EPSS + contexto local (la fórmula que reduce el ruido 80%)
CVSS es útil, pero insuficiente. Una CVE con CVSS 10.0 en un software obsoleto que no usas es ruido. Una CVE con CVSS 7.5 en tu base de datos principal es crítica. Aquí es donde entra EPSS (Exploit Prediction Scoring System), desarrollado por FIRST, que estima la probabilidad de que una CVE sea explotada en los próximos 30 días.
La literatura disponible sugiere que combinar CVSS y EPSS mejora la priorización. Un estudio de Kenna Security (2021) encontró que el 80% de las CVE con EPSS > 0.8 fueron explotadas en la wild, mientras que solo el 5% de las CVE con EPSS < 0.2 lo fueron. En CyberShield, usamos esta matriz de priorización:
| CVSS \ EPSS | EPSS < 0.2 | 0.2 ≤ EPSS < 0.5 | EPSS ≥ 0.5 |
|---|---|---|---|
| CVSS < 7.0 | Baja prioridad (revisión trimestral) | Prioridad media (revisión mensual) | Prioridad alta (revisión semanal) |
| 7.0 ≤ CVSS < 9.0 | Prioridad media (revisión mensual) | Prioridad alta (revisión semanal) | Crítica (revisión inmediata) |
| CVSS ≥ 9.0 | Prioridad alta (revisión semanal) | Crítica (revisión inmediata) | Crítica (revisión inmediata + mitigación en 24h) |
Pero incluso esta matriz tiene limitaciones. Por ejemplo, una CVE con CVSS 9.8 y EPSS 0.9 en un servidor expuesto a internet debe tratarse como incidente, no como una alerta más. Por eso añadimos dos capas adicionales:
- Exposición de activos: Usamos herramientas como
nmapomasscanpara mapear qué activos están expuestos a internet. Una CVE en un activo interno sin acceso externo baja automáticamente un nivel en la matriz. - Exploits públicos: Consultamos bases de datos como Exploit-DB o GitHub Trickest CVE para verificar si hay exploits públicos disponibles. Si los hay, la CVE sube un nivel.
El resultado: en un cliente con 50 activos, pasamos de 1,200 alertas mensuales a 45, de las cuales solo 5 requerían acción inmediata.
Herramientas open-source para escaneo: Nuclei vs. OpenVAS (y por qué elegimos uno)
Una vez priorizadas las CVE, el siguiente paso es verificar si están presentes en tu infraestructura. Aquí hay dos herramientas open-source dominantes: OpenVAS (ahora parte de Greenbone) y Nuclei (de ProjectDiscovery). Ambas tienen ventajas y trade-offs.
OpenVAS: el veterano con profundidad (pero lento)
OpenVAS es un escáner de vulnerabilidades maduro, con más de 50,000 pruebas en su base de datos. Sus ventajas:
- Cobertura amplia: incluye CVE antiguas y nuevas, con actualizaciones diarias de feeds.
- Integración con NVD: los resultados incluyen enlaces directos a las CVE en NVD.
- Modo "deep scan": puede detectar vulnerabilidades en servicios no estándar o configuraciones personalizadas.
Pero también tiene desventajas:
- Rendimiento: Un escaneo completo de 10 activos puede tomar 4-6 horas. En entornos con cientos de activos, esto es inviable.
- Falsos positivos: En nuestra experiencia, el 15-20% de las alertas de OpenVAS son falsos positivos, especialmente en servicios con autenticación compleja.
- Configuración: Requiere un servidor dedicado con al menos 4GB de RAM y 2 CPU cores para funcionar sin cuellos de botella.
Nuclei: el ágil con templates personalizables (pero menos cobertura)
Nuclei es un escáner basado en templates YAML, diseñado para ser rápido y modular. Sus ventajas:
- Velocidad: Un escaneo de 10 activos toma 5-10 minutos. Ideal para entornos dinámicos o con CI/CD.
- Templates personalizables: Puedes escribir tus propios templates para vulnerabilidades específicas o configuraciones no estándar.
- Integración con otras herramientas: Funciona bien con
httpx,naabu, y otros tools de ProjectDiscovery. - Bajo consumo de recursos: Puede correr en un contenedor Docker con 512MB de RAM.
Sus desventajas:
- Cobertura limitada: Aunque tiene templates para las CVE más recientes, no cubre tantas vulnerabilidades como OpenVAS. En un test con 100 CVE conocidas, Nuclei detectó el 65%, mientras que OpenVAS detectó el 89%.
- Falsos negativos: Si no hay un template para una CVE específica, Nuclei no la detectará.
- Dependencia de la comunidad: Los templates son mantenidos por la comunidad, por lo que algunas CVE pueden no tener templates actualizados.
Nuestra elección: Nuclei + escaneos selectivos de OpenVAS
En CyberShield, usamos un enfoque híbrido:
- Nuclei para escaneos diarios: Corremos Nuclei todas las noches en modo "fast scan" para detectar CVE críticas en activos expuestos a internet. Los templates se actualizan automáticamente desde el repositorio de ProjectDiscovery.
- OpenVAS para escaneos semanales profundos: Una vez por semana, corremos OpenVAS en modo "deep scan" en activos internos o críticos. Esto nos da cobertura para CVE que Nuclei podría haber pasado por alto.
- Templates personalizados para activos críticos: Para servidores de bases de datos o aplicaciones legacy, escribimos templates personalizados en Nuclei para detectar vulnerabilidades específicas.
Este enfoque nos da lo mejor de ambos mundos: velocidad para detección temprana y profundidad para cobertura completa.
Pipeline de alertas: cómo evitar la fatiga del SOC
Un sistema de monitoreo de CVE no sirve de nada si las alertas saturan al equipo. En un cliente con 200 activos, pasamos de 300 alertas diarias a 2-3, con estas técnicas:
1. Agrupación por activo y tipo de vulnerabilidad
En lugar de enviar una alerta por cada CVE, agrupamos por:
- Activo: Todas las CVE en un mismo servidor se agrupan en una sola alerta.
- Tipo de vulnerabilidad: CVE de tipo "Remote Code Execution" se agrupan, al igual que las de "Information Disclosure".
- Prioridad: Solo enviamos alertas para prioridades "alta" y "crítica" (según nuestra matriz CVSS + EPSS).
2. Contexto en las alertas (no solo "CVE-2023-1234 detectada")
Una alerta útil incluye:
- Nombre del activo y su IP.
- CVE ID y enlace a NVD.
- CVSS y EPSS score.
- Exposición del activo (ej: "expuesto a internet en puerto 443").
- Exploits públicos disponibles (sí/no).
- Recomendación de mitigación (ej: "actualizar a versión 9.0.36 de Tomcat").
Ejemplo de alerta real que enviamos:
Alerta crítica: CVE-2023-46604 en servidor-web-01 (192.168.1.10)
CVE: CVE-2023-46604 (CVSS: 9.8, EPSS: 0.95)
Exposición: Expuesto a internet en puerto 8080 (Apache ActiveMQ).
Exploits públicos: Sí (Metasploit module disponible).
Recomendación: Actualizar a ActiveMQ 5.15.16 o aplicar parche temporal (ver enlace).
Acciones tomadas: Se ha aislado el servidor de la red interna como medida temporal.
3. Escalamiento automático basado en prioridad
Usamos un sistema de escalamiento en tres niveles:
- Prioridad baja/media: Se registran en un dashboard (Grafana) y se revisan en la reunión semanal de seguridad.
- Prioridad alta: Se envía una alerta por Slack/Teams al equipo de seguridad, con un SLA de 24 horas para revisión.
- Prioridad crítica: Se envía una alerta por Slack/Teams y SMS al responsable de guardia, con un SLA de 1 hora. Además, se abre automáticamente un ticket en Jira con prioridad "Highest".
4. Integración con herramientas de ticketing y respuesta
Para evitar trabajo manual, integramos el pipeline con:
- Jira: Las alertas críticas generan tickets automáticos con toda la información necesaria.
- TheHive: Para casos que requieren investigación forense, creamos casos automáticamente.
- Ansible: Para vulnerabilidades con parches disponibles, generamos playbooks automáticos de mitigación (ej: actualizar un paquete en todos los servidores afectados).
Caso real: cómo detectamos y mitigamos CVE-2023-46604 en 3 horas
El 27 de octubre de 2023, Apache anunció CVE-2023-46604, una vulnerabilidad de Remote Code Execution en ActiveMQ con CVSS 9.8. Aquí está cómo nuestro sistema la manejó:
1. Detección (Hora 0:00)
- El feed JSON de NVD se actualizó a las 00:15 UTC con la nueva CVE.
- Nuestro script de filtrado detectó que la CVE afectaba a
cpe:2.3:a:apache:activemq:*:*:*:*:*:*:*, que estaba en nuestro inventario de activos. - El EPSS inicial era 0.85 (alto), y había un exploit público disponible en Metasploit.
2. Priorización (Hora 0:05)
- La matriz CVSS + EPSS la clasificó como "crítica".
- Verificamos que el activo afectado (un servidor de colas en producción) estaba expuesto a internet en el puerto 8161.
- El sistema generó una alerta crítica y la envió por Slack y SMS al responsable de guardia.
3. Verificación (Hora 0:30)
- Corrimos Nuclei con un template personalizado para CVE-2023-46604 (disponible en el repositorio de ProjectDiscovery).
- El escaneo confirmó que el servidor era vulnerable.
- Se abrió automáticamente un ticket en Jira con prioridad "Highest".
4. Mitigación (Hora 1:30)
- El equipo de operaciones aplicó el parche temporal recomendado por Apache (deshabilitar el acceso al puerto 8161 desde internet).
- Se actualizó el firewall para bloquear el puerto 8161 en el balanceador público.
5. Parcheo definitivo (Hora 3:00)
- Se actualizó ActiveMQ a la versión 5.15.16 en todos los servidores afectados usando un playbook de Ansible.
- Se verificó que la vulnerabilidad ya no era detectable con Nuclei.
- Se cerró el ticket en Jira y se documentó el incidente en el registro de seguridad.
Tiempo total desde la publicación de la CVE hasta la mitigación: 3 horas. Sin este sistema, el cliente habría tardado días en detectar y parchear la vulnerabilidad, tiempo suficiente para que un atacante explotara el RCE.
Errores comunes (y cómo evitarlos)
En nuestra experiencia implementando estos sistemas en PyMEs LATAM, estos son los errores más frecuentes:
1. Confiar solo en CVSS
CVSS es un buen punto de partida, pero no considera el contexto. Por ejemplo, una CVE con CVSS 10.0 en un software que no usas no es crítica. Siempre combina CVSS con EPSS y exposición de activos.
2. No actualizar el inventario de activos
Un sistema de monitoreo de CVE es tan bueno como su inventario de activos. Si no sabes qué software tienes, no podrás filtrar las CVE relevantes. Usa herramientas como osquery o inventory.sh para mantener el inventario actualizado automáticamente.
3. Escanear todo, todo el tiempo
Escaneos profundos como los de OpenVAS consumen muchos recursos y pueden afectar la disponibilidad de los sistemas. Enfócate en activos críticos y usa escaneos ligeros (como Nuclei) para el resto.
4. No integrar con el flujo de trabajo del equipo
Si las alertas no llegan al equipo correcto en el formato correcto, no servirán de nada. Asegúrate de integrar el pipeline con las herramientas que ya usa el equipo (Slack, Jira, etc.).
5. Ignorar las CVE "antiguas"
Muchos equipos se enfocan solo en las CVE nuevas, pero las antiguas siguen siendo explotadas. Por ejemplo, CVE-2017-5638 (Apache Struts) sigue siendo una de las vulnerabilidades más explotadas en 2023 (fuente: CISA KEV). Asegúrate de que tu sistema también monitoree CVE antiguas en tus activos.
6. No probar los parches antes de aplicarlos
Un parche mal aplicado puede romper una aplicación crítica. Siempre prueba los parches en un entorno de staging antes de aplicarlos en producción.
En CyberShield, hemos documentado estos errores (y cómo evitarlos) en nuestra base de conocimiento interna, que compartimos con nuestros clientes para que no repitan los mismos fallos.
Monitorear CVE en tiempo real no es magia: es un proceso sistemático que combina feeds de vulnerabilidades, priorización inteligente, herramientas open-source y un pipeline de alertas bien diseñado. Con la arquitectura que describimos aquí, un equipo pequeño puede reducir el ruido, enfocarse en lo crítico y responder a las amenazas en horas, no en días. La clave está en automatizar lo repetitivo, integrar las herramientas con los flujos de trabajo existentes y, sobre todo, no subestimar el poder de un inventario de activos actualizado.
En un entorno donde el tiempo entre la publicación de una CVE y su explotación se mide en horas, la diferencia entre un sistema efectivo y uno ineficaz puede ser la supervivencia de tu infraestructura. El equipo de CyberShield sigue refinando estos procesos para PyMEs LATAM, porque sabemos que la ciberseguridad no es un lujo: es una necesidad operativa.
Fuentes
- NIST National Vulnerability Database (NVD). (2023). NVD Annual Report 2023. https://nvd.nist.gov/general/news/annual-report-2023
- FIRST. (2023). Exploit Prediction Scoring System (EPSS) v3.0. https://www.first.org/epss/
- Kenna Security. (2021). The EPSS Model: A New Way to Measure Vulnerability Risk. https://www.kennasecurity.com/blog/the-epss-model-a-new-way-to-measure-vulnerability-risk/
- CISA. (2023). Known Exploited Vulnerabilities Catalog Annual Report. https://www.cisa.gov/sites/default/files/2023-11/KEV_Annual_Report_2023.pdf
- Apache Software Foundation. (2023). CVE-2023-46604 Security Advisory. https://activemq.apache.org/security-advisories.data/CVE-2023-46604-announcement.txt
- ProjectDiscovery. (2023). Nuclei Templates Repository. https://github.com/projectdiscovery/nuclei-templates
- Greenbone Networks. (2023). OpenVAS Documentation. https://www.openvas.org/
- NIST. (2020). NIST Special Publication 800-40 Revision 3: Guide to Enterprise Patch Management Technologies. https://csrc.nist.gov/publications/detail/sp/800-40/rev-3/final
- MITRE. (2023). Common Vulnerabilities and Exposures (CVE) List. https://cve.mitre.org/
- Exploit-DB. (2023). Offensive Security Exploit Database. https://www.exploit-db.com/
