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 observada | A regra CPE | Resultado |
|---|---|---|
| qualquer | o nome do produto difere | nada |
| não legível | qualquer | correspondência possível, por verificar |
| legível | versão exata, igual, revisão compatível | correspondência de aviso |
| legível | versão exata, igual, revisão diferente | correspondência possível, por verificar |
| legível | versão exata, diferente | nada |
| legível | intervalo com limite superior, dentro | correspondência de aviso |
| legível | intervalo com limite superior, fora | nada |
| legível | só limite inferior, acima | correspondência possível, por verificar |
| legível | nenhum limite | correspondê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.