MISRA C 2012 vs MISRA C2 - Comment passer d'une version à l'autre ?
Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.
Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.
C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué.
MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre.
Qu'est-ce que la norme de codage MISRA C ?
La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998.
Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.
C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique.
Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?
MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.
C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.
Dans l'ensemble, voici une liste des changements les plus significatifs :
- Corriger les problèmes rencontrés dans la version 2004.
- Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
- Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
- Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
- Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.
Les règles de MISRA C en action
Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.
Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp
Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur.
Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.
Un exemple suit la description de la règle.
Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.
Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites
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.
L'exemple correspondant est le suivant :
Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.
Valider les données reçues de l'extérieur
La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être
- Lecture d'un fichier.
- Lecture d'une variable d'environnement.
- Toute entrée de l'utilisateur.
- Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.
Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.
Comment passer à MISRA C 2012
Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :
- Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
- PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
- CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.
Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.
Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C
Secure Code WarriorLe produit phare de la société - learning platform - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.
Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.
Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site learning platform dès aujourd'hui !
Dans cet article, nous allons comparer la norme MISRA C 2012 avec la norme C2, et vous guider dans le passage à la nouvelle norme. Nous expliquerons pourquoi la conformité à la norme MISRA est nécessaire pour construire des systèmes embarqués sécurisés.
Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.
Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Réservez une démonstrationSecure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.
Secure Code Warrior crée une culture de développeurs axés sur la sécurité en leur donnant les compétences nécessaires pour coder de manière sécurisée. Notre programme phare Agile Learning Platform propose des parcours pertinents basés sur les compétences, des exercices pratiques missions et des outils contextuels permettant aux développeurs d'apprendre, de développer et d'appliquer rapidement leurs compétences pour écrire du code sécurisé.
Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.
Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.
C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué.
MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre.
Qu'est-ce que la norme de codage MISRA C ?
La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998.
Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.
C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique.
Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?
MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.
C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.
Dans l'ensemble, voici une liste des changements les plus significatifs :
- Corriger les problèmes rencontrés dans la version 2004.
- Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
- Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
- Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
- Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.
Les règles de MISRA C en action
Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.
Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp
Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur.
Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.
Un exemple suit la description de la règle.
Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.
Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites
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.
L'exemple correspondant est le suivant :
Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.
Valider les données reçues de l'extérieur
La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être
- Lecture d'un fichier.
- Lecture d'une variable d'environnement.
- Toute entrée de l'utilisateur.
- Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.
Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.
Comment passer à MISRA C 2012
Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :
- Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
- PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
- CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.
Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.
Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C
Secure Code WarriorLe produit phare de la société - learning platform - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.
Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.
Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site learning platform dès aujourd'hui !
Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.
Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.
C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué.
MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre.
Qu'est-ce que la norme de codage MISRA C ?
La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998.
Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.
C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique.
Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?
MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.
C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.
Dans l'ensemble, voici une liste des changements les plus significatifs :
- Corriger les problèmes rencontrés dans la version 2004.
- Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
- Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
- Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
- Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.
Les règles de MISRA C en action
Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.
Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp
Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur.
Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.
Un exemple suit la description de la règle.
Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.
Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites
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.
L'exemple correspondant est le suivant :
Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.
Valider les données reçues de l'extérieur
La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être
- Lecture d'un fichier.
- Lecture d'une variable d'environnement.
- Toute entrée de l'utilisateur.
- Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.
Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.
Comment passer à MISRA C 2012
Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :
- Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
- PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
- CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.
Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.
Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C
Secure Code WarriorLe produit phare de la société - learning platform - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.
Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.
Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site learning platform dès aujourd'hui !
Cliquez sur le lien ci-dessous et téléchargez le PDF de cette ressource.
Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Voir le rapportRéservez une démonstrationSecure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.
Secure Code Warrior crée une culture de développeurs axés sur la sécurité en leur donnant les compétences nécessaires pour coder de manière sécurisée. Notre programme phare Agile Learning Platform propose des parcours pertinents basés sur les compétences, des exercices pratiques missions et des outils contextuels permettant aux développeurs d'apprendre, de développer et d'appliquer rapidement leurs compétences pour écrire du code sécurisé.
Sur Secure Code Warrior, nous cherchons toujours à étendre notre couverture de formation. Pour permettre aux développeurs de systèmes embarqués et aux responsables de la sécurité de construire des systèmes embarqués sûrs, nous nous intéressons au monde de la sécurité des systèmes embarqués. Dans ce billet, nous parlerons de la norme MISRA C 2012 et des raisons pour lesquelles sa conformité est nécessaire pour construire des systèmes embarqués sécurisés.
Lorsque vous écrivez du code en C, il est très facile de mettre en œuvre des choses qui semblent correctes, mais qui sont intrinsèquement erronées. Votre code peut se compiler parfaitement et même fonctionner correctement pendant un certain temps. Mais ce même code peut se bloquer ou présenter un comportement indéfini si la taille de vos données d'entrée et/ou la mémoire augmentent. Par exemple, un nombre particulier en entrée peut faire déborder un nombre entier, ou une séquence particulière de caractères peut faire sortir un tableau de ses limites.
C'est là que la norme de codage C MISRA peut vous aider. Les règles, les lignes directrices et les meilleures pratiques définies par la norme permettent aux développeurs d'écrire un code C sûr et fiable pour le développement embarqué.
MISRA C 2012, la dernière version de la norme, ajoute de nouvelles règles, améliore les règles existantes et corrige certaines divergences. Si vous utilisez encore une version plus ancienne, c'est le moment idéal pour passer à une autre.
Qu'est-ce que la norme de codage MISRA C ?
La norme MISRA C comprend des lignes directrices en matière de sécurité du code, de portabilité et de fiabilité pour le langage de programmation C. La première série de lignes directrices a été publiée en 1998. La première série de lignes directrices, spécifique au langage C, a été publiée en 1998.
Toutefois, depuis lors, le consortium MISRA développe également des normes de codage pour C++. Chaque document MISRA C contient un ensemble de règles, des exemples de non-conformité et des sections détaillées sur les informations de base qui ont contribué à l'élaboration de ces règles.
C et C++ sont les langages les plus utilisés pour développer des logiciels embarqués. L'une des principales raisons est qu'ils sont rapides, n'ayant qu'un ou deux niveaux d'abstraction par rapport au langage machine. Mais cela signifie également qu'il est difficile d'écrire un code sûr, en particulier en C, et qu'il est sujet à des erreurs. Par exemple, dans la plupart des langages de haut niveau comme Java et C#, vous n'avez pas à vous préoccuper de choses triviales comme le ramassage des ordures ou le typage dynamique.
Cependant, en C, il n'existe pas de méthode prédéfinie pour collecter les déchets, c'est-à-dire que si vous allouez un morceau de mémoire à une structure de données, vous devez le libérer manuellement vous-même, une fois que vous avez fini de l'utiliser. Si vous ne le faites pas, le langage C, contrairement à d'autres langages, ne libérera pas la mémoire pour vous, ce qui entraînera une fuite de mémoire.
MISRA C 2004 (C2) vs. MISRA C 2012 (C3) - Qu'est-ce qui a changé ?
MISRA C : 2012, également connue sous le nom de C3, a été publiée pour la première fois en avril 2013. S'appuyant sur les travaux de milliers de personnes et d'organisations, C3 ajoute de nouvelles règles, améliore l'explication et le contexte de certaines règles existantes et comble certaines lacunes.
C3 prend en charge la version C99 du langage, tout en conservant des règles pour l'ancienne version ISO C90. L'objectif principal de C3 était de réduire les coûts habituels liés à l'application des règles, tout en rendant l'utilisation du langage C plus sûre dans les systèmes critiques. Il est donc prudent de passer à la nouvelle norme, si vous ne l'avez pas encore fait.
Dans l'ensemble, voici une liste des changements les plus significatifs :
- Corriger les problèmes rencontrés dans la version 2004.
- Augmenter de manière significative le nombre de règles décidables . Une règle est décidable si un outil d'analyse peut vous aider à déterminer la conformité à cette règle.
- Les règles sont classées en trois catégories : "requises", "consultatives" ou "obligatoires". Les règles obligatoires ne doivent jamais être enfreintes, quelles que soient les circonstances. Les règles obligatoires et consultatives peuvent être enfreintes dans des scénarios particuliers, à condition que l'infraction soit justifiée.
- Ajout de conseils sur la manière d'appliquer les règles au code généré automatiquement. C'est très important car les mêmes lignes directrices que pour le code écrit par un humain ne s'appliquent pas toujours au code généré par un outil.
- Supprimer les règles trop générales qui interdisaient un comportement raisonnable de la part de l'utilisateur. Par exemple, il était auparavant recommandé de ne pas utiliser de macros, car elles peuvent entraîner diverses difficultés et confusions (les macros ne peuvent pas être déboguées, les macros n'ont pas d'espace de noms, etc.) ). Cela a empêché l'utilisation de macros, même dans des situations où elles pouvaient fournir une solution élégante, sûre et pratique. Dans MISRA C : 2012, de nouvelles règles concernant les macros ont été introduites, permettant aux gens de les utiliser avec précaution, chaque fois que c'est possible. Voyez l'extrait suivant, tiré d'un document de la MISRA C, qui recommande l'utilisation d'une macro plutôt que d'une fonction.
Les règles de MISRA C en action
Assez parlé, il est maintenant temps de mettre en pratique certaines règles de MISRA C, avec des exemples d'application.
Utilisez des types compatibles comme arguments de pointeur pour memcpy, memmove et memcmp
Les fonctions de la bibliothèque standard memcpy, memmove et memcmp effectuent un déplacement ou une comparaison octet par octet du nombre spécifié d'octets. La règle 21.15 de la norme MISRA C 2012 stipule que les deux paramètres de la fonction doivent être des pointeurs du même type. Un appel de fonction avec des types de pointeurs incompatibles peut indiquer une erreur.
Considérez l'image suivante, tirée du document officiel de conformité MISRA. La règle est obligatoire, décidable et s'applique à la fois à C90 et à C99.
Un exemple suit la description de la règle.
Comme vous pouvez le constater, les objets étant de types différents (uint8_t et uint16_t), cette solution n'est pas conforme.
Les fonctions de traitement des chaînes de caractères qui ne prennent pas la longueur en entrée ne doivent pas entraîner d'accès hors limites
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.
L'exemple correspondant est le suivant :
Comme vous pouvez le voir, strcpy dans la fonction f1, copiera au-delà de la longueur de la chaîne, qui ne peut contenir que 5 caractères. Nous avons également une utilisation conforme et sûre de strcpy, où la chaîne ne sera copiée que si le contenu de "str" est suffisant.
Valider les données reçues de l'extérieur
La directive 4.14 recommande de vérifier la validité des données reçues de sources "externes". Les sources externes peuvent être
- Lecture d'un fichier.
- Lecture d'une variable d'environnement.
- Toute entrée de l'utilisateur.
- Tout ce qui est reçu sur un canal de communication. Par exemple, via une connexion TCP ou une API HTTP, etc.
Cette directive fait partie de la catégorie requise et s'applique à la fois à la norme C90 et à la norme C99. Elle se justifie par le fait qu'un programme n'a aucun contrôle sur les données reçues de sources externes, ce qui signifie que ces données peuvent être invalides ou malveillantes. Par exemple, un programme s'attend à ce que l'utilisateur entre un nombre, mais l'utilisateur entre une chaîne de caractères. Avant de traiter l'entrée, le programme doit vérifier qu'il s'agit bien d'un nombre.
Comment passer à MISRA C 2012
Le passage à MISRA C 2012 nécessitera une mise à jour de votre document sur les règles de codage. Si vous n'en utilisez pas et que vous vous fiez plutôt à un outil d'analyse statique (ce qui est le choix recommandé), vous devrez peut-être vous procurer une version plus récente de l'outil. Voici trois outils qui vérifient la conformité à MISRA C 2012 :
- Cppcheck est un outil open-source qui permet de vérifier les règles MISRA et de détecter différents types de bogues.
- PC-lint Plus est un outil payant assorti d'une période d'évaluation de 30 jours. Outre la vérification de la conformité à la norme MISRA C, il permet également d'identifier les bogues et les vulnérabilités potentielles.
- CodeSonar est un autre outil qui vérifie la conformité aux normes MISRA C et C++.
Il existe également quelques compilateurs capables de tester la conformité à MISRA. Si une violation des règles est détectée, des avertissements ou des exceptions sont émis en conséquence. Green Hills Software , par exemple, propose des compilateurs qui prennent en charge toutes les normes MISRA, pour les architectures 32 bits et 64 bits.
Utiliser Secure Code Warrior pour améliorer les compétences des développeurs de MISRA C
Secure Code WarriorLe produit phare de la société - learning platform - comporte de nombreux défis interactifs, courses, et des évaluations qui peuvent aider à former les développeurs à l'écriture de code C/C++ sécurisé. Le contenu de la plateforme est spécifique au cadre et très engageant. Nos défis de codage C/C++:Embed se sont inspirés à la fois de MISRA C, d'AUTOSAR C++ (MISRA C++) et de la CEI.
Les développeurs peuvent s'embarquer dans des voyages d'apprentissage personnalisés, au cours desquels ils identifient les vulnérabilités spécifiques à C/C++ et, plus important encore, apprennent à corriger ces bogues. Au cours de ce processus, les développeurs peuvent suivre leurs progrès afin d'identifier leurs faiblesses, et même participer à des compétitions de codage amicales avec leurs pairs. Découvrez comment nous aidons les industries de l'automobile et du transport avec nos solutions.
Vous voulez découvrir à quel point nos défis sont interactifs et axés sur l'intégration ? Essayez quelques défis C/C++:Embed sur le site learning platform dès aujourd'hui !
Table des matières
Secure Code Warrior fait du codage sécurisé une expérience positive et attrayante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son propre parcours d'apprentissage, afin que les développeurs compétents en matière de sécurité deviennent les super-héros quotidiens de notre monde connecté.
Secure Code Warrior est là pour vous aider à sécuriser le code tout au long du cycle de vie du développement logiciel et à créer une culture dans laquelle la cybersécurité est une priorité. Que vous soyez responsable AppSec, développeur, CISO ou toute autre personne impliquée dans la sécurité, nous pouvons aider votre organisation à réduire les risques associés à un code non sécurisé.
Réservez une démonstrationTéléchargerRessources pour vous aider à démarrer
Évaluation comparative des compétences en matière de sécurité : Rationalisation de la conception sécurisée dans l'entreprise
Le mouvement "Secure-by-Design" (conception sécurisée) est l'avenir du développement de logiciels sécurisés. Découvrez les éléments clés que les entreprises doivent garder à l'esprit lorsqu'elles envisagent une initiative de conception sécurisée.
DigitalOcean réduit sa dette de sécurité avec Secure Code Warrior
L'utilisation par DigitalOcean de la formation Secure Code Warrior a considérablement réduit la dette de sécurité, permettant aux équipes de se concentrer davantage sur l'innovation et la productivité. L'amélioration de la sécurité a renforcé la qualité des produits et l'avantage concurrentiel de l'entreprise. À l'avenir, le score de confiance SCW les aidera à améliorer leurs pratiques de sécurité et à continuer à stimuler l'innovation.
Ressources pour vous aider à démarrer
Sécurité réactive contre sécurité préventive : La prévention est un meilleur remède
L'idée d'apporter une sécurité préventive aux codes et systèmes existants en même temps qu'aux applications plus récentes peut sembler décourageante, mais une approche "Secure-by-Design", mise en œuvre en améliorant les compétences des développeurs, permet d'appliquer les meilleures pratiques de sécurité à ces systèmes. C'est la meilleure chance qu'ont de nombreuses organisations d'améliorer leur sécurité.
Les avantages de l'évaluation des compétences des développeurs en matière de sécurité
L'importance croissante accordée au code sécurisé et aux principes de conception sécurisée exige que les développeurs soient formés à la cybersécurité dès le début du cycle de développement durable, et que des outils tels que le Trust Score de Secure Code Warriorles aident à mesurer et à améliorer leurs progrès.
Assurer le succès des initiatives de conception sécurisée de l'entreprise
Notre dernier document de recherche, Benchmarking Security Skills : Streamlining Secure-by-Design in the Enterprise est le résultat d'une analyse approfondie d'initiatives réelles de conception sécurisée au niveau de l'entreprise, et de l'élaboration d'approches de meilleures pratiques basées sur des conclusions fondées sur des données.
Plongée en profondeur : Naviguer dans la vulnérabilité critique de CUPS dans les systèmes GNU-Linux
Découvrez les derniers défis de sécurité auxquels sont confrontés les utilisateurs de Linux en explorant les récentes vulnérabilités de haute sévérité dans le système d'impression commun d'UNIX (CUPS). Apprenez comment ces problèmes peuvent conduire à une potentielle exécution de code à distance (RCE) et ce que vous pouvez faire pour protéger vos systèmes.