Blog ·
Una corrispondenza che si rifiuta di essere certa
Quattro fatti da quattro fonti, tenuti separati. Perché una voce KEV non alza mai una gravità e perché solo un intervallo con limite superiore conta davvero.
Di Provibr
Uno scanner di banner legge SSH-2.0-OpenSSH_8.9p1 da una porta e annota un prodotto e una versione. Un flusso di vulnerabilità dice che un intervallo di versioni di quel prodotto ha un problema noto. Mettere insieme le due cose è una riga di codice e uno dei modi più facili di costruire una schermata di sicurezza di cui entro un mese non si fida più nessuno.
Il motivo è che le due frasi non sono lo stesso genere di affermazione. Una è una misura su un servizio che può mentire. L’altra è l’affermazione di un terzo su un intervallo di versioni forse scritto prima che la correzione esistesse. Una schermata che le presenta come un solo numero ha buttato via proprio ciò che permetterebbe alla clientela di decidere che cosa fare.
Quattro fatti da quattro fonti
Nella frase questa macchina ha la CVE-1234 ci sono quattro affermazioni distinte.
- Raggiungibile è misurato. In un dato momento si è stabilita una connessione TCP.
- La versione è dedotta. Abbiamo ritagliato un gettone da un saluto, e il servizio può essere configurato per dire qualunque cosa, e una distribuzione può aver riportato una correzione senza cambiare il numero.
- L’avviso appartiene a qualcun altro. NVD dice che un intervallo di versioni di un prodotto è colpito.
- Sfruttato attivamente è ancora una terza parte. CISA dice che quella CVE viene usata sul campo.
Restano quattro colonne. Moltiplicarle in un punteggio è esattamente il composto privo di senso che la specifica di questa funzione vieta, e trattare una voce nel catalogo delle vulnerabilità sfruttate come un aumento di gravità è lo stesso errore in piccolo.
Una voce KEV non alza dunque mai una gravità. La gravità viene dal punteggio base CVSS e da nient’altro, la fiducia resta bassa perché la prova è un banner, e lo sfruttamento è una colonna a sé con tre stati: sì, no, e non applicabile per i riscontri che non poggiano su alcun avviso. Misurato sui dati di prova: un avviso Exim a CVSS 9,8 è critico e porta un contrassegno KEV; un avviso OpenSSH a 8,1 è alto e non lo porta. Il 9,8 è critico per il suo punteggio e non per il contrassegno.
Il catalogo inoltre non può, per costruzione, produrre una corrispondenza da solo. Porta un identificatore CVE, un fornitore, un nome di prodotto e una data, e nessun intervallo di versioni. Confrontare Apache HTTP Server con un banner sarebbe tirare a indovinare. Al massimo mette un contrassegno su un avviso che NVD ha già legato a un intervallo di versioni.
I flussi sono tabelle di piattaforma
Entrambi i flussi vivono in tabelle senza colonna di organizzazione. Una CVE non è di nessuno: non è un dato personale, non sono i dati di una cliente, ed è la stessa riga per ogni account della piattaforma. Perciò non compare nella pulizia che gira alla chiusura di un’organizzazione né in un’estrazione di dati personali. Il collegamento tra un riscontro e un avviso invece è della clientela, e quello compare in entrambe.
Il raccoglitore applica una lista consentita sull’host e non sull’indirizzo, e gli indirizzi stessi stanno nel codice. Un lavoratore che legge un indirizzo dall’ambiente o dal database è una primitiva di falsificazione di richieste con attorno una pianificazione: chi può impostare quel valore fa emettere al nostro gateway una richiesta dalla nostra rete, con i nostri indirizzi in uscita. Anche l’host di ogni indirizzo finale viene verificato, così che pure un reindirizzamento verso un altro host sia rifiutato invece che seguito.
La tabella di verità
Con un nome di prodotto che coincide e una regola CPE dell’avviso ci sono esattamente tre risposte possibili, e la maggior parte delle righe interessanti produce quella di mezzo.
| Versione osservata | La regola CPE | Esito |
|---|---|---|
| qualunque | il nome del prodotto differisce | niente |
| non leggibile | qualunque | possibile corrispondenza, non verificata |
| leggibile | versione esatta, uguale, revisione compatibile | corrispondenza di avviso |
| leggibile | versione esatta, uguale, revisione diversa | possibile corrispondenza, non verificata |
| leggibile | versione esatta, diversa | niente |
| leggibile | intervallo con limite superiore, dentro | corrispondenza di avviso |
| leggibile | intervallo con limite superiore, fuori | niente |
| leggibile | solo limite inferiore, sopra | possibile corrispondenza, non verificata |
| leggibile | nessun limite | possibile corrispondenza, non verificata |
Contano solo le voci CPE con parte a, per applicazione. Una o per sistema operativo o una h per hardware attaccherebbe Ubuntu 22.04 a un banner SSH, ed è proprio il genere di corrispondenza che sembra convincente e non significa nulla: abbiamo visto il servizio e non il sistema sottostante.
La riga discutibile è solo limite inferiore. Una regola che dice tutto a partire da 8.0, senza limite superiore, comprende versioni uscite dopo l’avviso e che hanno già risolto il problema. NVD scrive gli intervalli così quando la correzione non era ancora pubblicata, e non sempre li rivede in seguito. Incollare una regola simile a una macchina segnalerebbe come vulnerabile un server già corretto, e dopo due segnalazioni del genere la clientela impara a ignorare l’intera schermata. Non verificata è l’etichetta onesta, e non verificata non è una versione ridotta di confermata. È un’altra affermazione.
Quando un avviso porta decine di regole CPE, una per ogni rilascio colpito, vince l’esito più forte. Se una calza esatta, quella è la risposta, anche se accanto ce ne sono dieci vaghe.
Una rivalutazione scrive una nuova revisione e non tocca alcuna prova
I flussi cambiano. NVD corregge un punteggio, un intervallo si restringe, una CVE che la settimana scorsa coincideva non coincide più. La spazzata che rivaluta i riscontri aperti rispetto ai flussi correnti ha una regola dura: non scrive e non modifica mai un evento osservato.
Un evento osservato è la risposta a c’era alle 03:14. Un aggiornamento di flusso non cambia nulla di questo. Ciò che cambia è la conclusione posta sopra, e quella riceve una riga nuova nella tabella delle valutazioni con un proprio identificatore di revisione che nomina entrambe le istantanee di flusso. Misurato: dopo aver spostato un avviso da CVSS 9,8 a 7,5, le righe di evento esistenti sono tornate identiche byte per byte.
Una corrispondenza scomparsa chiude il riscontro come closed_unverified e mai come resolved_verified. Il secondo è un’affermazione su una misura, e la misura non c’è stata. Ciò che è cambiato è la nostra deduzione. Il nome è tutta la ragione per cui quello stato esiste.
Non viene scritto nulla nemmeno quando nulla è cambiato. L’istantanea viene prima confrontata con il giudizio precedente, perché una spazzata che deposita una riga a ogni passaggio lascia in un mese centoventi valutazioni identiche sotto ogni riscontro, e allora la cronologia è illeggibile.
Nessuna spazzata senza un flusso riuscito
L’ultimo chiavistello è costato meno codice di tutti e impedisce l’esito peggiore.
Se nessun flusso è mai riuscito, la revisione di avvisi corrente è vuota e la spazzata torna subito indietro senza esaminare nulla. Senza quel controllo girerebbe, constaterebbe che l’interrogazione dei candidati non rende nulla, e chiuderebbe ogni riscontro fondato su un avviso presso ogni cliente come non più corrispondente. Un’intera flotta diventerebbe verde sulla fede di un flusso rotto.
Un recupero fallito lascia inoltre in piedi la cache precedente, con il proprio orario di riuscita, così che le due domande quando abbiamo provato l’ultima volta e quando ci siamo riusciti l’ultima volta siano due colonne separate anziché una sola piena di speranza.
Che cosa costa e che cosa rende
Il costo è che la schermata mostra molte righe possibile corrispondenza, non verificata, e quelle soddisfano meno di un numero. Chi amministra deve guardarne una e decidere se la versione in esercizio è davvero colpita.
Ciò che rende è che le righe segnate come confermate meritano un intervento, e che ogni riga può essere scomposta nei quattro fatti da cui è stata costruita: che cosa è stato misurato, che cosa è stato dedotto, che cosa ha affermato qualcun altro e che cosa semplicemente non si sa. Un riscontro che non sa spiegare da dove viene ogni sua parte è un riscontro che qualcuno un giorno imparerà a saltare.
Dal lavoro sulla sicurezza di Provibr. Perché una scansione di esposizione che legge un banner non invia alcun carico sta in uno scanner che invia zero byte, e perché un incidente non si chiude mai per silenzio sta in un incidente che non si chiude sul silenzio.