Sdílet prostřednictvím


UseAfterFree (dotaz CodeQL ovladače Windows)

Přehled

Tento dotaz CodeQL má vysokou přesnost, což pomáhá při automatizaci chyb, ale má určitá omezení, a proto nebude schopen rozpoznat všechny případy závad UseAfterFree.

K chybě UseAfterFree dochází, když se po uvolnění použije přidělený blok paměti (označovaný také jako "visící ukazatel").

Chování v takových případech není definováno a v praxi může mít nezamýšlené důsledky, včetně poškození paměti, použití nesprávných hodnot nebo spuštění libovolného kódu.

Doporučení

Nastavte ukazatele na HODNOTU NULL hned po jejich uvolnění.

Příklad

V následujícím příkladu je pSomePointer uvolněn pouze v případě, že hodnota Status nebyla nula, a před dereferencováním pSomePointer k volání Method je Status znovu kontrolováno. Bohužel byl Status změněn mezi dvěma odkazy na pSomePointer, což umožňuje, že volání pSomePointer->Method() je prováděno přes dříve uvolněný ukazatel.

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

V opraveném příkladu je pSomePointer nastaven na NULL okamžitě po uvolnění a podmínka, která ověřuje, zda je bezpečné volat pSomePointer->Method(), kontroluje tuto dodatečnou podmínku, aby se zabránilo možné chybě.

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

Další podrobnosti

Tento dotaz najdete v úložišti Microsoft GitHub CodeQL. Podrobnosti o tom, jak mohou vývojáři ovladačů systému Windows stáhnout a spustit CodeQL, najdete na stránce CodeQL and the Static Tools Logo Test.