X
BLOG

No hay una buena razón para ignorar CERT C ++

No hay una buena razón para ignorar CERT C ++ Tiempo de leer: 4 minutos
Es realmente difícil encontrar una justificación para no seguir un estándar de codificación de seguridad como CERT C ++. Aquí, aprenda de qué se trata.

La seguridad se está convirtiendo en un nuevo mantra de los equipos de desarrollo de software, especialmente aquellos que son responsables de la seguridad o del software de misión crítica. En el pasado, la seguridad era a menudo una "característica" que los equipos intentaban agregar a los sistemas ya construidos, al final del ciclo de desarrollo (con frecuencia girando en círculos viciosos de pruebas y arreglos), pero hoy sabemos que La seguridad es una disciplina de ingeniería sólida respaldada por múltiples programas y estándares de investigación.

Si desea que su sistema sea seguro por diseño, debe comenzar desde el principio del proceso de desarrollo y asegurarse de que cada línea de código creado siga las mejores prácticas de seguridad. Para los equipos que desarrollan en C ++, una de las mejores opciones en las que confiar es el estándar SEI CERT C ++. Parasoft C / C ++test es la única herramienta que admite este estándar de manera integral y es la solución de cumplimiento y pruebas de seguridad más completa del mercado para código C y C ++.

Pautas de codificación CERT C ++ en números

El estándar SEI CERT C ++ introduce una colección de reglas para hacer cumplir las prácticas de codificación segura y eliminar las construcciones de código vulnerables. El estándar está organizado en 11 capítulos que contienen reglas en áreas temáticas específicas. A diferencia de CERT C, el estándar de codificación CERT C ++ solo tiene reglas y no recomendaciones (están pendientes de revisión y desarrollo adicionales). SEI CERT C ++ se basa en el estándar CERT C y abarca el subconjunto de reglas CERT C que se aplican a C ++. En este momento (tenga en cuenta que CERT son estándares de vida), hay 83 reglas CERT C ++ y 80 reglas heredadas de CERT C.La descripción general del estándar se presenta en la siguiente tabla:

A partir de la versión 10.4.1, la prueba Parasoft C / C ++ tiene soporte completo para las pautas de codificación CERT C ++. La configuración de prueba (“Reglas SEI CERT C ++”) habilita todos los verificadores del conjunto de reglas CERT C ++ original y los de CERT C que son aplicables para C ++, que es precisamente como CERT lo define para garantizar la seguridad de su base de código C ++. Las organizaciones que se desarrollan con C y C ++, incluidos los equipos que planean cambiar a C ++, ahora pueden confiar en una sola herramienta con informes consistentes.

Los equipos también se benefician de los informes de cumplimiento dedicados para CERT C y C ++, para crear un proceso de cumplimiento sostenible. Con las extensiones de informes, los usuarios pueden obtener una vista dinámica del proceso de cumplimiento y revisar las infracciones priorizadas de acuerdo con el marco de evaluación de riesgos del CERT.

El CERT atribuye cada infracción con una puntuación por los siguientes tres factores:

  • Gravedad
  • Probabilidad
  • Costo de remediación

La prioridad se calcula como un producto de estos tres factores y se divide en niveles: L1, L2 y L3. L1 representa infracciones de alta gravedad, con alta probabilidad y bajo costo de reparación. Estos son los que más nos interesa solucionar, ya que indican problemas graves que no son complicados de remediar. El uso del marco de calificación de CERT proporciona una gran ayuda para enfocar los esfuerzos y permitir que los equipos hagan el mejor uso de sus presupuestos de tiempo.

Además de los widgets, los exploradores de violaciones y un marco de calificación de riesgos que lo ayuda a orientarse rápidamente en el avance del proceso de cumplimiento, el marco de informes de Parasoft también le ahorra tiempo al generar automáticamente informes de cumplimiento que son adecuados para auditorías de código. Esta es una funcionalidad interesante si su organización es más formal con el proceso de desarrollo. Más información sobre el Marco de informes de cumplimiento del CERT en Arthur's blog relacionado.

¿Cómo puede beneficiarse de CERT C ++?

C ++ es un gran lenguaje, y si bien tiene muchas características del lenguaje OO moderno, lo que le permite diseñar sistemas complejos con patrones de diseño OO avanzados, también ofrece una gran eficiencia porque le permite acceder a la memoria directamente a través de punteros sin verificar si este acceso es correcto.

Por supuesto, estos beneficios tienen un precio. Con C ++, incluso los desarrolladores de software muy experimentados pueden crear código vulnerable, generalmente debido a problemas de administración y acceso a la memoria. Los desbordamientos de búfer, el uso de referencias colgantes y los desbordamientos de números enteros pueden conducir a un comportamiento indefinido, que puede explotarse de múltiples maneras. Un atacante puede intentar inyección de arco (transfiriendo maliciosamente el control al código existente en la memoria del proceso, que no sea el previsto) o código de inyección (inyectando código en la memoria del sistema en ejecución) para obtener control sobre un sistema con privilegios del programa comprometido, o peor aún, con un nivel de acceso al kernel. Una vez que se toma ese control, las pérdidas pueden ser devastadoras.

Entonces, ¿cómo podemos evitar que los atacantes penetren en nuestro sistema? No es posible tomar una base de código existente e intentar adivinar todas las posibles brechas de seguridad. La mejor opción disponible actualmente para los programadores de C / C ++ es, en primer lugar, crear código que esté libre de ciertas construcciones que han demostrado ser una fuente de brechas de seguridad.

Entonces, veamos una ilustración simple. El fragmento de código fuente a continuación se toma directamente del estándar CERT C ++ (regla EXP61-CPP).

auto g () {

  int i = 12; return [&] {i = 100; // Problema devuelve i; }; } void f () {

  int j = g () (); }

En este ejemplo, la función g () devuelve una lambda, que captura implícitamente la variable local automática "i" por referencia. Este código mal escrito tiene al menos una vulnerabilidad de seguridad cuando se devuelve lambda desde la llamada g (): la referencia que capturó se referirá a una variable cuya vida útil ha finalizado (la función g se ha ido). Como resultado, cuando la lambda se ejecuta en f (), el uso de la referencia colgante en los efectos lambda en un comportamiento indefinido. Este comportamiento indefinido puede aprovecharse para controlar el programa. La memoria que estaba ocupada por "i" dentro de la vida útil de la función g ya está liberada, y esta parte de la pila probablemente ya se haya reutilizado para otros fines, posiblemente una dirección de retorno de la llamada a la función, que cuando se sobrescribe se puede usar para ejecutar código arbitrario.

Esta vulnerabilidad específica es detectable por la regla, EXP61-CPP Un objeto lambda no debe sobrevivir a ninguno de sus objetos capturados de referencia. Por lo tanto, el código fuente que cumple con CERT C ++ no debería contener ninguna aparición de este problema.

CERT C ++ incluye muchas más reglas que pueden detectar problemas potenciales y lo ayudarán a promover prácticas de codificación seguras. Las pautas de codificación de seguridad, cuando se usan de manera consistente, pueden ayudar a fortalecer su código fuente y es la estrategia más efectiva para garantizar la seguridad general del sistema. Y en estos días, es realmente difícil encontrar una justificación para no seguir un estándar de codificación de seguridad como CERT C ++.

Pruebas de desarrollo unificadas para aplicaciones C y C ++

Escrito por

Miroslaw Zielinski

Gerente de producto para las soluciones de prueba integradas de Parasoft, las especialidades de Miroslaw incluyen C / C ++, RTOS, análisis de código estático, pruebas unitarias, gestión de la calidad del software para aplicaciones críticas de seguridad y cumplimiento del software con los estándares de seguridad.

Reciba las últimas noticias y recursos sobre pruebas de software en su bandeja de entrada.

Prueba Parasoft