UseAfterFree (Kueri Windows Driver CodeQL)
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.