Inicio Artículos Software embebido seguro – Cómo escoger el estándar de programación adecuado

Software embebido seguro – Cómo escoger el estándar de programación adecuado

El número de productos de nuestra vida diaria con conexión a Internet está en aumento, lo cual aporta numerosas ventajas, pero también introduce vulnerabilidades potenciales de seguridad. Es imprescindible que el desarrollo del software instalado en estos productos tenga en cuenta la seguridad. La adopción de un potente estándar de programación que aborda vulnerabilidades seguridad conocidas ha demostrado su capacidad de ofrecer productos más seguros. El cumplimiento de este estándar con herramientas de análisis automático de código ayudará a garantizar que los productos se finalicen puntualmente y dentro del presupuesto. El ritmo de cambio en los productos de consumo es impresionante y la velocidad de innovación sigue creciendo.
Una nueva generación de dispositivos conectados y servicios con una orientación social sigue influyendo poderosamente sobre nuestras vidas, desde el uso de altavoces activados mediante voz para controlar nuestros hogares inteligentes hasta los centenares de sensores utilizados para controlar con mayor eficacia el tráfico de nuestras ciudades. La adopción generalizada de dispositivos conectados hace que surjan preocupaciones acerca de su seguridad y nuestra privacidad. La seguridad del software es un tema candente que toda organización debe afrontar eficazmente. C continúa siendo el lenguaje dominante para el desarrollo de software embebido en productos de consumo a la vez que va aumentando la popularidad de C++. Este artículo compara los estándares de programación más avanzados y explica cómo su cumplimiento puede ayudar a los desarrolladores a ofrecer código C y C++ más seguro. No hay atajos para lograr la seguridad del software; reducir el riesgo que representa exige un esfuerzo concertado y un reconocimiento de las directrices de mejores prácticas en el sector.
Estándares de programación para un desarrollo seguro
Aplicar estándares de programación al desarrollo de software crítico para la seguridad es una práctica ampliamente adoptada, pero los estándares de programación dirigidos a aspectos de seguridad aún son relativamente nuevos. La demanda de estándares de seguridad del software ha aumentado como resultado del Internet de las Cosas (Internet of Things, IoT); la seguridad de los datos y las conexiones entre dispositivos han demostrado tener serios fallos de seguridad. Algunos ejemplos de fallos de perfil alto son el pirateo de cámaras de vigilancia de TrendNet y el fallo de los termostatos Nest debido a una actualización incorrecta del software. Las brechas de seguridad y privacidad no solo ponen en peligro a los usuarios, sino que también pueden dañar significativamente la reputación de una compañía. Por tanto, la seguridad es un requisito imprescindible.
El reconocimiento de la importancia de la seguridad ha ido en aumento a lo largo de los últimos años; de ahí que hayan surgido nuevos estándares de programación centrados en la seguridad y estándares críticos para la seguridad con una mayor madurez. Aunque los objetivos subyacentes son distintos, sus recomendaciones a menudo se solapan. La mayoría de estándares de programación citados en este artículo utilizan reglas para bloquear aspectos de un lenguaje que se consideren inapropiados por el organismo de estandarización. Además, establecer formas de enriquecer el proceso de desarrollo y la efectividad del lenguaje. De alguna manera, definen un nuevo lenguaje y ponen especial énfasis en proporcionar una mayor seguridad, mejorar la previsibilidad, aumentar la robustez y mejorar su mantenimiento. En la actualidad, los estándares de programación para seguridad más populares son el Estándar de Programación Segura CERT C, MISRA C:2012 y las Reglas de Programación Segura de C (ISO/IEC TS 17961:2013).
Comparación
Para comparar los estándares de programación contemplados en este artículo se han evaluado nueve categorías, algunas de las cuales ofrecen una indicación cualitativa sobre el cumplimiento de los estándares de programación. El indicador de sus prestaciones (1 a 3 estrellas) se obtiene a partir de consideraciones y opiniones recogidas por PRQA a partir de su amplia base de clientes que se puede valorar como un respaldo oficial a cualquier estándar. Hemos dividido los estándares en las siguientes categorías:

  1. Industria: El sector industrial al que se dirige el estándar de programación.
  2. Versión del lenguaje de referencia: La versión del Estándar C utilizado actualmente como referencia para las directrices de programación. Esto es importante ya que puede influir sobre la elección del estándar de programación para un proyecto; por ejemplo, si se va a utilizar C11 (puede ser porque algunas de sus características sean las más adecuadas para una determinada aplicación) MISRA C:2012 no es un buen candidato a menos que sea necesario cumplir determinados requisitos.
  3. Aplicabilidad automática: La facilidad de creación de comprobaciones automáticas para directrices que no dan como resultado falsos positivos. Esto se refiere habitualmente a la definición estricta o vaga de determinadas directrices.
  4. Cobertura: Una indicación cualitativa del ámbito cubierto por el estándar de programación y el número de directrices definidas. Cuanto más amplio sea el ámbito, mayor es el valor educativo del estándar de programación, pero un ámbito amplio también puede añadir complejidad en cuanto a mantenimiento de directrices y cobertura de herramientas.
  5. Adopción en el mercado: El nivel de uso del estándar de programación para proyectos del mundo real por lo que se refiere a los requisitos de cumplimiento formal (por ejemplo, en aplicaciones de seguridad funcional) y uso voluntario para mejorar la calidad del software en general.
  6. Disponibilidad de herramientas: La disponibilidad en el mercado de herramientas de análisis automático de código para cumplir el estándar de programación. (Esto suele estar relacionado con el nivel de adopción del estándar en el mercado).
  7. Evolución: Un estándar que evolucione con rapidez se adapta mejor a la reacción de los usuarios y ofrece una introducción más rápida de nuevas funciones. Esto se puede considerar bueno para los productos de consumo pero malo para otros sectores. CERT C utiliza dos métodos para publicar sus directrices: una wiki basada en web y un documento PDF disponible gratuitamente. La wiki evoluciona con más rapidez que el documento.
  8. Recursos: Pueden incluir referencias al estándar de lenguaje C, a otros estándares, estudios, artículos u otras bases de conocimientos que puedan ser de ayuda.
  9. Ejemplos: Descripciones para ilustrar los aspectos relacionados con la violación de una determinada directriz y de soluciones compatibles. La tabla muestra una comparativa que cubre los tres estándares de programación y cómo responden a las categorías antes citadas.

Elección del estándar adecuado
No existe un solo estándar que sea el mejor para una programación segura. La selección debe tener en cuenta numerosos aspectos, como la duración del proyecto (donde la estabilidad de la referencia es más importante), la versión del lenguaje utilizada y la existencia de código antiguo. El diagrama de flujo mostrado a continuación puede ayudar a tomar una elección informada.
Escenario 1
Si los requisitos exigen el cumplimiento de un estándar de programación reconocido (un escenario típico sería una aplicación de seguridad crítica) la elección sería MISRA C. La versión más reciente de este estándar es MISRA C:2012 Revisión 1. Si se exige cumplir una versión anterior de MISRA (por ejemplo, MISRA C:2004) el proyecto se verá beneficiado con la incorporación de las reglas de seguridad proporcionadas por ISO/ IEC 17961:2013 (hará falta algunos trabajos para adaptar la versión C y eliminar cualquier solapamiento; una buena base sería el Anexo 2 de MISRA C:2012 “Cobertura de MISRA C:2012 frente a ISO/IEC 17961:2012 C Seguro”).
Escenario 2
Si la aplicación no exige cumplimiento, y las prestaciones necesarias no son tan altas como para sacrificar la portabilidad de código, sigue siendo recomendable para adoptar una perspectiva de alta integridad. En este caso, la recomendación también sería utilizar MISRA C:2012.
Escenario 3
 En los dos escenarios anteriores, CERT C ofrecería un valioso soporte desde el punto de vista de la seguridad, y la recomendación sería adoptar CERT C en paralelo a los estándares sugeridos (en el diagrama de flujo se indica con una línea de puntos). Sin embargo, si el enfoque no es de alta integridad, el estándar MISRA C:2012 se podría considerar demasiado restrictivo para cada aplicación; en este caso, la recomendación sería aplicar únicamente CERT C con el fin de lograr un buen nivel de seguridad del código.
Conclusiones
La elección del estándar de programación adecuado a adoptar cuando se desarrolla código seguro dependerá de muchos factores, como entender las características y las ventajas de cada estándar y cómo cumplirían los requisitos del proyecto de desarrollo actual. El proceso mostrado en este artículo se centra en la capacidad de realizar pruebas automáticas con herramientas como los analizadores estáticos QA•C y QA•C++ de PRQA. Estas herramientas realizan un análisis profundo del código de software para prevenir, detectar y eliminar defectos y aplicar automáticamente las reglas de programación con el fin de asegurar el cumplimiento de los estándares.