UseAfterFree (CodeQL-fråga för Windows-drivrutin)

Översikt

Den här CodeQL-frågan har hög precision, vilket hjälper vid felautomatisering, men har vissa begränsningar och kan därför inte identifiera alla fall av UseAfterFree-defekter.

En UseAfterFree-defekt uppstår när ett allokerat minnesblock används efter att det har frigjorts (även kallat en "dinglande pekare").

Beteendet i sådana fall är odefinierat och kan i praktiken få oavsiktliga konsekvenser som minnesskada, användning av felaktiga värden eller godtycklig kodkörning.

Rekommendation

Sätt pekare till NULL omedelbart efter att de har frigjorts.

Exempel

I följande exempel frigörs pSomePointer endast om Status värdet inte är noll, och innan pSomePointer derefereras för att anropa Method, kontrolleras Status igen. Tyvärr Status ändrades mellan de två referenserna till pSomePointer, vilket gör det möjligt att anropet till pSomePointer->Method() utförs över en tidigare frigjord pekare.

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

I det korrigerade exemplet sätts pSomePointer till NULL omedelbart efter att det har frigjorts, och villkoret för att kontrollera om det är säkert att anropa pSomePointer->Method() kontrollerar det här ytterligare villkoret för att förhindra en möjlig bugg.

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

Ytterligare information

Den här frågan finns på Microsoft GitHub CodeQL-lagringsplatsen. Mer information om hur Windows Driver-utvecklare kan ladda ner och köra CodeQL finns på sidan CodeQL och testsidan för logotyper av statiska verktyg.