
CVE-2020-16898 (Bad Neighbor) Logica di rilevamento e regola per la vulnerabilità TCP/IP di Microsoft Windows
Il 13 ottobre, Microsoft ha annunciato una vulnerabilità eccezionalmente critica nello stack IPv6 di Windows, che consente a un aggressore di inviare pacchetti appositamente creati per eseguire potenzialmente codice arbitrario su un sistema remoto. Il proof-of-concept condiviso con i membri MAPP è estremamente semplice e perfettamente affidabile. Provoca un immediato BSOD (Blue Screen of Death), ma indica anche la probabilità di sfruttamento per coloro che riescono a bypassare le mitigazioni di Windows 10 e Windows Server 2019. Gli effetti di uno sfruttamento che potrebbe consentire l'esecuzione remota di codice sarebbero diffusi e di grande impatto, poiché questo è il tipo di bug che potrebbe diventare wormable. Per facilità di riferimento, abbiamo chiamato la vulnerabilità “Vicino Maligno” perché si trova all'interno del “Protocollo” di Neighbor Discovery ICMPv6, utilizzando il tipo Router Advertisement.
Questo documento è stato preparato da McAfee Advanced Threat Research. Ha lo scopo di fornire preziose intuizioni per amministratori di rete e personale di sicurezza, che desiderano comprendere meglio questa vulnerabilità e difendersi dallo sfruttamento. La firma prodotta qui dovrebbe essere attentamente considerata e verificata in ambienti di staging prima di essere utilizzata in produzione e potrebbe beneficiare di una regolazione specifica per il deployment target.
Le informazioni fornite nel presente documento sono soggette a modifiche senza preavviso e sono fornite "AS IS", con tutti i difetti, senza garanzia o garanzia circa l'accuratezza o l'applicabilità delle informazioni a qualsiasi situazione o circostanza specifica e per l'uso a proprio rischio. Inoltre, non possiamo garantire alcun benchmark di prestazioni o efficacia per qualsiasi firma.
La firma Suricata per questa vulnerabilità si trova in cve-2020-16898.rules e contiene la seguente logica:
alert icmp any any -> any any (msg:"Potential CVE-2020-16898 Exploit"; lua:cve-2020-16898.lua; sid:202016898; rev:1;)
Il corrispondente script Lua si trova in cve-2020-16898.lua. Contiene la logica necessaria per analizzare correttamente il livello ICMPv6 e identificare un potenziale sfruttamento di Vicino Maligno, come segue:
Una volta individuato l'inizio del livello ICMPv6, testiamo il primo byte del livello per assicurarci che sia un pacchetto ICMPv6 di Router Advertisement (Type = 134) - se non lo è, usciamo.
Poiché le primitive di Suricata non sono state aggiornate per analizzare le opzioni ICMPv6, saltiamo semplicemente al 17° byte del livello ICMPv6, poiché è lì che dovrebbero iniziare le Opzioni, se presenti (i primi 16 byte sono campi a lunghezza fissa, secondo RFC 4443). Da lì, iteriamo su ogni Opzione fino a esaurire i byte nel pacchetto. Per ogni Opzione, ci interessano solo i primi due byte: rispettivamente i campi Tipo e Lunghezza dell'Opzione. Mentre ignoriamo tutte le Opzioni che non sono RDNSS, per Tipo Opzione = 25 (RDNSS), controlliamo se la Lunghezza (secondo byte dell'Opzione) è un numero pari. Se lo è, la segnaliamo. Altrimenti, continuiamo. Poiché la Lunghezza è contata in incrementi di 8 byte, moltiplichiamo la Lunghezza per 8 e saltiamo avanti di quel numero di byte per arrivare all'inizio dell'Opzione successiva (sottraendo 1 per tenere conto del byte di lunghezza che abbiamo già consumato).
Con questa regola, controlliamo anche che la Lunghezza sia almeno 3, poiché RFC 8106 lo richiede, ma in definitiva questo controllo potrebbe essere superfluo, poiché ci interessa solo se la Lunghezza è pari o meno.