Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.