Condividi tramite


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.