Bagikan melalui


Probable UseAfterFree (Windows Driver CodeQL Query)

Gambaran Umum

Kueri CodeQL ini memiliki presisi yang lebih rendah daripada kueri UseAfterFree CodeQL presisi tinggi. Ini mendeteksi beberapa skenario tambahan, tetapi juga memiliki tingkat positif palsu yang lebih tinggi.

Cacat UseAfterFree terjadi ketika blok memori yang dialokasikan digunakan setelah dibebaskan (juga dikenal sebagai "penunjuk menjuntai").

Perilaku dalam kasus seperti itu tidak terdefinisi dan dalam praktiknya mungkin memiliki konsekuensi yang tidak diinginkan termasuk kerusakan memori, penggunaan nilai yang salah, atau eksekusi kode arbitrer.

Rekomendasi

Atur penunjuk ke NULL segera setelah dibebersarkan.

Contoh

Dalam contoh berikut, pSomePointer dikosongkan hanya jika Status nilai bukan nol, dan sebelum dereferensi pSomePointer untuk memanggil Method, Status diperiksa lagi. Sayangnya Status diubah antara dua referensi menjadi pSomePointer, yang memungkinkan kemungkinan bahwa panggilan ke pSomePointer->Method() sedang dilakukan melalui pointer yang dibebaskan sebelumnya.

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

Dalam contoh yang dikoreksi, pSomePointer diatur ke NULL segera setelah dibebaskan, dan kondisi untuk memeriksa apakah aman untuk memanggil pSomePointer->Method() pemeriksaan untuk kondisi tambahan ini untuk mencegah kemungkinan bug.

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

Detail Tambahan

Kueri ini dapat ditemukan di repositori Microsoft GitHub CodeQL. Lihat halaman CodeQL dan Static Tools Logo Test untuk detail tentang bagaimana pengembang Driver Windows dapat mengunduh dan menjalankan CodeQL.