Lo scorso giugno, i ricercatori ESET hanno identificato un exploit zero-day utilizzato per un attacco nell’Europa orientale.
L’exploit sfrutta una vulnerabilità di escalation dei privilegi locali in Microsoft Windows, in particolare una funzione del puntatore NULL nel componente win32k.sys. Una volta che l’exploit è stato scoperto e analizzato, è stato segnalato al Microsoft Security Response Center, che ha prontamente risolto la vulnerabilità e rilasciato una patch.
La vulnerabilità interessa le seguenti versioni Windows:
- Windows 7 Service Pack 1 a 32 bit
- Windows 7 Service Pack 1 basato su x64
- Windows Server 2008 per sistemi a 32 bit Service Pack 2
- Windows Server 2008 per sistemi basati su Itanium Service Pack 2
- Windows Server 2008 per sistemi basati su x64 Service Pack 2
- Windows Server 2008 R2 per i sistemi basati su Itanium Service Pack 1
- Windows Server 2008 R2 Pack 1 basato su x64
Questo articolo si concentra sui dettagli tecnici della vulnerabilità e sulle possibilità di sfruttarla.
Come in molte altre vulnerabilità scoperte negli ultimi anni in win32k.sys di Microsoft Windows, questo exploit utilizza oggetti dei menu popup. Ad esempio, l’escalation di privilegi locali del gruppo Sednit che abbiamo analizzato nel 2017 utilizzava oggetti di menu e tecniche molto simili all’attuale exploit.
Quest’ultima minaccia crea due finestre; una per ognuno dei due stadi dell’attacco. Per la prima finestra, crea oggetti popup e aggiunge voci di menu utilizzando le funzioni CreatePopupMenu e AppendMenu. Oltre a questo l’exploit, imposta gli hook WH_CALLWNDPROC e EVENT_SYSTEM_MENUPOPUPSTART.
Quindi visualizza un menu usando la funzione TrackPopupMenu, per poi eseguire il codice in EVENT_SYSTEM_MENUPOPUPSTART. Successivamente, questo tenta di aprirsi come primo elemento disponibile nel menu, inviando una sequenza di messaggi MN_SELECTITEM e MN_SELECTFIRSTVALIDITEM e MN_OPENHIERARCHY al menu stesso.
Il prossimo passaggio è molto importante per attivare questa vulnerabilità. L’exploit deve sfruttare esattamente l’istante in cui è già stato creato il menu iniziale e sta per essere generato il sottomenu. Per questo, impiega il codice che gestisce il messaggio WM_NCCREATE nell’hook WH_CALLWNDPROC. Quando il codice exploit rileva che il sistema si trova in questo stato, invia il messaggio MN_CANCELMENUS (0x1E6) al primo menu, che lo annulla. Da notare che in questo particolare momento il suo sottomenu deve essere ancora creato.
Ora se controlliamo questo oggetto del sottomenu in modalità kernel, vedremmo che tagPOPUPMENU> ppopupmenuRoot è uguale a 0. Questo stato consente all’autore dell’attacco di usare quell’elemento in questa struttura del kernel come una funzione del puntatore NULL. L’exploit alloca una nuova pagina all’indirizzo 0x0 e questo indirizzo sarà trattato come un oggetto tagPOPUPMENU (Figura 1) dal kernel.

Figura 1. La struttura del kernel tagPOPUPMENU
Terminata questa fase gli attaccanti usano la seconda finestra. L’obiettivo principale è di effettuare il flip del bit bServerSideWindowProc nella struttura tagWND della seconda finestra. Ciò causa l’esecuzione di una procedura WndProc in modalità kernel.
Per farlo, gli hacker sottraggono l’indirizzo di memoria kernel della struttura tagWND della seconda finestra chiamando la funzione HMValidateHandle non esportata nella libreria user32.dll. Quindi l’exploit crea un falso oggetto tagPOPUPMENU alla pagina NULL e invia un messaggio MN_BUTTONDOWN a un sottomenu.
Infine, il kernel eseguirà la funzione win32k! XxxMNOpenHierarchy.

Figura 2. Codice disassemblato della funzione win32k! XxxMNOpenHierarchy
Questa funzione passa un oggetto creato nella pagina NULL a win32k! HMAssignmentLock. Il bit bServerSideWindowProc è impostato all’interno della funzione win32k! HMDestroyUnlockedObject, che trova alcune chiamate più profonde all’interno di win32k! HMAssignmentLock.
L’exploit funziona solo su versioni ormai datate di Windows, infatti da Windows 8 in poi un processo utente non è più autorizzato a mappare la pagina NULL. Microsoft ha distribuito una patch che risolve questa problematica su Windows 7 per i sistemi basati su x64.
Se si sta utilizzando ancora Windows 7 Service Pack 1 per sistemi a 32 bit si dovrebbe prendere in considerazione l’aggiornamento a sistemi operativi più recenti, poiché il supporto esteso di Windows 7 Service Pack 1 termina il 14 gennaio 2020, ciò significa che da questa data gli utenti di Windows 7 non riceveranno più alcun aggiornamento critico di sicurezza. Pertanto, vulnerabilità come questa rimarranno per sempre senza patch.




1 Commento