Desarrollo de C y C++ sin vulnerabilidades en la fabricación automotriz y los vehículos definidos por software (SDV)
23 de octubre de 2024
0 minutos de lecturaLa industria automotriz se encuentra en un momento decisivo de su historia con la llegada del vehículo definido por software (SDV). Durante el Congreso Mundial de la Society of Automotive Engineers (SAE), celebrado en Detroit del 16 al 18 de abril de 2024, se afirmó explícitamente que existe un mercado de más de 500 mil millones de dólares que recibirá inversiones en investigación y desarrollo, así como en avances tecnológicos para la industria automotriz. La transición a los SDV permitirá generar nuevas fuentes de ingresos mediante suscripciones a funciones y servicios que eran imposibles con el modelo tradicional de «compra única», propio de la industria automotriz desde sus inicios.
Los fabricantes de automóviles y sus proveedores se han propuesto convertirse en empresas tecnológicas, impulsadas por la arquitectura eléctrica/electrónica (E/E), con los semiconductores en el centro de estas innovaciones. Además, los microservicios, la arquitectura basada en contenedores y una importante presencia de computación en la nube son elementos fundamentales para habilitar los SDV.
Este sector depende casi exclusivamente del desarrollo de software en C y C++, lenguajes de programación confiables, eficientes y robustos. Sin embargo, estos lenguajes presentan riesgos de seguridad, como desbordamientos de búfer y problemas de seguridad de memoria, desde hace décadas. El mercado de los SDV está directamente relacionado con la misión de Snyk de proteger el software. Los fabricantes de automóviles se benefician de las soluciones de Snyk Infrastructure as Code (IaC) y Container, así como de la integración nativa de Snyk con varios proveedores de nube.
Por ejemplo, Mercedes está a la vanguardia con su sistema operativo MB.
Integramos rápidamente el mejor hardware disponible con el Qualcomm Gen4 8295, que se había puesto a disposición de los consumidores apenas seis meses antes. Fue un proyecto ambicioso y me enorgullece enormemente que el equipo haya aceptado el desafío, creado 20 GB de código compilado e incorporado esta versión preliminar de MB.OS al Clase E, porque lo aprendido es fundamental para el lanzamiento de nuestro MB.OS 1.0 completo.
Cumplimiento de MISRA para C y C++
Las directrices MISRA C:2023 se centran principalmente en la seguridad y la confiabilidad de los sistemas críticos, e incluyen aspectos relevantes para la seguridad de las aplicaciones, sobre todo cuando las vulnerabilidades pueden provocar riesgos de seguridad. Aunque las directrices MISRA C:2023 abarcan una amplia variedad de temas, algunas reglas y directivas son especialmente relevantes para reforzar la seguridad de las aplicaciones, ya que promueven prácticas que previenen el comportamiento indefinido, la corrupción de memoria, el acceso no autorizado y otras vulnerabilidades comunes.
Al igual que las directrices para C, la estructura y el contenido de la especificación MISRA C++:2023 presentan varias reglas y directivas relacionadas con la seguridad de las aplicaciones, junto con ejemplos de código conforme y no conforme.
Algunas directrices de cumplimiento de MISRA para el desarrollo en C y C++ citan directivas y reglas relacionadas con la seguridad de las aplicaciones y la creación de software seguro en C y C++, como las siguientes:
MISRA Dir 4.12 - No se debe usar la asignación dinámica de memoria: limitar la asignación dinámica de memoria puede prevenir una categoría de vulnerabilidades relacionadas con errores de administración de memoria.
MISRA Rule 1.3 - No debe haber comportamiento indefinido ni comportamiento no especificado crítico: el comportamiento indefinido puede provocar vulnerabilidades de seguridad, por lo que esta regla es fundamental.
MISRA Rule 18.1 - Un puntero resultante de una operación aritmética con un operando de tipo puntero debe apuntar a un elemento del mismo arreglo que ese operando: esta regla busca prevenir el acceso fuera de los límites, una vulnerabilidad común en los programas C.
MISRA Rule 21.3 - No se deben usar las funciones de asignación y liberación de memoria de <stdlib.h>: al igual que la directiva 4.12, evitar la asignación dinámica de memoria reduce los riesgos relacionados con las vulnerabilidades de administración de memoria.
MISRA Rule 22.1 a Rule 22.20 (Recursos): la administración adecuada de los recursos, incluido el manejo de errores y su liberación, es fundamental para prevenir fugas y agotamiento de recursos. Estos problemas pueden aprovecharse en ataques de denegación de servicio o provocar un comportamiento indefinido que los atacantes pueden explotar.
Aunque la especificación MISRA C no clasifica explícitamente sus directrices como medidas de «seguridad», cumplir sus reglas y directivas integrales mejora la postura de seguridad del software, pues elimina muchas fuentes comunes de vulnerabilidades en el código C y C++. Las directrices ayudan a desarrollar sistemas seguros y confiables al fomentar un comportamiento robusto y bien definido.
Por qué Snyk puede ayudarte
Snyk se dedica a ayudar a los desarrolladores a proteger su código, incluido el de quienes trabajan con C y C++. Al integrar la seguridad en el ciclo de vida del desarrollo, como en los métodos DevSecOps, Snyk permite detectar vulnerabilidades antes de que se conviertan en problemas críticos. Además, Snyk ayuda a detectar patrones de código inseguro al guardar el código en el IDE, sin tener que esperar a que finalicen los procesos de integración continua (CI) y compilación, ni a que se compile el código.
Con herramientas como Snyk Code, puedes analizar tus bases de código C y C++ para detectar vulnerabilidades y obtener información práctica para corregirlas.
Por ejemplo, considera una vulnerabilidad común en C++: el desbordamiento de búfer. Este es un fragmento de código sencillo que muestra el problema:
En este programa de C++, la función strcpy puede provocar un desbordamiento de búfer si la cadena de entrada supera el tamaño del búfer. Snyk puede ayudar a identificar estas vulnerabilidades y recomendar alternativas más seguras, como usar strncpy:
Pero al instalar Snyk en tu IDE, obtienes dos superpoderes:
Snyk detectará código vulnerable como este desbordamiento de búfer, sin necesidad de compilar.
Snyk te propondrá una corrección con Snyk Agent Fix.
¿Quieres ver esta magia en acción? Míralo aquí:

Al adoptar prácticas de programación segura y aprovechar herramientas como Snyk, los desarrolladores pueden reducir significativamente el riesgo de vulnerabilidades en sus bases de código C y C++. Regístrate en Snyk hoy mismo y empieza a proteger tus proyectos de software críticos.
Ejemplos de código C y C++ seguro y conforme, frente a código inseguro y vulnerable
Para mostrar cómo se relacionan las directrices y especificaciones de MISRA con el código y las vulnerabilidades del mundo real, analizaremos un programa en C, program2.c, que muestra un ejemplo de comportamiento no deseado (MISRA Rule 1.3) de la lista anterior.
Este es el código del programa en C:
La división entre cero es un comportamiento indefinido en C que puede generar resultados impredecibles. Como es lógico, las directrices MISRA prohíben estas operaciones para garantizar la seguridad del código en software crítico.
Primero compila el programa y luego ejecútalo:
Verás que el compilador GCC mostrará una advertencia sobre la división entre cero:
Sin embargo, este programa es sencillo y pequeño. En situaciones reales, puede ser difícil encontrar este tipo de problemas en una base de código grande y entre las muchas advertencias del compilador que se envían a la salida estándar.
Encuentra la vulnerabilidad con Snyk Code
Puede ser difícil detectar errores de comportamiento indefinido, como la _división entre cero_, y otros problemas a partir de las advertencias del compilador, además de que suelen aparecer tarde en el ciclo de desarrollo. Snyk Code puede ayudarte a identificarlos en una etapa temprana del ciclo de desarrollo, al analizar tu base de código en busca de vulnerabilidades antes de compilarlo.
Esto es posible porque Snyk emplea técnicas de aprendizaje automático en su motor de seguridad de aplicaciones para código estático, con el que entiende los flujos de llamadas del programa y conecta las rutas de código entre orígenes y destinos. Así encuentra código inseguro y posibles vulnerabilidades en tu base de código sin compilarlo.

Herramientas para el cumplimiento de seguridad y el código seguro en C y C++
Algunas opciones de código abierto para comprobar el cumplimiento de MISRA en código C y C++ son:
OpenMRC: OpenMRC es una herramienta de código abierto para comprobar las reglas MISRA-C, desarrollada como complemento de Eclipse CDT (C/C++ Development Tooling). Está diseñada para analizar código de vehículos definidos por software según las directrices MISRA-C:2004 y generar mensajes sobre infracciones para ayudar a los desarrolladores a actualizar el código fuente y cumplir con los requisitos de seguridad funcional.
Clang-misracpp2008: aunque este proyecto está archivado, su objetivo era crear una herramienta de código abierto para comprobar las reglas MISRA C++:2008 mediante la infraestructura LLVM/Clang. Aunque ya no está activo, sus desarrolladores recomiendan usar
clang-tidy-misracomo alternativa.clang-misracpp2008se implementó como un complemento de LLVM/Clang, lo que demuestra un esfuerzo por abarcar las reglas de MISRA C++ mediante lógica personalizada y las opciones que proporciona el compilador.
Además de las opciones anteriores, Snyk es otra alternativa que puedes explorar, tanto si buscas herramientas que se mantengan según tus estándares como si necesitas que cumplan con los controles de calidad y los umbrales integrales de tus pruebas de seguridad.
La plataforma de seguridad de Snyk incluye Snyk Code, una solución SAST en tiempo real, pensada para desarrolladores, que optimiza la seguridad del código con una experiencia fácil de usar. Los resultados de Snyk incluyen recursos de aprendizaje y ejemplos de correcciones para orientarte en la solución y, en ocasiones, incluso una corrección automática con Snyk Agent Fix.
Snyk es gratis y puedes usarlo de distintas formas para analizar código C y C++, por ejemplo, instalando la extensión de Snyk para IDE, importando repositorios Git de Bitbucket o GitHub, y usando Snyk CLI.
En los programas C y C++, otra posible fuente de vulnerabilidades en una base de código puede estar fuera del código del desarrollador: el código que se incorpora mediante bibliotecas de código abierto.
Por último, te recomiendo mucho las lecciones breves e interactivas de Snyk Learn sobre vulnerabilidades en C, que ofrecen experiencias de aprendizaje práctico sobre seguridad. Las lecciones abarcan distintas vulnerabilidades de C y C++, como la desreferencia de puntero nulo, la liberación doble, las malas prácticas de programación y otras.
Protege tu código con información de vanguardia
Conoce todas las funcionalidades de SAST de Snyk Code en solo 30 minutos.
