MISRA C 2012 vs MISRA C2 - Cómo hacer el cambio
En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.
Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.
Aquí es donde el estándar de codificación C de MISRA puede ayudar. Las reglas, directrices y mejores prácticas establecidas por la norma permiten a los desarrolladores escribir un código C seguro y fiable para el desarrollo integrado.
MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar.
¿Qué es la norma de codificación MISRA C?
El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998, y era específico para el lenguaje C.
Sin embargo, desde entonces, el Consorcio MISRA también desarrolla normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.
C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que sólo tienen uno o dos niveles de abstracción sobre el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico.
Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?
MISRA C: 2012, también conocida como C3, se publicó por primera vez en abril de 2013. Basándose en el trabajo de miles de personas y organizaciones, la C3 añade nuevas normas, mejora la explicación y los antecedentes de algunas normas existentes y cierra algunas lagunas.
C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.
En general, esta es una lista de los cambios más significativos:
- Corregir los problemas encontrados en la versión de 2004.
- Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
- Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
- Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
- Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.
Las normas MISRA C en acción
Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.
Utilizar tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp
Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a la función con tipos de punteros incompatibles podría indicar un error.
Considere la siguiente imagen, tomada del documento oficial de cumplimiento de la MISRA. La regla es obligatoria, decidible y se aplica tanto a C90 como a C99.
Un ejemplo sigue a la descripción de la regla.
Como puede ver, dado que los objetos son de tipos diferentes (uint8_t y uint16_t), esta es una solución no conforme.
Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites
String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.
El ejemplo correspondiente es:
Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que sólo puede contener 5 caracteres. También tenemos un uso compatible y seguro de strcpy, donde la cadena sólo se copiará, si el contenido de "str" cabe.
Validar los datos recibidos externamente
La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:
- Leer de un archivo.
- Leer de una variable de entorno.
- Cualquier entrada del usuario.
- Cualquier cosa recibida a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.
Esta directiva entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.
Cómo cambiar a MISRA C 2012
El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:
- Cppcheck es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
- PC-lint Plus es una herramienta de pago que viene con un periodo de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
- CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.
También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.
Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C
El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en IEC.
Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles, e incluso disfrutar de una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.
¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.
En este post, compararemos la norma MISRA C 2012 con la C2, y le guiaremos a través del viaje de cambio a la nueva norma. Explicaremos por qué el cumplimiento de MISRA es necesario para construir sistemas embebidos seguros.
Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.
Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Reservar una demostraciónSecure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.
Secure Code Warrior crea una cultura de desarrolladores orientados a la seguridad, dotándoles de las habilidades necesarias para codificar de forma segura. Nuestro buque insignia es Agile Learning Platform , que ofrece itinerarios basados en habilidades relevantes, prácticas en missions y herramientas contextuales para que los desarrolladores aprendan, desarrollen y apliquen rápidamente sus habilidades para escribir código seguro a gran velocidad.
En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.
Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.
Aquí es donde el estándar de codificación C de MISRA puede ayudar. Las reglas, directrices y mejores prácticas establecidas por la norma permiten a los desarrolladores escribir un código C seguro y fiable para el desarrollo integrado.
MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar.
¿Qué es la norma de codificación MISRA C?
El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998, y era específico para el lenguaje C.
Sin embargo, desde entonces, el Consorcio MISRA también desarrolla normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.
C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que sólo tienen uno o dos niveles de abstracción sobre el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico.
Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?
MISRA C: 2012, también conocida como C3, se publicó por primera vez en abril de 2013. Basándose en el trabajo de miles de personas y organizaciones, la C3 añade nuevas normas, mejora la explicación y los antecedentes de algunas normas existentes y cierra algunas lagunas.
C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.
En general, esta es una lista de los cambios más significativos:
- Corregir los problemas encontrados en la versión de 2004.
- Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
- Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
- Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
- Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.
Las normas MISRA C en acción
Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.
Utilizar tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp
Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a la función con tipos de punteros incompatibles podría indicar un error.
Considere la siguiente imagen, tomada del documento oficial de cumplimiento de la MISRA. La regla es obligatoria, decidible y se aplica tanto a C90 como a C99.
Un ejemplo sigue a la descripción de la regla.
Como puede ver, dado que los objetos son de tipos diferentes (uint8_t y uint16_t), esta es una solución no conforme.
Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites
String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.
El ejemplo correspondiente es:
Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que sólo puede contener 5 caracteres. También tenemos un uso compatible y seguro de strcpy, donde la cadena sólo se copiará, si el contenido de "str" cabe.
Validar los datos recibidos externamente
La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:
- Leer de un archivo.
- Leer de una variable de entorno.
- Cualquier entrada del usuario.
- Cualquier cosa recibida a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.
Esta directiva entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.
Cómo cambiar a MISRA C 2012
El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:
- Cppcheck es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
- PC-lint Plus es una herramienta de pago que viene con un periodo de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
- CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.
También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.
Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C
El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en IEC.
Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles, e incluso disfrutar de una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.
¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.
En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.
Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.
Aquí es donde el estándar de codificación C de MISRA puede ayudar. Las reglas, directrices y mejores prácticas establecidas por la norma permiten a los desarrolladores escribir un código C seguro y fiable para el desarrollo integrado.
MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar.
¿Qué es la norma de codificación MISRA C?
El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998, y era específico para el lenguaje C.
Sin embargo, desde entonces, el Consorcio MISRA también desarrolla normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.
C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que sólo tienen uno o dos niveles de abstracción sobre el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico.
Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?
MISRA C: 2012, también conocida como C3, se publicó por primera vez en abril de 2013. Basándose en el trabajo de miles de personas y organizaciones, la C3 añade nuevas normas, mejora la explicación y los antecedentes de algunas normas existentes y cierra algunas lagunas.
C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.
En general, esta es una lista de los cambios más significativos:
- Corregir los problemas encontrados en la versión de 2004.
- Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
- Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
- Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
- Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.
Las normas MISRA C en acción
Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.
Utilizar tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp
Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a la función con tipos de punteros incompatibles podría indicar un error.
Considere la siguiente imagen, tomada del documento oficial de cumplimiento de la MISRA. La regla es obligatoria, decidible y se aplica tanto a C90 como a C99.
Un ejemplo sigue a la descripción de la regla.
Como puede ver, dado que los objetos son de tipos diferentes (uint8_t y uint16_t), esta es una solución no conforme.
Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites
String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.
El ejemplo correspondiente es:
Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que sólo puede contener 5 caracteres. También tenemos un uso compatible y seguro de strcpy, donde la cadena sólo se copiará, si el contenido de "str" cabe.
Validar los datos recibidos externamente
La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:
- Leer de un archivo.
- Leer de una variable de entorno.
- Cualquier entrada del usuario.
- Cualquier cosa recibida a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.
Esta directiva entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.
Cómo cambiar a MISRA C 2012
El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:
- Cppcheck es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
- PC-lint Plus es una herramienta de pago que viene con un periodo de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
- CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.
También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.
Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C
El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en IEC.
Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles, e incluso disfrutar de una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.
¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.
Haga clic en el siguiente enlace y descargue el PDF de este recurso.
Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Ver el informeReservar una demostraciónSecure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.
Secure Code Warrior crea una cultura de desarrolladores orientados a la seguridad, dotándoles de las habilidades necesarias para codificar de forma segura. Nuestro buque insignia es Agile Learning Platform , que ofrece itinerarios basados en habilidades relevantes, prácticas en missions y herramientas contextuales para que los desarrolladores aprendan, desarrollen y apliquen rápidamente sus habilidades para escribir código seguro a gran velocidad.
En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los gestores de seguridad en la construcción de sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, hablaremos de la norma MISRA C 2012, y de por qué su cumplimiento es necesario para construir sistemas embebidos seguros.
Al escribir código en C, es muy fácil implementar cosas que aparentemente parecen correctas, pero que son inherentemente incorrectas. Tu código puede compilar bien, e incluso funcionar bien durante un cierto periodo de tiempo. Pero el mismo código puede fallar, o mostrar un comportamiento indefinido, si el tamaño de la entrada y/o la memoria crecen. Por ejemplo, un número de entrada concreto puede hacer que un entero se desborde, o una secuencia de caracteres concreta puede hacer que un array se salga de los límites.
Aquí es donde el estándar de codificación C de MISRA puede ayudar. Las reglas, directrices y mejores prácticas establecidas por la norma permiten a los desarrolladores escribir un código C seguro y fiable para el desarrollo integrado.
MISRA C 2012, la última versión de la norma, añade nuevas reglas, mejora las existentes y resuelve algunas discrepancias. Si todavía está utilizando una versión anterior, ahora sería un buen momento para cambiar.
¿Qué es la norma de codificación MISRA C?
El estándar C de MISRA incluye directrices de seguridad de código, portabilidad y fiabilidad para el lenguaje de programación C. El primer conjunto de directrices se publicó en 1998, y era específico para el lenguaje C.
Sin embargo, desde entonces, el Consorcio MISRA también desarrolla normas de codificación para C++. Cada documento de MISRA C contiene un conjunto de normas, ejemplos no conformes y secciones detalladas sobre los antecedentes que contribuyeron al desarrollo de dichas normas.
C y C++ son los lenguajes más utilizados para desarrollar software embebido. Una de las principales razones es que son rápidos, ya que sólo tienen uno o dos niveles de abstracción sobre el lenguaje de máquina. Pero esto también significa que escribir código seguro, especialmente en C, es difícil y propenso a errores. Por ejemplo, en la mayoría de los lenguajes de alto nivel, como Java y C#, no hay que preocuparse por cosas triviales como la recolección de basura o el tipado dinámico.
Sin embargo, en C, no hay una forma predefinida de recoger la basura, es decir, si asignas un trozo de memoria para una estructura de datos, tienes que liberarla manualmente tú mismo, una vez que hayas terminado de usarla. Si no lo haces, C, a diferencia de otros lenguajes, no liberará la memoria por ti, lo que provocará una fuga de memoria.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - ¿Qué ha cambiado?
MISRA C: 2012, también conocida como C3, se publicó por primera vez en abril de 2013. Basándose en el trabajo de miles de personas y organizaciones, la C3 añade nuevas normas, mejora la explicación y los antecedentes de algunas normas existentes y cierra algunas lagunas.
C3 es compatible con la versión C99 del lenguaje, al tiempo que mantiene las reglas para la antigua ISO C90. El principal objetivo de C3 era reducir los costes habituales de la aplicación de las reglas, al tiempo que se hacía más seguro el uso del lenguaje C en los sistemas críticos. Todo esto hace que sea prudente cambiar a la nueva norma, si aún no lo ha hecho.
En general, esta es una lista de los cambios más significativos:
- Corregir los problemas encontrados en la versión de 2004.
- Aumentar significativamente el número de reglas decidibles . Una regla es decidible , si una herramienta de análisis puede ayudar a determinar la conformidad con ella.
- Las normas se clasifican en "obligatorias", "consultivas" y "de obligado cumplimiento". Las normas obligatorias no deben romperse nunca, bajo ninguna circunstancia. Las normas obligatorias y consultivas pueden ser violadas en situaciones especiales, siempre que la violación esté justificada.
- Se ha añadido una guía sobre cómo aplicar las reglas al código autogenerado. Esto es muy importante porque las mismas directrices del código escrito por humanos, no siempre se aplican al generado por una herramienta.
- Eliminar las reglas demasiado generalizadas que prohibían un comportamiento razonable del usuario. Por ejemplo, antes se recomendaba no utilizar macros en absoluto, ya que pueden provocar diversas dificultades y confusiones (no se pueden depurar las macros, las macros no tienen espacios de nombres, etc.). Esto impidió el uso de macros, incluso en situaciones en las que podrían proporcionar una solución elegante, segura y conveniente. En MISRA C: 2012, se introdujeron nuevas normas relativas a las macros, que permiten utilizarlas con cuidado, siempre que sea posible. Véase el siguiente extracto, tomado de un documento de MISRA C, que recomienda el uso de una macro en lugar de una función.
Las normas MISRA C en acción
Basta de hablar, ahora es el momento de poner en práctica algunas reglas de MISRA C, con ejemplos de su aplicación.
Utilizar tipos compatibles como argumentos de puntero para memcpy, memmove y memcmp
Las funciones de la biblioteca estándar memcpy, memmove y memcmp realizan un movimiento o comparación byte a byte del número de bytes especificado. La regla 21.15 de la norma MISRA C 2012 dicta que los dos parámetros de la función deben ser punteros del mismo tipo. Una llamada a la función con tipos de punteros incompatibles podría indicar un error.
Considere la siguiente imagen, tomada del documento oficial de cumplimiento de la MISRA. La regla es obligatoria, decidible y se aplica tanto a C90 como a C99.
Un ejemplo sigue a la descripción de la regla.
Como puede ver, dado que los objetos son de tipos diferentes (uint8_t y uint16_t), esta es una solución no conforme.
Las funciones de manejo de cadenas que no toman la longitud como entrada no deben dar lugar a un acceso fuera de límites
String handling functions from <string.h> that don’t take the length as an input, shouldn’t result in out-of-bound access. The relevant functions are: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, and strtok. The rule is mandatory, meaning it can never be breached, under any circumstances. It applies to both C90 and C99, and is undecidable.
El ejemplo correspondiente es:
Como puede ver, strcpy en la función f1, copiará más allá de la longitud de la cadena, que sólo puede contener 5 caracteres. También tenemos un uso compatible y seguro de strcpy, donde la cadena sólo se copiará, si el contenido de "str" cabe.
Validar los datos recibidos externamente
La Dir 4.14 recomienda comprobar la validez de los datos recibidos de fuentes "externas". Las entradas externas pueden ser:
- Leer de un archivo.
- Leer de una variable de entorno.
- Cualquier entrada del usuario.
- Cualquier cosa recibida a través de un canal de comunicación. Por ejemplo, a través de una conexión TCP o una API HTTP, etc.
Esta directiva entra en la categoría de requerida , y es aplicable tanto a C90 como a C99. El motivo es que un programa no tiene control sobre los datos recibidos de fuentes externas, lo que significa que estos datos pueden ser inválidos o maliciosos. Por ejemplo, un programa espera que el usuario introduzca un número, pero el usuario introduce una cadena. Antes de procesar la entrada, el programa debe verificar que se trata efectivamente de un número.
Cómo cambiar a MISRA C 2012
El cambio a MISRA C 2012 requerirá una actualización en su documento de directrices de codificación. Si no utiliza uno, y en su lugar confía en una herramienta de análisis estático (que es la opción recomendada), es posible que tenga que conseguir una versión más reciente de la herramienta. Aquí hay tres herramientas que comprueban el cumplimiento de MISRA C 2012:
- Cppcheck es una herramienta de código abierto que puede comprobar las reglas de MISRA y también detectar varios tipos de errores.
- PC-lint Plus es una herramienta de pago que viene con un periodo de evaluación de 30 días. Además de comprobar el cumplimiento de MISRA C, también puede ayudar a identificar posibles errores y vulnerabilidades.
- CodeSonar es otra herramienta que comprueba el cumplimiento de MISRA C y C++.
También hay algunos compiladores que pueden comprobar el cumplimiento de MISRA. En caso de que se detecte una infracción de la norma, se plantean las correspondientes advertencias o excepciones. Por ejemplo, Green Hills Software ofrece compiladores compatibles con todas las normas MISRA, tanto para arquitecturas de 32 como de 64 bits.
Utilización de Secure Code Warrior para mejorar la formación de los desarrolladores en MISRA C
El producto estrella deSecure Code Warrior- learning platform - tiene numerosos retos interactivos, courses, y evaluaciones que pueden ayudar a entrenar a los desarrolladores a escribir código C/C++ seguro. El contenido de la plataforma es específico del marco de trabajo y muy atractivo. Nuestros retos de codificación en C/C++:Embed se inspiraron tanto en MISRA C, como en AUTOSAR C++ (MISRA C++) y en IEC.
Los desarrolladores pueden embarcarse en viajes de aprendizaje personalizados, en los que identifican las vulnerabilidades específicas de C/C++ y, lo que es más importante, aprenden a corregir esos errores. En este proceso, los desarrolladores pueden hacer un seguimiento de su progreso para identificar sus puntos débiles, e incluso disfrutar de una competición amistosa de codificación con sus compañeros. Descubra más sobre cómo ayudamos a las industrias de la automoción y el transporte con nuestras soluciones.
¿Quieres descubrir lo interactivos y enfocados que son nuestros retos? Prueba algunos de los retos de C/C++:Embed en learning platform hoy mismo.
Índice
Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.
Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.
Reservar una demostraciónDescargarRecursos para empezar
Evaluación comparativa de las competencias en materia de seguridad: optimización del diseño seguro en la empresa
El movimiento Secure-by-Design es el futuro del desarrollo de software seguro. Conozca los elementos clave que las empresas deben tener en cuenta cuando piensan en una iniciativa Secure-by-Design.
DigitalOcean reduce su deuda de seguridad con Secure Code Warrior
El uso por parte de DigitalOcean de la formación Secure Code Warrior ha reducido significativamente la deuda de seguridad, permitiendo a los equipos centrarse más en la innovación y la productividad. La mejora de la seguridad ha reforzado la calidad de sus productos y su ventaja competitiva. De cara al futuro, SCW Trust Score les ayudará a seguir mejorando las prácticas de seguridad y a continuar impulsando la innovación.
Recursos para empezar
La puntuación de confianza revela el valor de las iniciativas de mejora de la seguridad mediante el diseño
Nuestra investigación ha demostrado que la formación en código seguro funciona. Trust Score, que utiliza un algoritmo basado en más de 20 millones de puntos de datos de aprendizaje procedentes del trabajo de más de 250 000 alumnos en más de 600 organizaciones, revela su eficacia a la hora de reducir las vulnerabilidades y cómo hacer que la iniciativa sea aún más eficaz.
Seguridad reactiva frente a seguridad preventiva: Prevenir es mejor que curar
La idea de introducir la seguridad preventiva en el código y los sistemas heredados al mismo tiempo que en las aplicaciones más recientes puede parecer desalentadora, pero un planteamiento basado en el diseño seguro, aplicado mediante la mejora de las competencias de los desarrolladores, puede aplicar las mejores prácticas de seguridad a esos sistemas. Es la mejor oportunidad que tienen muchas organizaciones de mejorar su seguridad.
Ventajas de la evaluación comparativa de las competencias de seguridad de los desarrolladores
La creciente atención que se presta al código seguro y a los principios del diseño seguro exige que los desarrolladores reciban formación en ciberseguridad desde el principio del proceso de desarrollo de software, con herramientas como Secure Code Warrior's Trust Score, que ayudan a medir y mejorar sus progresos.
Impulsando iniciativas de seguridad por diseño para empresas con éxito significativo
Nuestro último documento de investigación, Benchmarking Security Skills: Streamlining Secure-by-Design in the Enterprise, es el resultado de un análisis profundo de iniciativas reales de Secure-by-Design a nivel empresarial y de la derivación de enfoques de mejores prácticas basados en hallazgos basados en datos.