Procedimientos recomendados para la seguridad en C++

Este artículo contiene información sobre las herramientas y las prácticas de seguridad. Su uso no hace que las aplicaciones sean inmunes a los ataques, pero sí menos vulnerables.

Características de seguridad de Visual C++

Estas características de seguridad están integradas en el compilador y el enlazador de Microsoft C++:

/guard (Habilitar restricción de flujo de control)
Permite que el compilador analice el flujo de control para los destinos de llamada indirecta en tiempo de compilación y que después inserte código para verificar los destinos en tiempo de ejecución.

/GS (Comprobación de seguridad de búfer)
Indica al compilador que inserte código de detección de saturación en las funciones que presentan algún riesgo de seguridad. Cuando se detecta una saturación, se detiene la ejecución. Esta opción está activada de forma predeterminada.

/SAFESEH (La imagen tiene controladores de excepciones seguros)
Indica al vinculador que incluya en la imagen de salida una tabla que contenga la dirección de cada controlador de excepciones. En tiempo de ejecución, el sistema operativo utiliza esta tabla para asegurarse de que solo se ejecutan controladores de excepciones legítimos. Esto ayuda a impedir la ejecución de controladores de excepciones incluidos por un ataque malintencionado en tiempo de ejecución. De forma predeterminada, esta opción está desactivada.

/NXCOMPAT, /NXCOMPAT (Compatible con prevención de ejecución de datos) Estas opciones del compilador y el enlazador habilitan la compatibilidad con la prevención de ejecución de datos (DEP). DEP protege la CPU frente a la ejecución de páginas que no son de códigos.

/analyze (Code Analysis)
Esta opción del compilador activa el análisis de código que informa de posibles problemas de seguridad como saturaciones del búfer, memoria no inicializada, desreferenciación del puntero null y pérdidas de memoria. De forma predeterminada, esta opción está desactivada. Para obtener más información, consulte Información general de Code Analysis para C/C++.

/DYNAMICBASE (Usar selección aleatoria del diseño del espacio de direcciones)
Esta opción del vinculador permite compilar una imagen ejecutable que se puede cargar en diferentes ubicaciones de la memoria al comienzo de la ejecución. Esta opción también hace que la ubicación de la pila en la memoria sea menos predecible.

CRT con seguridad mejorada

La Biblioteca en tiempo de ejecución de C (CRT) se ha ampliado para incluir versiones seguras de funciones que presentan riesgos de seguridad; por ejemplo, la función de copia de cadena strcpy no comprobada. Puesto que las versiones anteriores no seguras de estas funciones están desusadas, producen advertencias en tiempo de compilación. Se recomienda usar las versiones seguras de estas funciones CRT en lugar de suprimir las advertencias de compilación. Para obtener más información, consulte Características de seguridad de CRT.

Biblioteca SafeInt

La biblioteca SafeInt Library ayuda a evitar los desbordamientos de enteros y otros errores explotables que se podrían producir cuando la aplicación realiza operaciones matemáticas. La biblioteca SafeInt incluye la clase SafeInt, la clase SafeIntException y varias funciones SafeInt.

La clase SafeInt protege ante el desbordamiento de enteros y los ataques de división por cero. Puede utilizarla para controlar las comparaciones entre valores de tipos diferentes. Proporciona dos directivas de control de errores. La directiva predeterminada es para que la clase SafeInt produzca una excepción de clase SafeIntException que indique por qué no se puede completar una operación matemática. La segunda directiva es para que la clase SafeInt detenga la ejecución de programas. También puede definir una directiva personalizada.

Cada función SafeInt protege una operación matemática ante un error explotable. Se pueden utilizar dos clases diferentes de parámetros sin convertirlos a mismo tipo. Para proteger varias operaciones matemáticas, utilice la clase SafeInt.

Checked Iterators

Un iterador comprobado aplica límites de contenedor. De forma predeterminada, cuando un iterador comprobado está fuera de los límites, genera una excepción y finaliza la ejecución de programas. Un iterador comprobado proporciona otros niveles de respuesta que dependen de valores asignados a definiciones del preprocesador como _SECURE_SCL_THROWS y _ITERATOR_DEBUG_LEVEL. Por ejemplo, en _ITERATOR_DEBUG_LEVEL=2, un iterador comprobado proporciona comprobaciones integrales de corrección en modo de depuración, que están disponibles mediante aserciones. Para obtener más información, consulte Iteradores comprobados y _ITERATOR_DEBUG_LEVEL.

Análisis de código para código administrado

Análisis de código para código administrado, también conocido como FxCop, comprueba si los ensamblados cumplen las instrucciones de diseño de .NET Framework. FxCop analiza el código y los metadatos de cada ensamblado para comprobar si hay defectos en las áreas siguientes:

  • Diseño de la biblioteca

  • Localización

  • Convenciones de nomenclatura

  • Rendimiento

  • Seguridad

Comprobador de aplicaciones para Windows

El Application Verifier (AppVerifier) puede ayudarle a identificar posibles incidencias de compatibilidad de aplicaciones, estabilidad y seguridad.

AppVerifier supervisa cómo una aplicación utiliza el sistema operativo. Inspecciona el sistema de archivos, el Registro, la memoria y las API mientras se ejecuta la aplicación, y recomienda correcciones del código fuente para los problemas que detecta.

Se puede utilizar AppVerifier para:

  • Comprobar posibles errores de compatibilidad de aplicaciones producidos por errores de programación frecuentes.

  • Examinar una aplicación para ver si tiene problemas relacionados con la memoria.

  • Identificar los problemas de seguridad potenciales de una aplicación.

Cuentas de usuario de Windows

El uso de cuentas de usuario de Windows que pertenecen al grupo Administradores expone a los desarrolladores (y, por extensión, a los clientes) a riesgos de seguridad. Para obtener más información, consulte Ejecutar como miembro del grupo de usuarios y Cómo el Control de cuentas de usuario (UAC) afecta a la aplicación.

Guía para canales laterales de ejecución especulativa

Para obtener información sobre cómo identificar y mitigar las vulnerabilidades de hardware ante canales laterales de ejecución especulativa en el software de C++, consulte Guía para desarrolladores de C++ para canales laterales de ejecución especulativa.

Consulte también

System.Security
Seguridad
Cómo el Control de cuentas de usuario (UAC) afecta a la aplicación