UseAfterFree (query codeQL del driver di Windows)
Panoramica
Questa query CodeQL ha una precisione elevata, che consente l'automazione dei bug, ma presenta alcune limitazioni e pertanto non sarà in grado di rilevare tutti i casi di difetti UseAfterFree.
Un difetto UseAfterFree si verifica quando viene usato un blocco di memoria allocato dopo che è stato liberato (noto anche come "puntatore dangling").
Il comportamento in questi casi non è definito e in pratica può avere conseguenze impreviste, tra cui danneggiamento della memoria, uso di valori non corretti o esecuzione arbitraria del codice.
Elemento consigliato
Impostare i puntatori su NULL immediatamente dopo che sono stati liberati.
Esempio
Nell'esempio seguente viene pSomePointer
liberato solo se Status
il valore non era zero e prima di dereferenziare pSomePointer
per chiamare Method
, Status
viene eseguito di nuovo il controllo. Sfortunatamente Status
è stato modificato tra i due riferimenti a pSomePointer
, che consente di poter eseguire la chiamata a pSomePointer->Method()
su un puntatore precedentemente liberato.
NTSTATUS Status = x();
if (Status != 0)
{
// Release pSomePointer if the call to x() failed
ExFreePool(pSomePointer);
}
Status = y();
if (Status == 0)
{
// Because Status may no longer be the same value than it was before the pointer was released,
// this code may be using pSomePointer after it was freed, potentially executing arbitrary code.
Status = pSomePointer->Method();
}
Nell'esempio corretto, pSomePointer
è impostato su NULL
immediatamente dopo essere stato liberato e la condizione per verificare se è sicuro chiamare pSomePointer->Method()
i controlli per questa condizione aggiuntiva per evitare il possibile bug.
NTSTATUS Status = x();
if (Status != 0)
{
// Release pSomePointer if the call to x() failed
ExFreePool(pSomePointer);
// Setting pSomePointer to NULL after being freed
pSomePointer = NULL;
}
Status = y();
// If pSomePointer was freed above, its value must have been set to NULL
if (Status == 0 && pSomePointer != NULL)
{
Status = pSomePointer->Method();
}
Dettagli aggiuntivi
Questa query è disponibile nel repository CodeQL di Microsoft GitHub. Per informazioni dettagliate sul modo in cui gli sviluppatori di Driver Windows possono scaricare ed eseguire CodeQL, vedere la pagina CodeQL e il logo degli strumenti statici.