
CVE-2017-0037 (Vulnerabilità di corruzione della memoria nel browser Microsoft)
Questo documento riguarda CVE-2017-0037 - Vulnerabilità di corruzione della memoria nel browser Microsoft. Verrà prima introdotto il concetto di esecuzione di codice in remoto (RCE) e poi verranno esaminati alcuni dettagli tecnici.
Che cos'è l'esecuzione di codice in remoto?
Un attacco informatico in cui un aggressore può eseguire comandi in remoto su un altro computer è noto come esecuzione di codice in remoto. Le esecuzioni di codice in remoto (RCE) sono causate più comunemente da software dannoso scaricato dall'host e possono verificarsi indipendentemente dalla posizione del sistema.
Per ottenere una RCE, si possono utilizzare i seguenti modi:
Attacchi di injection: qui, l'aggressore fornisce un input errato con l'intento che una parte di esso venga elaborata come parte del comando.
Attacchi di deserializzazione: il programma di deserializzazione può leggere come codice eseguibile un input utente accuratamente formulato all'interno dei dati serializzati.
Scrittura fuori dai limiti (Out-of-Bounds Write): un aggressore può essere in grado di costruire un input che va oltre il buffer allocato se l'allocazione della memoria è eseguita in modo inadeguato. Poiché anche il codice eseguibile è conservato in memoria, il programma potrebbe essere in grado di eseguire dati forniti dall'utente se vengono scritti nella posizione corretta.
Attacco di type confusion: esiste una minaccia di confusione di tipo quando un codice sorgente non intraprende alcuna azione per verificare l'autenticità di un'entità che gli viene fornita. Poiché la type confusion consente a un hacker di introdurre codice in grado di eseguire istruzioni arbitrarie semplicemente causando una discrepanza nei tipi di oggetto, è rischiosa.
Esecuzione di un attacco RCE
Una sequenza di attacco RCE è semplice da realizzare. In primo luogo, l'attore della minaccia cerca su internet vulnerabilità comuni che possano essere sfruttate in un attacco efficace. Dopo aver identificato una particolare vulnerabilità, l'hacker usa l'exploit per ottenere accesso. Una volta ottenuto l'accesso, può usare lo script dannoso per raggiungere i suoi obiettivi, che includono esfiltrazione di dati, riciclaggio di denaro, sorveglianza completa e interruzione dei servizi.
Il linguaggio dell'applicazione target viene spesso utilizzato per iniettare codice. Il linguaggio viene poi eseguito dal processore lato server. Python, Java, Perl, Ruby e PHP sono linguaggi di programmazione comuni. L'iniezione di codice è comune nelle piattaforme che analizzano immediatamente input non verificati. Le applicazioni online pubbliche sono, in effetti, un grande obiettivo per gli hacker.
Lo script dannoso viene tipicamente eseguito tramite script bash. Uno script bash è un documento di testo che contiene comandi che normalmente verrebbero digitati nel prompt dei comandi. Gli script bash consentono ai comandi inclusi di funzionare correttamente. È consuetudine aggiungere loro un ".sh", anche se non è necessario. Dopo il confezionamento, l'hacker inserisce il codice in un'applicazione vulnerabile, che poi lo esegue. L'applicazione potrebbe anche dare una direttiva al kernel per farlo eseguire.
Metriche dell'attacco
L'immagine seguente si concentra sulle metriche del punteggio base di CVE-2017-0037.

Il punteggio di valutazione CVSS qui è 8.1 (alto).
Vettore di attacco (Attack Vector) - Il componente vulnerabile qui è legato allo stack di rete e la gamma di potenziali aggressori include qualsiasi cosa, dalle altre alternative indicate all'intera Internet.
La complessità di attacco (Attack Complexity) di questa vulnerabilità è alta, cioè il successo di un attacco dipende da circostanze che esulano dal controllo dell'aggressore. Quindi, un attacco non può essere portato a termine a piacimento, ma richiede che l'aggressore dedichi un livello significativo di lavoro nella pianificazione o nell'implementazione contro l'elemento vulnerabile prima di poter essere considerato efficace.
Riservatezza (Confidentiality) qui è alta, il che significa una perdita completa di riservatezza, con l'aggressore che ha accesso a tutte le risorse all'interno del componente danneggiato.
Integrità (Integrity) è alta, il che significa una grave perdita di integrità e protezione.
Disponibilità (Availability) è alta, il che significa una perdita totale di disponibilità, consentendo all'aggressore di proibire completamente l'accesso alle risorse del componente colpito.
Dettagli dell'attacco
La vulnerabilità CVE-2017-0037 era un difetto di type confusion presente in Microsoft Edge e in Internet Explorer 10 e 11. Consentiva agli aggressori di eseguire codice in remoto sulla macchina target quando l'utente visitava un sito web dannoso.
Il difetto è stato segnalato dal ricercatore di Google Ivan Frantic e i dettagli della vulnerabilità sono stati rilasciati da Google poiché Microsoft non è riuscita a correggerlo entro il periodo di divulgazione di 90 giorni.

L'exploit proof-of-concept (PoC) pubblicato dal ricercatore rivela che può far crashare Edge e IE, consentendo a un aggressore di eseguire codice in remoto e ottenere privilegi di amministratore sul sistema compromesso. Ha inoltre confermato che l'attacco funzionava sulla versione a 64 bit di Internet Explorer su Windows Server 2012 R2 e che interessava anche IE 11 a 32 bit e Microsoft Edge.
La type confusion si trova nella
Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElemnt funzione in mshtml.dll. Eseguendo codice arbitrario in remoto, tramite vettori che coinvolgono la sequenza di token di Cascading Style Sheets (CSS) e codice JavaScript appositamente predisposto che opera su un elemento TH, l'attacco può verificarsi.
Il PoC di Ivan Fratric di Google Project Zero

Come affermato dal ricercatore Ivan Frantic, il PoC va in crash in
MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement durante la lettura dall'indirizzo 0000007800000070.


Analizzando il codice attorno al punto del crash, si può osservare che all'indirizzo di memoria 00007ffe`8f330a51, il contenuto del registro rbp viene letto nel registro rcx. Poi la chiamata a
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable assegna un valore a rax (è un registro designato per memorizzare i valori di ritorno dalle funzioni).
Anche se rcx dovrebbe puntare a un altro tipo di oggetto, nel PoC mostrato sopra punta a un array di interi a 32 bit allocato in Array<Math::SLayoutMeasure>::Create. Gli offset delle colonne della tabella sono memorizzati in quell'array e un aggressore può prenderne il controllo. Il crash avviene a 00007ffe`8f330a59 poiché rax punta a memoria non inizializzata. rax memorizza il valore di ritorno della funzione
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable che non è un indirizzo di memoria inizializzato. L'aggressore può far puntare rax a una posizione di memoria che controlla. L'aggressore può modificare proprietà della tabella come border-spacing e la larghezza del primo elemento TH per ottenere il controllo su rax.

Se l'aggressore riesce a ottenere il controllo su rax alla riga 00007ffe`8f330a59, la funzione
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem>
>::Readable viene chiamata di nuovo alla riga 00007ffe8f330a5d 743d** con gli stessi argomenti e un salto a un indirizzo più alto. Dopo di che, attraverso una serie di differenze che partono da **rax**, è possibile ottenere un puntatore a funzione e memorizzarlo in **rdi**. Se l'aggressore riuscisse a superare un **controllo CFG** su quel puntatore a funzione, il puntatore a funzione controllato dall'aggressore verrebbe chiamato alla riga **00007ffe8f330a80.
Probabile patch del bug
Come suggerito da Ivan Fratric, in primo luogo deve essere individuata la ragione alla base del verificarsi della type confusion. Secondo la sua ipotesi, nel DOM esistono due tipi di colonne: le colonne delle tabelle HTML e le colonne CSS; IE/Edge si confondevano tra le due. Quindi, se fosse stato aggiunto un controllo di tipo da qualche parte nella funzione vulnerabile, avrebbe potuto risolvere il problema.
Link utili
Impatti di un attacco RCE
Accesso iniziale: gli aggressori possono utilizzarlo per ottenere il controllo di un dispositivo e installare malware o raggiungere altri obiettivi.
Divulgazione di informazioni: gli attacchi RCE aiutano a installare malware che ruba informazioni o a eseguire comandi che raccolgono e rubano dati dal dispositivo interessato.
Denial of Service: una falla RCE consente agli hacker di eseguire codice sulla macchina che ospita l'applicazione interessata e quindi di interromperne il funzionamento e quello di altri programmi sul sistema.
Cryptomining: il malware di cryptomining viene spesso distribuito ed eseguito su dispositivi vulnerabili.
Ransomware: il ransomware è un tipo di software che impedisce a un utente di accedere ai propri file a meno che non paghi.
Modi per mitigare gli attacchi RCE
Il controllo del buffer overflow può essere utilizzato per mitigare gli attacchi RCE.
Le liste di controllo degli accessi sono utili per limitare i privilegi degli utenti e, quindi, per limitare le capacità di un aggressore se questi ottiene il controllo dell'account di un utente.
Il traffico di rete dovrebbe essere monitorato per individuare contenuti potenzialmente dannosi, oltre al monitoraggio degli endpoint.
Utilizzare la sanificazione dell'input (input sanitization), ovvero il processo di pulizia e bonifica dell'input dell'utente per evitare che venga utilizzato per sfruttare falle di sicurezza.
Riferimenti
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-0037
https://www.bugcrowd.com/glossary/remote-code-execution-rce/
https://bugs.chromium.org/p/project-zero/issues/detail?id=1011
https://blog.0patch.com/2017/03/0patching-another-0-day-internet.html
https://www.cs.uaf.edu/2017/fall/cs301/lecture/09_11_registers.html
https://reverseengineering.stackexchange.com/questions/10746/what-does-mov-qword-ptr-dsrax18-r8-mean