Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Gambaran Umum
Kueri CodeQL ini memiliki presisi tinggi, yang membantu dalam otomatisasi bug, tetapi memiliki beberapa batasan dan oleh karena itu tidak akan dapat mendeteksi semua kasus cacat UseAfterFree.
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.