Бөлісу құралы:


Использование безопасных целых чисел

Одним из способов минимизации проблем безопасности является предотвращение целочисленных переполнений и недополнений.

  • Целочисленные переполнения возникают, когда результат арифметической операции превышает объем памяти типа данных, предназначенного для его получения. Эта операция приводит к усечению целого числа и неправильному результату. Например, при сложении двух 32-разрядных целых чисел, в результате чего получается значение больше 2^31-1, результат ограничивается 32-разрядным целым числом, что может вызвать неожиданное поведение вашего кода.

  • Целочисленное переполнение снизу происходит, когда операция, как правило вычитание, дает неправильный результат. Например, если вычитать число из INT_MIN (наименьшее значение для 32-разрядного целого числа со знаком), результат усечен, чтобы поместиться в 32-разрядное целое число, что также может привести к неожиданному поведению.

  • Приведение между двумя типами данных также может привести к неправильным результатам из-за усечения результата, который не помещается в новое памятьное пространство.

Библиотека ntintsafe предоставляет набор функций C, выполняющих безопасные целочисленные арифметические операции с проверкой границ, чтобы предотвратить переполнения и недополнения в коде в режиме ядра. Все функции находятся в заголовочном файле ntintsafe.h, который поставляется с Windows Driver Kit (WDK). Эти функции соответствуют функциям Windows IntSafe, которые используются кодом приложения.

Эти функции используются для вычисления размера индекса или буфера или вычисления другой формы проверки границ. Функции оптимизированы для скорости.

Безопасные целые функции предлагают следующие преимущества:

  • Размер целевого буфера всегда предоставляется функции, чтобы убедиться, что функция не записывает данные в конце буфера.

  • Буферы гарантированно завершаются значением NULL, даже если операция усечет предполагаемый результат.

  • Все функции возвращают NTSTATUS с одним возможным кодом успешного выполнения (STATUS_SUCCESS) и одним возможным условием ошибки (STATUS_INTEGER_OVERFLOW). Например, NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); должен возвращать результат = -2 147 483 649, но это число не может быть представлено в 32-разрядном поле. Вместо этого result неопределен, а status — STATUS_INTEGER_OVERFLOW, который является значением состояния, возвращаемым для отчета о переполнениях и недостатках.

Библиотека ntintsafe имеет две категории функций:

  • Функции преобразования— эти функции выполняют преобразования между двумя типами данных.

  • Арифметические функции— эти функции выполняют операции сложения, вычитания и умножения для каждого типа данных.

Сводка по функциям безопасной работы с целыми числами Kernel-Mode

Импорт безопасных функций целых чисел Kernel-Mode