Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una manera de minimizar los problemas de seguridad es evitar desbordamientos enteros y subflujos.
Los desbordamientos enteros se producen cuando el resultado de una operación aritmética es mayor que el espacio de memoria del tipo de datos establecido para recibirlo. Esta operación da como resultado el truncamiento del entero y un resultado incorrecto. Por ejemplo, si agrega dos enteros de 32 bits que dan como resultado un valor mayor que
2^31-1, el resultado se trunca para ajustarse al espacio entero de 32 bits, lo que puede provocar un comportamiento inesperado en el código.El subflujo entero se produce cuando una operación, normalmente resta, da un resultado incorrecto. Por ejemplo, si resta un número de INT_MIN (el valor más pequeño de un entero con signo de 32 bits), el resultado se trunca para ajustarse al espacio entero de 32 bits, lo que también puede provocar un comportamiento inesperado.
La conversión entre dos tipos de datos también puede provocar resultados incorrectos debido al truncamiento de un resultado que no se ajusta al nuevo espacio de memoria.
La biblioteca ntintsafe proporciona un conjunto de funciones de C que realizan operaciones aritméticas de enteros seguras con comprobaciones de límites para evitar desbordamientos y subflujos en código en modo kernel. Todas las funciones están en el archivo de encabezado ntintsafe.h , que se incluye con el Kit de controladores de Windows (WDK). Estas funciones corresponden a las funciones de Windows IntSafe que usa el código de aplicación.
Estas funciones se usan para calcular un tamaño de índice o búfer, o para calcular alguna otra forma de comprobación de límites. Las funciones están optimizadas para la velocidad.
Las funciones enteras seguras ofrecen las siguientes ventajas:
El tamaño del búfer de destino siempre se proporciona a la función para asegurarse de que la función no escribe más allá del final del búfer.
Se garantiza que los búferes terminan con un carácter nulo, incluso si la operación trunca el resultado previsto.
Todas las funciones devuelven un NTSTATUS, con solo un código correcto posible (STATUS_SUCCESS) y una posible condición de error (STATUS_INTEGER_OVERFLOW). Por ejemplo,
NTSTATUS status = RtlIntSub(INT_MIN, 1, &result);debe devolver un resultado = -2,147,483,649, pero este número no se puede representar en un campo de 32 bits. En su lugar,resultno está definido ystatuses STATUS_INTEGER_OVERFLOW, que es el valor de estado devuelto para notificar tanto desbordamientos como subflujos.
La biblioteca ntintsafe tiene dos categorías de funciones:
Funciones de conversión: estas funciones realizan conversiones entre dos tipos de datos.
Funciones aritméticas: estas funciones realizan operaciones de suma, resta y multiplicación para cada tipo de datos.