
Prova di concetto per CVE-2024-21338, una vulnerabilità di escalation dei privilegi del driver Windows AppLocker (appid.sys) utilizzata dal gruppo Lazarus come 0day. Consente lettura/scrittura a livello kernel tramite richieste IOCTL appositamente create e manipolazione di PreviousMode.
Questo è un POC per CVE-2024-21338, una vulnerabilità di escalation dei privilegi nel driver AppLocker di Windows (appid.sys), sfruttata come 0day dal gruppo Lazarus per l'escalation dei privilegi locale su Windows.
CVE-2024-21338 è una vulnerabilità di escalation dei privilegi divulgata nel Patch Tuesday di Microsoft del 13 febbraio 2024, sfruttata dal gruppo hacker Lazarus per ottenere accesso al kernel e distribuire il rootkit FudModule.
La vulnerabilità risiede nel codice di controllo 0x22A018 del driver appid.sys: un utente malintenzionato può inviare richieste IOCTL appositamente predisposte per attivare la vulnerabilità, ottenendo una chiamata di callback arbitraria e, infine, l'accesso in lettura e scrittura al kernel.

La vulnerabilità si trova nella funzione AppHashComputeImageHashInternal del driver appid.sys. AipDeviceIoControlDispatch, quando elabora la richiesta 0x22A018, non controlla correttamente PreviousMode, consentendo a un processo in modalità utente di attivare funzioni di callback in modalità kernel.
Ottenere i privilegi di Local Service: la vulnerabilità richiede i privilegi di Local Service per accedere al dispositivo \\Device\\AppID, quindi lo strumento individua e impersona innanzitutto un processo Local Service.
Costruire la richiesta IOCTL: lo strumento costruisce una richiesta IOCTL speciale, contenente un puntatore a funzione controllabile e i relativi parametri.
Attivare la vulnerabilità: inviando la richiesta IOCTL, si attiva la vulnerabilità, chiamando una funzione gadget nel kernel che modifica il campo PreviousMode del thread corrente, portandolo da modalità utente a modalità kernel.
Ottenere accesso in lettura/scrittura al kernel: dopo aver modificato PreviousMode, il processo in modalità utente può utilizzare NtReadVirtualMemory e NtWriteVirtualMemory per leggere e scrivere memoria arbitraria del kernel.
Utilizzare Visual Studio 2026 per compilare il progetto. Sono richiesti Windows SDK e un compilatore C++.
Su un sistema Windows non aggiornato (ad esempio Windows 10 1709), abilitare il servizio Application Identity.
Eseguire il file eseguibile compilato con privilegi di amministratore.
Lo strumento troverà automaticamente un processo Local Service e lo impersonerà.
Lo strumento caricherà il driver appid.sys e costruirà una richiesta IOCTL per attivare la vulnerabilità.
Una volta attivata la vulnerabilità, lo strumento chiederà di inserire l'indirizzo del kernel da modificare e il nuovo valore, consentendo la modifica della memoria del kernel.
Questo progetto è solo per scopi educativi e di ricerca, non deve essere utilizzato per scopi illegali.
| Nome file | Descrizione funzionalità |
|---|
| main.cpp | Funzione principale, gestisce il flusso dello sfruttamento della vulnerabilità |
| CVE-2024-21338.h | Dichiarazioni di strutture e funzioni relative allo sfruttamento |
| CVE-2024-21338.cpp | Implementazione delle condizioni preliminari per lo sfruttamento |
| export_func.h | Dichiarazioni delle funzioni esportate |
| gadget_search.cpp | Implementazione della ricerca di gadget nel kernel |
| Native.h | Definizioni delle API native |
| PE.h | Funzioni di utilità per la gestione dei file PE |