Aracılığıyla paylaş


UseAfterFree (Windows Sürücü Yazılımı CodeQL Sorgusu)

Genel Bakış

Bu CodeQL sorgusu , hata otomasyonuna yardımcı olan yüksek duyarlıklara sahiptir, ancak bazı sınırlamaları vardır ve bu nedenle UseAfterFree hatalarının tüm durumlarını algılayamaz.

"Bir UseAfterFree hatası, ayrılan bir bellek bloğu serbest bırakıldıktan sonra kullanıldığında (diğer adıyla 'sarkan işaretçi') oluşur."

Bu gibi durumlarda davranış tanımlanmamıştır ve uygulamada bellek bozulması, yanlış değerlerin kullanımı veya rastgele kod yürütme gibi istenmeyen sonuçlar doğurabilir.

Tavsiye

İşaretçileri boşaltıldıktan hemen sonra NULL olarak ayarlayın.

Örnek

Aşağıdaki örnekte, pSomePointer, yalnızca Status değeri sıfır değilse serbest bırakılır ve pSomePointer çağrılmadan önce Method başvurusu yapılacaksa Status tekrar kontrol edilir. Ne yazık ki Status, iki referans arasında pSomePointer değiştirilmiş, bu da pSomePointer->Method() çağrısının önceden serbest bırakılmış bir işaretçi üzerinden gerçekleştirilme olasılığını ortaya çıkarmaktadır.

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

Düzeltilen örnekte, pSomePointer serbest bırakıldıktan hemen sonra NULL olarak ayarlanır ve pSomePointer->Method() çağrısının güvenli olup olmadığını kontrol eden koşul, bu ek durumu dikkate alarak olası hatayı önlemeyi amaçlar.

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

Ek ayrıntılar

Bu sorgu Microsoft GitHub CodeQL deposunda bulunabilir. Windows Sürücüsü geliştiricilerinin CodeQL'i nasıl indirip çalıştırabileceği hakkında ayrıntılı bilgi için CodeQL ve Statik Araçlar Logo Testi sayfasına bakın.