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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk