Ir para o conteúdo

Blogue ·

Uma correspondência que se recusa a ter a certeza

Quatro factos de quatro fontes, mantidos à parte. Porque uma entrada KEV nunca sobe a gravidade e porque só um intervalo com limite superior conta a sério.

Por Provibr

Um analisador de banners lê SSH-2.0-OpenSSH_8.9p1 numa porta e anota um produto e uma versão. Um canal de vulnerabilidades diz que um intervalo de versões desse produto tem um problema conhecido. Juntar as duas coisas é uma linha de código e uma das formas mais fáceis de construir um ecrã de segurança em que ninguém confia ao fim de um mês.

A razão é que as duas frases não são o mesmo género de afirmação. Uma é uma medição feita a um serviço que pode estar a mentir. A outra é a afirmação de um terceiro sobre um intervalo de versões talvez escrito antes de a correção existir. Um ecrã que as mostra como um único número deitou fora justamente aquilo que permitiria à clientela decidir o que fazer.

Quatro factos de quatro fontes

Na frase esta máquina tem a CVE-1234 há quatro afirmações separadas.

  • Alcançável está medido. Num dado momento estabeleceu-se uma ligação TCP.
  • A versão está derivada. Recortámos uma marca de uma saudação, e o serviço pode estar configurado para dizer o que quer que seja, e uma distribuição pode ter retroportado uma correção sem mudar o número.
  • O aviso pertence a outra pessoa. A NVD diz que um intervalo de versões de um produto está afetado.
  • Ativamente explorado é ainda uma terceira parte. A CISA diz que essa CVE é usada no terreno.

Continuam a ser quatro colunas. Multiplicá-las até uma pontuação é exatamente o composto sem sentido que a especificação desta funcionalidade proíbe, e tratar uma entrada no catálogo de vulnerabilidades exploradas como uma subida de gravidade é o mesmo erro em pequeno.

Por isso uma entrada KEV nunca sobe a gravidade. A gravidade vem da pontuação base CVSS e de mais nada, a confiança fica baixa porque a prova é um banner, e a exploração é uma coluna própria com três estados: sim, não, e não aplicável para achados que não assentam em nenhum aviso. Medido sobre os dados de teste: um aviso do Exim com CVSS 9,8 é crítico e leva marca KEV; um aviso do OpenSSH com 8,1 é alto e não a leva. O 9,8 é crítico pela sua pontuação e não pela marca.

O catálogo também não consegue, por construção, produzir uma correspondência sozinho. Leva um identificador CVE, um fabricante, um nome de produto e uma data, e nenhum intervalo de versões. Confrontar Apache HTTP Server com um banner seria adivinhar. Quando muito, põe uma marca num aviso que a NVD já ligou a um intervalo de versões.

Os canais são tabelas de plataforma

Ambos os canais vivem em tabelas sem coluna de organização. Uma CVE não é de ninguém: não é um dado pessoal, não são os dados de uma cliente, e é a mesma linha para todas as contas da plataforma. Por isso não está na limpeza que corre ao fechar uma organização nem numa exportação de dados pessoais. A ligação entre um achado e um aviso é da clientela, e essa está nas duas.

O recolhedor aplica uma lista permitida sobre o anfitrião e não sobre o endereço, e os endereços estão no código. Um trabalhador que lê um endereço do ambiente ou da base de dados é uma primitiva de falsificação de pedidos com um agendador à volta: quem puder definir esse valor faz o nosso portal emitir um pedido a partir da nossa rede e com os nossos endereços de saída. O anfitrião de cada endereço final também é verificado, para que um reencaminhamento para outro anfitrião seja recusado em vez de seguido.

A tabela de verdade

Com um nome de produto que coincide e uma regra CPE do aviso há exatamente três respostas possíveis, e a maior parte das linhas interessantes produz a do meio.

Versão observadaA regra CPEResultado
qualquero nome do produto diferenada
não legívelqualquercorrespondência possível, por verificar
legívelversão exata, igual, revisão compatívelcorrespondência de aviso
legívelversão exata, igual, revisão diferentecorrespondência possível, por verificar
legívelversão exata, diferentenada
legívelintervalo com limite superior, dentrocorrespondência de aviso
legívelintervalo com limite superior, foranada
legívelsó limite inferior, acimacorrespondência possível, por verificar
legívelnenhum limitecorrespondência possível, por verificar

Só contam as entradas CPE com a parte a, de aplicação. Um o de sistema operativo ou um h de equipamento penduraria Ubuntu 22.04 num banner SSH, e essa é justamente a espécie de correspondência que parece convincente e nada significa: vimos o serviço e não o sistema por baixo.

A linha discutível é só limite inferior. Uma regra que diz tudo a partir de 8.0, sem limite superior, abrange versões saídas depois do aviso e que já resolveram o problema. A NVD escreve os intervalos assim quando a correção ainda não tinha sido publicada, e nem sempre os revê depois. Colar uma regra dessas a uma máquina daria por vulnerável um servidor já corrigido, e ao fim de dois avisos desses a clientela aprende a ignorar o ecrã inteiro. Por verificar é o rótulo honesto, e por verificar não é uma versão reduzida de confirmado. É outra afirmação.

Quando um aviso leva dezenas de regras CPE, uma por versão afetada, ganha o resultado mais forte. Se uma delas encaixa ao certo, essa é a resposta, mesmo com dez vagas ao lado.

Uma reavaliação escreve uma revisão nova e não toca em nenhuma prova

Os canais mudam. A NVD corrige uma pontuação, um intervalo estreita-se, uma CVE que coincidia na semana passada já não coincide. A varredura que reavalia os achados abertos contra os canais atuais tem uma regra dura: nunca escreve nem altera uma ocorrência.

Uma ocorrência é a resposta a estava lá às 03:14. Uma atualização de canal não muda nada disso. O que muda é a conclusão posta por cima, e essa recebe uma linha nova na tabela de avaliações com um identificador de revisão próprio que nomeia os dois instantâneos de canal. Medido: depois de mover um aviso de CVSS 9,8 para 7,5, as linhas de ocorrência existentes voltaram idênticas byte a byte.

Uma correspondência desaparecida fecha o achado como closed_unverified e nunca como resolved_verified. O segundo é uma afirmação sobre uma medição, e medição não houve. O que mudou foi a nossa própria inferência. O nome é toda a razão de aquele estado existir.

Também não se escreve nada quando nada mudou. O instantâneo é primeiro comparado com o juízo anterior, porque uma varredura que arquiva uma linha em cada passagem deixa num mês cento e vinte avaliações idênticas debaixo de cada achado, e então a cronologia fica ilegível.

Nenhuma varredura sem um canal bem-sucedido

O último ferrolho custou o menor código e evita o pior resultado.

Se nenhum canal alguma vez teve êxito, a revisão de avisos atual está vazia e a varredura regressa de imediato sem examinar nada. Sem essa verificação correria, veria que a consulta de candidatos não devolve nada, e fecharia todos os achados baseados em avisos de toda a clientela por deixarem de coincidir. Uma frota inteira ficaria verde à conta de um canal avariado.

Uma recolha falhada deixa ainda a cache anterior de pé, com a sua própria marca de êxito, de modo que as duas perguntas quando tentámos da última vez e quando conseguimos da última vez são duas colunas separadas em vez de uma só cheia de esperança.

O que isto custa e o que rende

O custo é que o ecrã mostra muitas linhas de correspondência possível, por verificar, e essas satisfazem menos do que um número. Quem administra tem de olhar para uma e decidir se a versão em uso está mesmo afetada.

O que rende é que as linhas marcadas como confirmadas merecem ação, e que cada linha pode ser desmontada nos quatro factos com que foi construída: o que foi medido, o que foi deduzido, o que outra pessoa afirmou e o que simplesmente não se sabe. Um achado que não consegue explicar de onde vem cada parte de si é um achado que alguém acabará por aprender a saltar.

Do trabalho de segurança da Provibr. Porque uma análise de exposição que lê um banner não envia carga nenhuma está em um analisador que envia zero bytes, e porque um incidente nunca se fecha por silêncio está em um incidente que nunca se fecha por silêncio.

Comece com um host e um agente

Crie uma conta, instale o agente com um único comando e ligue o seu primeiro host Proxmox. O período experimental dura 14 dias e não pede quaisquer dados de pagamento.