Inteligência de vulnerabilidades
Lendo um CVE: o que um registro CVE diz e o que não diz
Um registro CVE nomeia a falha e aponta para o fornecedor, que é quem define a versão corrigida.
O que significa uma nota CVSS como 9.8, como as vector strings da v4.0 e da v3.1 são montadas e como decodificar e recalcular uma na mão.
O CVSS é o sistema de pontuação por trás da maioria das notas publicadas de vulnerabilidades. Você vai ver um número entre 0.0 e 10.0, uma palavra de severidade como "Critical" e uma string longa que parece um número de série. Este artigo explica o que cada parte significa, como ler a string campo a campo e como conferir uma nota publicada por conta própria.
CVSS é a sigla de Common Vulnerability Scoring System. Quem mantém o padrão é a FIRST, o Forum of Incident Response and Security Teams. A versão atual é a 4.0, publicada no fim de 2023. A versão 3.1 ainda aparece na maioria dos avisos antigos e no banco da NVD, então você precisa saber ler as duas.
O CVSS dá a uma falha uma nota de 0.0 a 10.0. A nota vem das propriedades da falha: o quão difícil é chegar até ela, o que o atacante precisa ter antes e quanto dano a falha causa se alguém a usar. A maioria das ferramentas converte o número em uma classificação:
| Classificação | Faixa de nota |
|---|---|
| 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 |
As classificações são iguais na v3.1 e na v4.0. A conta por trás do número é diferente.
As equipes precisam de uma linguagem comum para severidade. O fornecedor escreve o aviso, um scanner marca um ativo, o gerente pergunta qual correção vai primeiro, e todos deveriam entender a mesma coisa quando dizem "high". O CVSS oferece essa escala comum. A vector string também registra o raciocínio, então quem lê pode conferir se a nota faz sentido para o seu ambiente.
A nota tem limites, e a maioria dos erros vem de ignorá-los. A seção sobre severidade e probabilidade trata do principal.
O CVSS v4.0 organiza as métricas em quatro grupos. Só o grupo base é necessário para gerar uma nota.
As métricas base descrevem a falha como ela existe no software vulnerável, sem saber nada da sua rede. Os avisos quase sempre publicam essas métricas. Na v4.0 elas cobrem:
As métricas de ameaça mudam com o tempo. A métrica de ameaça da v4.0 é a E, de exploit maturity (maturidade do exploit). Ela pode ser A (atacada, ou seja, há evidência de exploração), P (existe prova de conceito), U (não reportada) ou X (não definida, que é o padrão). Uma nota com E preenchido pode ser diferente da nota base, e ela muda quando o cenário de ameaça muda.
As métricas ambientais descrevem o seu próprio ambiente. As métricas de requisito (CR, IR e AR, para confidencialidade, integridade e disponibilidade) dizem o quanto cada propriedade importa para você. As métricas base modificadas permitem substituir um valor base quando a sua configuração muda esse valor. Uma falha numa página de login exposta na internet e a mesma falha numa VM de laboratório sem rota para a rede podem ter a mesma nota base e ainda merecer prioridades diferentes no seu ambiente.
As métricas suplementares acrescentam contexto, como impacto na segurança física, possibilidade de automação, esforço de recuperação ou urgência. Elas não alteram a nota. Servem para a equipe ordenar o trabalho.
A versão 3.1 usa os grupos Base, Temporal e Ambiental. Ela não tem grupo suplementar, e as métricas temporais (maturidade do código de exploração, nível de remediação e confiança do relatório) são diferentes da métrica E única da v4.0.
A vector string é a forma compacta das métricas. Ela começa com a versão e depois lista cada métrica como Nome:Valor, separadas por barras. Cada valor é uma única letra. Quando você conhece as letras, consegue ler qualquer string sem consultar uma tabela.
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:NDecodifique campo a campo:
| Campo | Valor | Significado |
|---|---|---|
| CVSS | 4.0 | Versão da especificação |
| AV | N | Vetor de ataque: rede. Os outros valores são A (adjacente), L (local) e P (físico). |
| AC | L | Complexidade do ataque: baixa. O outro valor é H. |
| AT | N | Requisitos de ataque: nenhum. O outro valor é P (presente), para condições como uma janela de corrida ou uma configuração específica de implantação. |
| PR | N | Privilégios necessários: nenhum. Os outros são L (baixo) e H (alto). |
| UI | N | Interação do usuário: nenhuma. Os outros são P (passiva) e A (ativa). |
| VC | H | Impacto na confidencialidade do sistema vulnerável: alto. Os outros são L e N. |
| VI | H | Impacto na integridade do sistema vulnerável: alto. |
| VA | H | Impacto na disponibilidade do sistema vulnerável: alto. |
| SC | N | Impacto na confidencialidade de sistemas subsequentes: nenhum. Os outros são L e H. |
| SI | N | Impacto na integridade de sistemas subsequentes: nenhum. |
| SA | N | Impacto na disponibilidade de sistemas subsequentes: nenhum. |
Em palavras simples: alguém na rede pode explorar isso sem fazer login, sem uma configuração especial e sem que a vítima precise fazer nada. O ataque dá controle total sobre a confidencialidade, a integridade e a disponibilidade do componente vulnerável, e nada além dele. A calculadora da FIRST devolve nota base 9.3 (Critical) para esse vetor. O laboratório abaixo mostra como conferir.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:HOs campos da v3.1 são parecidos, com três diferenças. Não existe o campo AT. Os campos de impacto são C, I e A, sem divisão entre sistema vulnerável e sistemas subsequentes. E aparece o S (escopo):
| Campo | Valor | Significado |
|---|---|---|
| AV | N | Vetor de ataque: rede. Os outros são A, L e P. |
| AC | L | Complexidade do ataque: baixa. O outro valor é H. |
| PR | N | Privilégios necessários: nenhum. Os outros são L e H. |
| UI | N | Interação do usuário: nenhuma. O outro valor é R (necessária). |
| S | C | Escopo alterado: a exploração pode afetar um componente além daquele que contém a falha. U significa inalterado. |
| C | H | Confidencialidade: alta. Os outros são L e N. |
| I | H | Integridade: alta. |
| A | H | Disponibilidade: alta. |
O campo S explica a maior parte da diferença entre 9.8 e 10.0 que aparece mais adiante neste artigo.
As mudanças são estruturais, então ler a nota de uma versão como se fosse da outra gera erros.
Os avisos ainda misturam versões. Alguns publicam a nota da v3.1 e a da v4.0 para a mesma falha, e os dois números podem ser diferentes. Confira o prefixo antes de comparar dois números.
Este é o ponto mais importante, e o que mais gente pula. O CVSS mede quão grave uma falha é se ela for explorada. Ele não diz se alguém vai explorá-la.
Uma falha com nota base Critical pode ficar sem exploração por anos. Uma falha Medium pode estar sob ataque ativo nesta semana. O CVSS não enxerga isso. O grupo de ameaça pode carregar alguma informação de exploração (E com valor A, por exemplo), mas alguém ainda precisa preenchê-lo e mantê-lo atualizado. Outras fontes respondem à pergunta de probabilidade:
Se você precisa decidir o que corrigir primeiro, leia severidade, probabilidade e exposição juntas. Uma nota alta do CVSS num sistema que ninguém consegue alcançar costuma ser menos urgente do que uma nota média numa página de login pública com exploração relatada.
Para o básico sobre o que é uma vulnerabilidade e como ela recebe um identificador, leia o que é uma vulnerabilidade e o que é um identificador CVE.
Você precisa de um terminal e de um navegador. O laboratório usa apenas dados públicos. Ele acessa a API pública da NVD e o site da FIRST, e mais nada.
A API da NVD devolve as notas que a NVD guarda para um CVE. Para o CVE-2021-44228, a falha Log4Shell do Apache Log4j, rode:
curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228' | jq -r '.vulnerabilities[0].cve.metrics | .. | .vectorString? // empty'O filtro percorre todo o objeto metrics e imprime cada vectorString que encontra. Na máquina onde este artigo foi conferido, o jq não estava instalado. A mesma varredura foi feita com o Node 24. Use este caminho alternativo se não tiver o 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'));"Saída observada em 8 de novembro 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:CAs duas primeiras linhas são o vetor v3.1 do próprio registro da NVD e de um segundo registro que a NVD lista. A terceira linha é um vetor CVSS v2.0, uma escala mais antiga. Ignore-a neste laboratório. A NVD pode atualizar o registro, então sua saída pode ser diferente desta.
Pegue a primeira linha e preencha uma tabela como as acima. Anote cada campo e o seu significado antes de abrir a calculadora. Duas perguntas ajudam:
O campo que merece uma segunda olhada é S:C. Ele significa que a exploração alcança além do componente que contém a falha. Por isso este vetor tem nota maior do que o mesmo vetor com S:U.
Abra a calculadora da versão que aparece na sua string. Para a v3.1, use https://www.first.org/cvss/calculator/3.1. Para a v4.0, use https://www.first.org/cvss/calculator/4.0. Você pode colar o vetor depois do # na URL para preencher o formulário.
Para o exemplo v4.0 de antes, abra este link:
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:NA calculadora deve devolver nota base 9.3 (Critical) para esse vetor. Não executei isso num navegador ao escrever o texto, então trate o 9.3 como o valor a confirmar. Se não bater, compare cada letra do formulário com a sua tabela decodificada.
Para o vetor v3.1 da NVD, abra a calculadora v3.1 e ajuste cada valor para bater com a sua tabela. A nota esperada é 10.0. Se o formulário continuar vazio depois que a página carregar, selecione os valores manualmente, o que já é uma boa verificação.
Para a v3.1, a fórmula base cabe em poucas linhas. Este script segue a especificação da v3.1. Ele serve para conferir o seu entendimento, não para produção. Salve 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));Rode no vetor da NVD e no mesmo vetor com o escopo voltando a inalterado:
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"Saída observada em 8 de novembro 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.8A primeira linha bate com a nota 10.0 da NVD. A segunda mostra o 9.8 que muita gente lembra para essa falha. A única mudança é S:U. Quando você vir uma nota, leia o vetor antes de confiar no número.
Se a sua tabela decodificada, a calculadora e o script concordam, você já sabe ler uma string CVSS. Se discordam, encontre o campo que difere. As causas comuns são uma letra errada (AV:L quer dizer local, não baixa), trocar C, I e A, ou comparar uma nota v3.1 com uma v4.0 como se as duas estivessem na mesma escala.
Leia primeiro as definições das métricas base na especificação. São curtas, e a redação exata de cada valor é onde estão as respostas. Depois decodifique cinco ou seis vetores publicados no papel antes de conferir cada um na calculadora. Escolha alguns com S:C ou AT:P e veja como a nota se move.
Depois disso, leia sobre o lado da exploração: o que o EPSS estima e o que o catálogo KEV registra. As duas respondem à pergunta que o CVSS deixa em aberto, que é se alguém está atacando essa falha agora.
Inteligência de vulnerabilidades
Um registro CVE nomeia a falha e aponta para o fornecedor, que é quem define a versão corrigida.
Inteligência de vulnerabilidades
Ordene CVEs com o catálogo KEV da CISA e as pontuações EPSS da FIRST, junto ao CVSS, e monte uma tabela de prioridade.