Uso de funciones de cadena segura
Muchos problemas de seguridad del sistema se deben a un mal control del búfer y a las saturaciones resultantes del búfer. El control deficiente del búfer suele estar asociado a las operaciones de manipulación de cadenas. Las funciones de manipulación de cadenas estándar proporcionadas por las bibliotecas del entorno de ejecución del lenguaje C/C++ (strcat, strcpy, sprintf, etc.) no impiden escribir más allá del final de los búferes.
Dos nuevos conjuntos de funciones de manipulación de cadenas, denominadas funciones de cadena seguras, proporcionan un procesamiento adicional para el control adecuado del búfer en el código. Estas funciones de cadena segura están disponibles en el Kit de controladores de Windows (WDK) y para Microsoft Windows XP SP1 y versiones posteriores del Kit de desarrollo de controladores (DDK) y Windows SDK. Están diseñados para reemplazar sus homólogos integrados de C/C++ y rutinas similares proporcionadas por Windows.
Un conjunto de funciones de cadena segura se usa en el código en modo kernel. Estas funciones se crean prototipos en un archivo de encabezado denominado Ntstrsafe.h. Este archivo de encabezado y una biblioteca asociada están disponibles en el WDK.
El otro conjunto de funciones de cadena segura se usa en aplicaciones en modo de usuario. Un archivo de encabezado correspondiente, Strsafe.h, contiene prototipos para estas funciones. Ese archivo y una biblioteca asociada están disponibles en Windows SDK. Para obtener más información sobre Strsafe.h, vea Uso de las funciones de Strsafe.h.
El conjunto de funciones de cadena seguras en modo kernel consta de los dos subconjuntos siguientes:
Funciones de cadena seguras para caracteres Unicode y ANSI
Cada una de estas funciones está disponible en una versión con sufijo W que admite caracteres Unicode de doble byte y una versión con sufijo A que admite caracteres ANSI de byte único. Por ejemplo, RtlStringCbCatN, que concatena dos cadenas y limita la longitud de la cadena anexada, está disponible como RtlStringCbCatNW y RtlStringCbCatNA.
Funciones de cadena seguras para estructuras de UNICODE_STRING
Cada una de estas funciones acepta una estructura de UNICODE_STRING como parámetro de entrada o salida o ambos. Por ejemplo, RtlStringCbCopyUnicodeString acepta la estructura como parámetro de entrada, RtlUnicodeStringCopyString acepta la estructura como parámetro de salida y RtlUnicodeStringCopy acepta la estructura como parámetro de entrada y salida.
Las funciones de cadena segura en modo kernel proporcionan las siguientes características:
Cada función de cadena segura recibe el tamaño del búfer de destino como entrada. Por lo tanto, la función puede asegurarse de que no escribe más allá del final del búfer.
Las funciones de cadena Unicode y ANSI finalizan todas las cadenas de salida con un carácter NULL, incluso si la operación trunca el resultado previsto.
Todas las funciones de cadena segura devuelven un valor NTSTATUS, con un solo código correcto posible (STATUS_SUCCESS).
La mayoría de las funciones de cadena seguras están disponibles tanto en una versión con recuento de bytes como en una versión con recuento de caracteres. Por ejemplo, RtlStringCbCata concatena dos cadenas con recuento de bytes y RtlStringCchCata concatena dos cadenas con recuento de caracteres.
La mayoría de las funciones de cadena seguras están disponibles en una versión extendida con sufijo Ex que proporciona funcionalidad adicional. Por ejemplo, RtlStringCbCatExa amplía la funcionalidad de RtlStringCbCata.
Esta sección contiene los siguientes temas: