Delen via


UseAfterFree (Windows Driver CodeQL-query)

Overzicht

Deze CodeQL-query heeft hoge precisie, wat helpt bij het automatiseren van fouten, maar heeft enkele beperkingen en kan daarom niet alle gevallen van UseAfterFree-defecten detecteren.

Een UseAfterFree-defect treedt op wanneer een toegewezen geheugenblok wordt gebruikt nadat het is vrijgemaakt (ook wel een 'zwevende aanwijzer' genoemd).

Gedrag in dergelijke gevallen is niet gedefinieerd en in de praktijk kan dit onbedoelde gevolgen hebben, waaronder beschadiging van het geheugen, het gebruik van onjuiste waarden of willekeurige uitvoering van code.

Aanbeveling

Stel aanwijzers in op NULL direct nadat ze zijn vrijgemaakt.

Voorbeeld

In het volgende voorbeeld wordt pSomePointer alleen vrijgegeven als Status-waarde niet nul was, en voordat pSomePointer wordt gedereferentieerd om Method aan te roepen, wordt Status gecontroleerd. Helaas is pSomePointer gewijzigd tussen de twee verwijzingen, waardoor de mogelijkheid bestaat dat de aanroep pSomePointer->Method() wordt uitgevoerd via een eerder vrijgegeven aanwijzer.

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();
}

In het gecorrigeerde voorbeeld wordt pSomePointer direct na vrijgeven ingesteld op NULL, en omvat de voorwaarde om te controleren of het veilig is om pSomePointer->Method() aan te roepen deze extra voorwaarde om de mogelijke fout te voorkomen.

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();
}

Aanvullende details

Deze query vindt u in de Microsoft GitHub CodeQL-opslagplaats. Zie de pagina CodeQL en de pagina Logotest voor statische hulpprogramma's voor meer informatie over hoe ontwikkelaars van Windows-stuurprogramma's CodeQL kunnen downloaden en uitvoeren.