Inteligencia de vulnerabilidades
Leer un CVE: lo que dice un registro CVE y lo que no dice
Un registro CVE nombra la falla y apunta al proveedor, que es quien define la versión corregida.
Qué significa una puntuación CVSS como 9.8, cómo se construyen las vector strings de v4.0 y v3.1 y cómo decodificar y recalcular una a mano.
CVSS es el sistema de puntuación detrás de la mayoría de las puntuaciones de vulnerabilidades que se publican. Vas a ver un número entre 0.0 y 10.0, una palabra de severidad como "Critical" y una cadena larga que parece un número de serie. Este artículo explica qué significa cada parte, cómo leer la cadena campo por campo y cómo comprobar por tu cuenta una puntuación publicada.
CVSS son las siglas de Common Vulnerability Scoring System. Lo mantiene FIRST, el Forum of Incident Response and Security Teams. La versión actual es la 4.0, publicada a finales de 2023. La versión 3.1 sigue apareciendo en la mayoría de los avisos antiguos y en la base de datos de la NVD, así que conviene saber leer las dos.
CVSS asigna a una falla una puntuación de 0.0 a 10.0. La puntuación sale de las propiedades de la falla: qué tan difícil es llegar a ella, qué necesita el atacante antes de empezar y cuánto daño puede causar si alguien la usa. La mayoría de las herramientas convierten el número en una calificación:
| Calificación | Rango de puntuación |
|---|---|
| None | 0.0 |
| Low | 0.1 a 3.9 |
| Medium | 4.0 a 6.9 |
| High | 7.0 a 8.9 |
| Critical | 9.0 a 10.0 |
Las calificaciones son las mismas en la v3.1 y en la v4.0. La cuenta que hay detrás del número sí cambia.
Los equipos necesitan una forma común de hablar de la severidad. El proveedor publica un aviso, un escáner marca un activo, un gerente pregunta qué parche va primero, y todos deberían entender lo mismo cuando dicen "high". CVSS ofrece esa escala común. La vector string también registra el razonamiento, así que quien lee puede comprobar si la puntuación encaja con su propio sistema.
La puntuación tiene límites, y la mayoría de los errores vienen de ignorarlos. La sección sobre severidad y probabilidad trata el principal.
CVSS v4.0 organiza sus métricas en cuatro grupos. Solo el grupo base es necesario para obtener una puntuación.
Las métricas base describen la falla tal como existe en el software vulnerable, sin conocer tu red. Los avisos casi siempre las publican. En la v4.0 cubren:
Las métricas de amenaza cambian con el tiempo. La métrica de amenaza de la v4.0 es la E, de exploit maturity (madurez del exploit). Puede ser A (atacada, es decir, hay evidencia de explotación), P (existe una prueba de concepto), U (no reportada) o X (no definida, que es el valor por defecto). Una puntuación con E definida puede diferir de la puntuación base, y cambia cuando cambia el panorama de amenazas.
Las métricas ambientales describen tu propio despliegue. Las métricas de requisito (CR, IR y AR, para confidencialidad, integridad y disponibilidad) indican cuánto te importa cada propiedad. Las métricas base modificadas te permiten sustituir un valor base cuando tu configuración lo cambia. Una falla en una página de login expuesta a internet y la misma falla en una VM de laboratorio sin ruta a la red pueden compartir la puntuación base y, aun así, merecer prioridades distintas en tu entorno.
Las métricas suplementarias añaden contexto, como el impacto en la seguridad física, la posibilidad de automatizar, el esfuerzo de recuperación o la urgencia. No cambian la puntuación. Ayudan al equipo a ordenar el trabajo.
La versión 3.1 usa los grupos Base, Temporal y Ambiental. No tiene grupo suplementario, y sus métricas temporales (madurez del código de explotación, nivel de remediación y confianza del informe) son distintas de la métrica E única de la v4.0.
La vector string es la forma compacta de las métricas. Empieza con la versión y luego lista cada métrica como Nombre:Valor, separadas por barras. Cada valor es una sola letra. Cuando conoces las letras, puedes leer cualquier cadena sin una tabla.
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:NDecodifícala campo por campo:
| Campo | Valor | Significado |
|---|---|---|
| CVSS | 4.0 | Versión de la especificación |
| AV | N | Vector de ataque: red. Los otros valores son A (adyacente), L (local) y P (físico). |
| AC | L | Complejidad del ataque: baja. El otro valor es H. |
| AT | N | Requisitos del ataque: ninguno. El otro valor es P (presente), para condiciones como una ventana de carrera o una configuración de despliegue concreta. |
| PR | N | Privilegios requeridos: ninguno. Los otros son L (bajos) y H (altos). |
| UI | N | Interacción del usuario: ninguna. Los otros son P (pasiva) y A (activa). |
| VC | H | Impacto en la confidencialidad del sistema vulnerable: alto. Los otros son L y N. |
| VI | H | Impacto en la integridad del sistema vulnerable: alto. |
| VA | H | Impacto en la disponibilidad del sistema vulnerable: alto. |
| SC | N | Impacto en la confidencialidad de sistemas subsiguientes: ninguno. Los otros son L y H. |
| SI | N | Impacto en la integridad de sistemas subsiguientes: ninguno. |
| SA | N | Impacto en la disponibilidad de sistemas subsiguientes: ninguno. |
En palabras simples: alguien en la red puede explotar esto sin iniciar sesión, sin una configuración especial y sin que la víctima tenga que hacer nada. El ataque da control total sobre la confidencialidad, la integridad y la disponibilidad del componente vulnerable, y nada más allá de él. La calculadora de FIRST devuelve una puntuación base de 9.3 (Critical) para este vector. El laboratorio de más abajo muestra cómo comprobarlo.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:HLos campos de la v3.1 son parecidos, con tres diferencias. No existe el campo AT. Los campos de impacto son C, I y A, sin separar el sistema vulnerable de los sistemas subsiguientes. Y aparece S (alcance) en su lugar:
| Campo | Valor | Significado |
|---|---|---|
| AV | N | Vector de ataque: red. Los otros son A, L y P. |
| AC | L | Complejidad del ataque: baja. El otro valor es H. |
| PR | N | Privilegios requeridos: ninguno. Los otros son L y H. |
| UI | N | Interacción del usuario: ninguna. El otro valor es R (requerida). |
| S | C | Alcance cambiado: la explotación puede afectar a un componente más allá del que contiene la falla. U significa sin cambio. |
| C | H | Confidencialidad: alta. Los otros son L y N. |
| I | H | Integridad: alta. |
| A | H | Disponibilidad: alta. |
El campo S explica buena parte de la diferencia entre 9.8 y 10.0 que aparece más adelante en este artículo.
Los cambios son estructurales, así que leer la puntuación de una versión como si viniera de la otra provoca errores.
Los avisos siguen mezclando versiones. Algunos publican la puntuación de la v3.1 y la de la v4.0 para la misma falla, y los dos números pueden diferir. Revisa el prefijo antes de comparar dos números.
Este es el punto más importante, y el que más gente se salta. CVSS mide qué tan grave es una falla si se explota. No te dice si alguien la va a explotar.
Una falla con puntuación base Critical puede quedar sin explotar durante años. Una falla Medium puede estar bajo ataque activo esta semana. CVSS no lo ve. El grupo de amenaza puede llevar algo de información de explotación (E con valor A, por ejemplo), pero alguien tiene que definirlo y mantenerlo al día. Otras fuentes responden a la pregunta de probabilidad:
Si necesitas decidir qué parchear primero, lee severidad, probabilidad y exposición juntas. Una puntuación CVSS alta en un sistema al que nadie puede llegar suele ser menos urgente que una puntuación media en una página de login pública con explotación reportada.
Para los conceptos básicos sobre qué es una vulnerabilidad y cómo recibe un identificador, lee qué es una vulnerabilidad y qué es un identificador CVE.
Necesitas una terminal y un navegador. El laboratorio usa solo datos públicos. Consulta la API pública de la NVD y el sitio de FIRST, y nada más.
La API de la NVD devuelve las puntuaciones que la NVD guarda para un CVE. Para el CVE-2021-44228, la falla Log4Shell de Apache Log4j, ejecuta:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' | jq -r '.vulnerabilities[0].cve.metrics | .. | .vectorString? // empty'El filtro recorre todo el objeto metrics e imprime cada vectorString que encuentra. En la máquina donde se comprobó este artículo, jq no estaba instalado. El mismo recorrido se ejecutó con Node 24. Usa esta alternativa si no tienes jq:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' -o nvd_44228.json
node -e "const j=JSON.parse(require('fs').readFileSync('nvd_44228.json','utf8'));const out=[];(function walk(n){if(n&&typeof n==='object'){for(const[k,v]of Object.entries(n)){if(k==='vectorString')out.push(v);else walk(v);}}})(j.vulnerabilities[0].cve.metrics);console.log(out.join('\n'));"Salida observada el 8 de noviembre de 2026:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
AV:N/AC:M/Au:N/C:C/I:C/A:CLas dos primeras líneas son el vector v3.1 del propio registro de la NVD y de un segundo registro que la NVD también lista. La tercera línea es un vector CVSS v2.0, una escala más antigua. Ignórala en este laboratorio. La NVD puede actualizar el registro, así que tu salida podría ser distinta.
Toma la primera línea y completa una tabla como las de arriba. Anota cada campo y su significado antes de abrir la calculadora. Dos preguntas ayudan:
El campo que merece una segunda mirada es S:C. Significa que la explotación llega más allá del componente que contiene la falla. Por eso este vector puntúa más alto que el mismo vector con S:U.
Abre la calculadora de la versión que aparece en tu cadena. Para la v3.1, usa https://www.first.org/cvss/calculator/3.1. Para la v4.0, usa https://www.first.org/cvss/calculator/4.0. Puedes pegar el vector después del # de la URL para rellenar el formulario.
Para el ejemplo de v4.0 de antes, abre este enlace:
https://www.first.org/cvss/calculator/4.0#CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:NLa calculadora debería devolver una puntuación base de 9.3 (Critical) para este vector. No lo ejecuté en un navegador al escribir el texto, así que toma el 9.3 como el valor que debes confirmar. Si no coincide, compara cada letra del formulario con tu tabla decodificada.
Para el vector v3.1 de la NVD, abre la calculadora v3.1 y ajusta cada valor para que coincida con tu tabla. La puntuación esperada es 10.0. Si el formulario queda vacío después de cargar la página, selecciona los valores a mano, lo que ya es una buena comprobación por sí misma.
Para la v3.1, la fórmula base cabe en unas pocas líneas. Este script sigue la especificación de la v3.1. Sirve para comprobar tu comprensión, no para producción. Guárdalo como cvss31.js:
// CVSS v3.1 base score, following the FIRST v3.1 specification.
function roundup(x) {
const i = Math.round(x * 100000);
return i % 10000 === 0 ? i / 100000 : (Math.floor(i / 10000) + 1) / 10;
}
function base(vec) {
const m = Object.fromEntries(vec.split('/').slice(1).map(p => p.split(':')));
const S = m.S === 'C';
const AV = { N: 0.85, A: 0.62, L: 0.55, P: 0.2 }[m.AV];
const AC = { L: 0.77, H: 0.44 }[m.AC];
const PR = { N: 0.85, L: S ? 0.68 : 0.62, H: S ? 0.5 : 0.27 }[m.PR];
const UI = { N: 0.85, R: 0.62 }[m.UI];
const cia = { H: 0.56, L: 0.22, N: 0 };
const iss = 1 - (1 - cia[m.C]) * (1 - cia[m.I]) * (1 - cia[m.A]);
const imp = S ? 7.52 * (iss - 0.029) - 3.25 * Math.pow(iss - 0.02, 15) : 6.42 * iss;
const expl = 8.22 * AV * AC * PR * UI;
if (imp <= 0) return 0;
return S ? roundup(Math.min(1.08 * (imp + expl), 10)) : roundup(Math.min(imp + expl, 10));
}
for (const v of process.argv.slice(2)) console.log(v, '->', base(v).toFixed(1));Ejecútalo con el vector de la NVD y con el mismo vector con el alcance vuelto a sin cambio:
node cvss31.js "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H" "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"Salida observada el 8 de noviembre de 2026:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H -> 10.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H -> 9.8La primera línea coincide con la puntuación 10.0 de la NVD. La segunda muestra el 9.8 que mucha gente recuerda para esta falla. El único cambio es S:U. Cuando veas una puntuación, lee su vector antes de fiarte del número.
Si tu tabla decodificada, la calculadora y el script coinciden, ya sabes leer una cadena CVSS. Si no coinciden, busca el campo que difiere. Las causas habituales son una letra equivocada (AV:L significa local, no baja), confundir C, I y A, o comparar una puntuación v3.1 con una v4.0 como si ambas estuvieran en la misma escala.
Lee primero las definiciones de las métricas base en la especificación. Son cortas, y la redacción exacta de cada valor es donde están las respuestas. Luego decodifica en papel cinco o seis vectores publicados antes de comprobar cada uno en la calculadora. Elige algunos con S:C o AT:P y observa cómo se mueve la puntuación.
Después, lee sobre el lado de la explotación: qué estima EPSS y qué registra el catálogo KEV. Esas dos fuentes responden a la pregunta que CVSS deja abierta, que es si alguien está atacando esta falla ahora mismo.
Inteligencia de vulnerabilidades
Un registro CVE nombra la falla y apunta al proveedor, que es quien define la versión corregida.
Inteligencia de vulnerabilidades
Ordena CVE con el catálogo KEV de CISA y las puntuaciones EPSS de FIRST, junto a CVSS, y arma una tabla de prioridades.