Bagikan melalui


Pengungkapan Informasi Byte Padding (Kueri Windows Driver CodeQL)

Gambaran Umum

Struct atau kelas yang baru dialokasikan yang diinisialisasi setiap anggotanya dapat membocorkan informasi jika termasuk byte padding.

Rekomendasi

Pastikan semua byte yang digunakan untuk padding di struktur atau kelas sudah diinisialisasi.

Jika memungkinkan, gunakan memset untuk menginisialisasi seluruh struktur/kelas.

Contoh

Contoh berikut menunjukkan skenario di mana padding antara elemen pertama dan kedua tidak diinisialisasi:

typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn() 
{
	// BAD: Padding between the first and second elements not initialized.
	MyStruct myBadStackStruct = { Unknown };
	return myBadStackStruct;
}

Untuk memperbaikinya, kami akan menginisialisasi semua byte menggunakan memset:

typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn()
{
	// GOOD: All padding bytes initialized
	MyStruct* myGoodHeapStruct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
	memset(myGoodHeapStruct, 0, sizeof(struct MyStruct));
	return *myGoodHeapStruct;
}

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.