Probabilmente UseAfterFree (query codeQL del driver di Windows)
Panoramica
Questa query CodeQL ha una precisione inferiore rispetto alla query UseAfterFree CodeQL ad alta precisione. Rileva alcuni scenari aggiuntivi, ma ha anche un tasso più elevato di falsi positivi.
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.