# Vulnerabilidades

> Cómo escanea InfraWard, cómo guarda los SBOM, cómo ordena las vulnerabilidades por riesgo real y cómo leer y filtrar los resultados.

## Cómo se escanea

1. Después de cada recolección (o a petición), el worker genera un **SBOM CycloneDX** con Trivy:
   - **Servidores y CT**: InfraWard copia las bases de datos de paquetes (dpkg, apk, rpm) a través del ayudante restringido y Trivy las lee en el worker. No se instala nada en el servidor.
   - **Imágenes de contenedor**: la imagen se exporta con `docker save` (o `podman save` en los hosts con Podman) y se analiza en el worker. Las imágenes nunca se ejecutan. Las que pasan de 4 GiB (`TRIVY_MAX_IMAGE_SIZE`) o tardan más de 15 minutos (`TRIVY_SCAN_TIMEOUT`) quedan como no escaneadas, con el motivo.
2. El SBOM se guarda. Cada 24 horas (`SBOM_REEVALUATE_INTERVAL`), los SBOM guardados se vuelven a evaluar con la última base de datos de Trivy, sin conectarse a ninguna máquina. Un CVE publicado hoy aparece mañana en los assets afectados aunque no se haya vuelto a escanear nada.
3. CISA KEV y FIRST EPSS se descargan cada 12 horas (`VULN_INTEL_INTERVAL`).
4. Cada hallazgo recibe una puntuación de prioridad.

La base de datos de Trivy se descarga como mucho cada 12 horas (`TRIVY_DB_MAX_AGE`), por una sola réplica, y todas la comparten a través de `data/worker`.

## Prioridad

Cada hallazgo recibe una puntuación de 0 a 100 que se calcula con:

| Factor | Efecto |
|---|---|
| Puntuación base CVSS (o la severidad si no hay CVSS) | Base: CVSS × 4 |
| Está en CISA KEV (se explota activamente) | +30 |
| Probabilidad EPSS | +15 (≥ 50 %), +10 (≥ 10 %), +4 (≥ 1 %) |
| Hay parche disponible | +5 |
| El paquete pertenece a un proceso en marcha, o la imagen tiene contenedores en marcha | +5 |
| El proceso o el contenedor escucha en una dirección que no es de loopback | +10 |
| Un nombre de dominio público apunta al asset | +10 |
| Imagen sin ningún contenedor que la use | × 0,5 |

Franjas: **Urgente** a partir de 70, **Alta** a partir de 50, **Media** a partir de 30 y **Baja** por debajo. Cada hallazgo guarda sus motivos, así que la lista dice por qué es urgente: *en KEV · EPSS 92 % · expuesto en 22 (sshd) · parche disponible*.

Un hallazgo crítico que está en KEV y expuesto genera una notificación inmediata (la campana de la barra superior y, si los has configurado, los [canales de alertas](/es/docs/initial-setup.md#7-configura-las-alertas-opcional)). El resto aparece en el panel.

### Ruido

Algunos hallazgos se apartan de la vista principal, con su motivo, porque rara vez requieren acción:

- **Kernel no en uso**: CVE de kernels instalados que no son el que está arrancado, y de las cabeceras y herramientas del kernel. En los servidores de la familia RHEL, dnf conserva los kernels anteriores y Trivy informa, para cada uno de sus paquetes, de todos los CVE corregidos desde entonces. Estos hallazgos no cuentan en los resúmenes del asset, del árbol del inventario, de los proyectos ni del panel; el resumen del asset indica cuántos se han dejado fuera.
- **Sin corrección prevista**: hallazgos que la distribución marca como `will_not_fix` o `fix_deferred`. Un CVE que está en KEV nunca se oculta por este motivo.
- **Imágenes sin uso**: los hallazgos de imágenes sin contenedores no cuentan como accionables.

**Incluir lo oculto** y **Ver todas** los vuelven a mostrar.

## La lista de vulnerabilidades

**Vulnerabilidades** muestra una fila por CVE, ordenadas por prioridad, con sus motivos, la severidad, los paquetes afectados, a cuántos assets afecta y si hay parche.

[Captura: Lista de vulnerabilidades ordenada por prioridad, con los motivos KEV, EPSS y exposición]

- La cabecera muestra la fecha de cada fuente (KEV, EPSS, Trivy) y se pone en ámbar si una fuente ha fallado o tiene más de tres días. Ábrela para ver el detalle y actualizar KEV y EPSS a mano.
- **CVE nuevos desde tu última visita** enumera lo que ha aparecido desde que abriste la página por última vez.
- Filtros: estado, prioridad mínima, severidad, EPSS, proyecto, **Solo en KEV**, **Expuestas**, **Solo con parche**. El buscador admite IDs de CVE, nombres de paquete y filtros como `prioridad:urgente tag:prod`.
- **Exportar** descarga la vista actual en CSV o JSON.
- El buscador global de la barra superior también encuentra CVE y paquetes: *¿qué está afectado por CVE-2024-3094?* está a una búsqueda.

## Detalle de un CVE

Al pulsar un CVE se abre su página: descripción, CVSS de cada fuente, CWE, fechas de publicación, estado en KEV con el plazo de CISA, percentil EPSS, referencias y todos los assets afectados con el paquete, los puertos expuestos y una acción sugerida.

[Captura: Detalle de CVE-2023-44487: en KEV, EPSS 100 %, assets afectados y puertos expuestos]

**Re-escanear afectados** encola un escaneo de todos los assets afectados, útil después de parchear. Junto a él está **Aceptar el riesgo**; consulta [más abajo](#aceptar-el-riesgo).

## Vista por asset

La pestaña **Vulnerabilidades** de cada asset lista sus hallazgos con la misma prioridad. Por defecto muestra los CRITICAL y HIGH abiertos que tienen parche y oculta el ruido, como la lista principal, indicando cuántos hallazgos ha dejado fuera. Cambia los filtros, o marca **Incluir lo oculto**, para verlo todo.

[Captura: Pestaña Vulnerabilidades de un host Docker]

## Aceptar el riesgo

Cuando una vulnerabilidad no necesita corregirse ahora (no es explotable en tu entorno, está mitigada, aún no hay parche), acepta su riesgo en lugar de dejarla abierta:

- Desde la ficha del CVE: **Aceptar el riesgo** para todos los assets afectados, o **Aceptar** junto a un paquete de un asset.
- Desde la lista de vulnerabilidades: selecciona CVE y usa **Aceptar el riesgo** en la barra de lote. Con un proyecto elegido, solo se aplica a los assets de ese proyecto.

El diálogo pide un **Motivo** (de 10 a 1000 caracteres, obligatorio) y, opcionalmente, una **Fecha de caducidad** (como mucho a un año vista).

- Los hallazgos aceptados dejan de contar como abiertos, pero siguen apareciendo como afectados, con el estado **Aceptado** y quién lo aceptó, cuándo y por qué.
- Al llegar la fecha de caducidad, el hallazgo se reabre solo y se envía una notificación.
- Si un escaneo posterior ya no ve la vulnerabilidad, el hallazgo pasa a corregido.
- **Reabrir aceptados**, en la ficha del CVE, deshace la aceptación.

Aceptar y reabrir quedan en la auditoría y exigen el permiso `findings.accept` (Admin y Editor).

## Excluir assets del escaneo

Usa la política de inventario (global, por etiqueta, por proyecto o por asset) para desactivar el escaneo o excluir tipos de asset, patrones de nombre como `bitnami/*` o assets concretos. Lo excluido sigue en el inventario. Los volúmenes y las redes no se escanean nunca. Consulta [Configuración inicial](/es/docs/initial-setup.md#4-revisa-la-política-de-inventario).

## Redes restringidas

| Fuente | URL por defecto | Sin acceso a Internet |
|---|---|---|
| Base de datos de Trivy | Registros públicos de Trivy (`mirror.gcr.io`, `ghcr.io`) | Imprescindible. Sin ella no hay escaneos. |
| CISA KEV | `https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json` | Apunta `KEV_URL` a un espejo o déjala vacía para desactivarla. |
| FIRST EPSS | `https://epss.empiricalsecurity.com/epss_scores-current.csv.gz` | Apunta `EPSS_URL` a un espejo o déjala vacía para desactivarla. |

Si falla una descarga de KEV o EPSS, se conservan los datos anteriores y la fuente muestra el error en la cabecera.

---

Página HTML: https://infraward.net/es/docs/vulnerabilities/
