Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.