Condividi tramite


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.