Ir al contenido

Blog ·

Una coincidencia que se niega a estar segura

Cuatro hechos de cuatro fuentes, mantenidos aparte. Por qué una entrada KEV nunca sube la gravedad y por qué solo un rango acotado cuenta de verdad.

Por Provibr

Un escáner de banderas lee SSH-2.0-OpenSSH_8.9p1 de un puerto y anota un producto y una versión. Un canal de vulnerabilidades dice que un rango de versiones de ese producto tiene un problema conocido. Juntar ambas cosas es una línea de código y una de las maneras más fáciles de construir una pantalla de seguridad en la que nadie confía al cabo de un mes.

La razón es que las dos frases no son la misma clase de afirmación. Una es una medición de un servicio que puede estar mintiendo. La otra es la afirmación de un tercero sobre un rango de versiones que quizá se escribió antes de que existiera la corrección. Una pantalla que las presenta como un solo número ha tirado justo aquello que permitiría a la clientela decidir qué hacer.

Cuatro hechos de cuatro fuentes

En la frase esta máquina tiene CVE-1234 hay cuatro afirmaciones separadas.

  • Alcanzable está medido. En un momento dado se estableció una conexión TCP.
  • La versión está derivada. Recortamos una marca de un saludo, y el servicio puede estar configurado para decir cualquier cosa, y una distribución puede haber retroportado un parche sin cambiar el número.
  • El aviso pertenece a otro. NVD dice que un rango de versiones de un producto está afectado.
  • Explotado activamente es otra tercera parte más. CISA dice que ese CVE se usa en la práctica.

Siguen siendo cuatro columnas. Multiplicarlas hasta obtener una puntuación es exactamente el compuesto sin sentido que la especificación de esta función prohíbe, y tratar una entrada en el catálogo de vulnerabilidades explotadas como una subida de gravedad es el mismo error en pequeño.

Por eso una entrada KEV nunca sube la gravedad. La gravedad sale de la puntuación base CVSS y de nada más, la certeza se queda baja porque la prueba es una bandera, y la explotación es una columna propia con tres estados: sí, no, y no aplicable para hallazgos que no se apoyan en ningún aviso. Medido sobre los datos de prueba: un aviso de Exim con CVSS 9,8 es crítico y lleva marca KEV; un aviso de OpenSSH con 8,1 es alto y no la lleva. El 9,8 es crítico por su puntuación y no por la marca.

El catálogo tampoco puede, por construcción, producir una coincidencia por sí mismo. Lleva un identificador CVE, un fabricante, un nombre de producto y una fecha, y ningún rango de versiones. Poner Apache HTTP Server frente a una bandera sería adivinar. Solo llega a marcar un aviso que NVD ya ha atado a un rango de versiones.

Los canales son tablas de plataforma

Ambos canales viven en tablas sin columna de organización. Un CVE no es de nadie: no es un dato personal, no son los datos de una clienta, y es la misma fila para todas las cuentas de la plataforma. Por eso no está en la limpieza que corre al cerrar una organización ni en una exportación de datos personales. El vínculo entre un hallazgo y un aviso sí es de la clientela, y ese está en las dos cosas.

El recolector tiene una lista blanca sobre el anfitrión y no sobre la dirección, y las direcciones están en el código. Un trabajador que lee una dirección del entorno o de la base de datos es una primitiva de falsificación de peticiones con un temporizador alrededor: quien pueda fijar ese valor hace que nuestra pasarela emita una petición desde nuestra red y con nuestras direcciones de salida. El anfitrión de cada dirección final también se comprueba, de modo que una redirección hacia otro anfitrión se rechaza en lugar de seguirse.

La tabla de verdad

Con un nombre de producto que coincide y una regla CPE del aviso hay exactamente tres respuestas posibles, y la mayoría de las filas interesantes producen la del medio.

Versión observadaLa regla CPEResultado
cualquierael nombre del producto difierenada
no legiblecualquieracoincidencia posible, sin verificar
legibleversión exacta, igual, la revisión encajacoincidencia de aviso
legibleversión exacta, igual, la revisión difierecoincidencia posible, sin verificar
legibleversión exacta, distintanada
legiblerango con límite superior, dentrocoincidencia de aviso
legiblerango con límite superior, fueranada
legiblesolo límite inferior, por encimacoincidencia posible, sin verificar
legibleningún límite en absolutocoincidencia posible, sin verificar

Solo cuentan las entradas CPE con la parte a, de aplicación. Una o de sistema operativo o una h de hardware colgaría Ubuntu 22.04 de una bandera SSH, y esa es justo la clase de coincidencia que parece convincente y no significa nada: vimos el servicio y no el sistema que hay debajo.

La fila discutible es solo límite inferior. Una regla que dice todo a partir de 8.0, sin límite superior, incluye versiones publicadas después del aviso y que ya resolvieron el problema. NVD escribe los rangos así cuando la corrección todavía no se había publicado, y no siempre los revisa después. Pegar una regla así a una máquina daría por vulnerable un servidor ya parcheado, y tras dos avisos de ese tipo la clientela aprende a ignorar la pantalla entera. Sin verificar es la etiqueta honesta, y sin verificar no es una versión menor de confirmado. Es otra afirmación.

Cuando un aviso lleva decenas de reglas CPE, una por versión afectada, gana el resultado más fuerte. Si una encaja exactamente, esa es la respuesta, aunque haya diez vagas al lado.

Una reevaluación escribe una revisión nueva y no toca ninguna prueba

Los canales cambian. NVD corrige una puntuación, un rango se estrecha, un CVE que coincidía la semana pasada ya no coincide. El barrido que reevalúa los hallazgos abiertos contra los canales actuales tiene una regla dura: nunca escribe ni modifica una ocurrencia.

Una ocurrencia es la respuesta a estaba ahí a las 03:14. Una actualización de canal no cambia nada de eso. Lo que cambia es la conclusión que va encima, y esa recibe una fila nueva en la tabla de evaluaciones con su propio identificador de revisión que nombra los dos estados de canal. Medido: tras mover un aviso de CVSS 9,8 a 7,5, las filas de ocurrencia existentes volvieron idénticas byte a byte.

Una coincidencia desaparecida cierra el hallazgo como closed_unverified y nunca como resolved_verified. Lo segundo es una afirmación sobre una medición, y no hubo medición. Lo que cambió es nuestra propia inferencia. El nombre es toda la razón de que ese estado exista.

Tampoco se escribe nada si nada ha cambiado. El estado se compara primero con el juicio anterior, porque un barrido que archiva una fila en cada pasada deja en un mes ciento veinte evaluaciones idénticas bajo cada hallazgo, y entonces la línea temporal es ilegible.

Ningún barrido sin un canal exitoso

El último cerrojo costó el menor código y evita el peor resultado.

Si ningún canal ha tenido éxito nunca, la revisión de avisos actual está vacía y el barrido vuelve de inmediato sin examinar nada. Sin esa comprobación correría, vería que la consulta de candidatos no devuelve nada, y cerraría todos los hallazgos basados en avisos de toda la clientela por dejar de coincidir. Una flota entera se pondría verde apoyada en un canal roto.

Una recogida fallida deja además la caché anterior en pie, con su propia marca de éxito, de modo que las dos preguntas cuándo lo intentamos por última vez y cuándo lo conseguimos por última vez son dos columnas separadas en lugar de una sola esperanzada.

Qué cuesta esto y qué aporta

El coste es que la pantalla muestra muchas filas de coincidencia posible, sin verificar, y esas satisfacen menos que un número. Quien administra tiene que mirar una y decidir si la versión que ejecuta está realmente afectada.

Lo que aporta es que las filas marcadas como confirmadas merecen acción, y que cada fila puede descomponerse en los cuatro hechos con los que se construyó: qué se midió, qué se dedujo, qué afirmó otro y qué sencillamente no se sabe. Un hallazgo que no puede explicar de dónde viene cada una de sus partes es un hallazgo que alguien acabará por aprender a saltarse.

Del trabajo de seguridad de Provibr. Por qué un escaneo de exposición que lee una bandera no envía carga alguna está en un escáner que envía cero bytes, y por qué un incidente nunca se cierra por silencio está en un incidente que nunca se cierra por silencio.

Empiece con un host y un agente

Cree una cuenta, instale el agente con un solo comando y conecte su primer host de Proxmox. El periodo de prueba dura 14 días y no pide ningún dato de pago.