Правило UnSafeAllocatePool (kmdf)
Правило UnSafeAllocatePool — это важное правило безопасности, которое проверяет, не использует ли драйвер устаревшие DIS для выделения памяти.
Правило UnsafeAllocatePool указывает, что драйвер не должен вызывать:
Это правило доступно в предварительных сборках WDK 20236 и более поздних версий.
Обновления драйверов для версий Windows 10 версии 2004 и более поздних версий
Если вы создаете драйвер, предназначенный для Windows 10 версии 2004 и более поздних версий, используйте вместо них API ExAllocatePool2 и ExAllocatePool3.
Старый API | Новый API |
---|---|
ExAllocatePool | ExAllocatePool2 |
ExAllocatePoolWithTag | ExAllocatePool2 |
ExAllocatePoolWithQuota | ExAllocatePool2 |
ExAllocatePoolWithQuotaTag | ExAllocatePool2 |
ExAllocatePoolWithTagPriority | ExAllocatePool3 |
Новые API не будут выделять пулы по умолчанию, чтобы избежать возможных ошибок раскрытия памяти.
ExAllocatePool/ExAllocatePoolWithTag
// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED, 100, 'abcd');
Старые API выделения пула принимают аргумент POOL_TYPE , но новые API выделения принимают аргумент POOL_FLAGS . Обновите любой связанный код, чтобы использовать новый аргумент POOL_FLAGS .
ExAllocatePoolWithQuota/ExAllocatePoolWithQuotaTag
Теперь новая функция будет возвращать значение NULL при сбое выделения по умолчанию. Чтобы распределител вызвал исключение при сбое, необходимо передать флаг POOL_FLAG_RAISE_ON_FAILURE, как описано в ExAllocatePool2.
// Old code
PVOID Allocation = ExAllocatePoolWithQuotaTag(PagedPool | POOL_QUOTA_FAIL_INSTEAD_OF_RAISE, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED | POOL_FLAG_USE_QUOTA, 100, 'abcd');
ExAllocatePoolWithTagPriority
// Old code
PVOID Allocation = ExAllocatePoolWithTagPriority(PagedPool, 100, 'abcd', HighPoolPriority);
RtlZeroMemory(Allocation, 100);
// New code
POOL_EXTENDED_PARAMETER params = {0};
params.Type = PoolExtendedParameterPriority;
params.Priority = HighPoolPriority;
PVOID Allocation = ExAllocatePool3(POOL_FLAG_PAGED, 100, 'abcd', ¶ms, 1);
Обновления драйверов для версий Windows до Windows 10 версии 2004
Если вы создаете драйвер, предназначенный для версий Windows до Windows 10 версии 2004, необходимо использовать следующие встроенные функции-оболочки.
Кроме того, перед вызовом функций выделения пула необходимо #define POOL_ZERO_DOWN_LEVEL_SUPPORT и вызвать ExInitializeDriverRuntime во время инициализации драйвера.
Локально определенные встроенные функции
PVOID
NTAPI
ExAllocatePoolZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
)
PVOID
NTAPI
ExAllocatePoolQuotaZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
)
PVOID
NTAPI
ExAllocatePoolPriorityZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag,
_In_ EX_POOL_PRIORITY Priority
)
Код реализации для этих оболочек кода см. в последнем заголовке wdm.h. Например, это реализация exAllocatePoolPriorityZero, показывающая использование RtlZeroMemory.
{
PVOID Allocation;
Allocation = ExAllocatePoolWithTagPriority((POOL_TYPE) (PoolType | POOL_ZERO_ALLOCATION),
NumberOfBytes,
Tag,
Priority);
#if defined(POOL_ZERO_DOWN_LEVEL_SUPPORT)
if ((!ExPoolZeroingNativelySupported) && (Allocation != NULL)) {
RtlZeroMemory(Allocation, NumberOfBytes);
}
#endif
return Allocation;
}
Сопоставление старых API с новыми API
Старый API | Новый API |
---|---|
ExAllocatePool | ExAllocatePoolZero |
ExAllocatePoolWithTag | ExAllocatePoolZero |
ExAllocatePoolWithQuota | ExAllocatePoolQuotaZero |
ExAllocatePoolWithQuotaTag | ExAllocatePoolQuotaZero |
ExAllocatePoolWithTagPriority | ExAllocatePoolPriorityZero |
Пример
// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
// Before headers are pulled in (or compiler defined)
#define POOL_ZERO_DOWN_LEVEL_SUPPORT
// Once during driver initialization
// Argument can be any value
ExInitializeDriverRuntime(0);
// Replacement for each pool allocation
PVOID Allocation = ExAllocatePoolZero(PagedPool, 100, 'abcd');
Модель драйвера: WDF
Как тестировать
Во время компиляции:
Запустите средство проверки статических драйверов и укажите правило UnSafeAllocatePool .
Чтобы выполнить анализ кода, выполните следующие действия (см . статью Использование средства проверки статических драйверов для поиска дефектов в драйверах Windows).
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах.