Développement sans vulnérabilités en C et C++ dans la construction automobile et les véhicules définis par logiciel (SDV)
23 octobre 2024
0 minutes de lectureL’industrie automobile se trouve à un tournant unique de son histoire avec l’avènement des véhicules définis par logiciel (SDV). Lors du congrès mondial de la Society of Automotive Engineers (SAE), qui s’est tenu à Détroit du 16 au 18 avril 2024, il a été clairement indiqué qu’un marché de plus de 500 milliards de dollars allait bénéficier d’investissements en R&D et en avancées technologiques dans le secteur automobile. La transition vers les SDV ouvrira de nouvelles sources de revenus grâce aux abonnements à des fonctionnalités et à des services, impossibles avec le modèle traditionnel d’achat unique qui caractérise l’industrie automobile depuis ses débuts.
Les constructeurs automobiles et leurs fournisseurs cherchent à devenir des entreprises technologiques, portées par l’architecture électrique/électronique (E/E), avec les semi-conducteurs au cœur de ces innovations. En outre, les microservices, l’architecture en conteneurs et le recours important au cloud sont des éléments essentiels à la mise en place des SDV.
Ce secteur s’appuie presque exclusivement sur le développement logiciel en C et C++, des langages de programmation fiables, efficaces et robustes. Pourtant, ces langages présentent des risques de sécurité, notamment les dépassements de tampon et les problèmes de sûreté mémoire, connus depuis des décennies. Le marché des SDV est directement lié à la mission de Snyk : sécuriser les logiciels. Les constructeurs automobiles peuvent tirer parti des solutions Infrastructure as Code (IaC) et Container de Snyk, ainsi que de l’intégration native de Snyk avec différents fournisseurs cloud.
Par exemple, Mercedes a une longueur d’avance avec son système d’exploitation MB.
Nous avons rapidement intégré le meilleur matériel disponible avec le Qualcomm Gen4 8295, qui n’avait été mis à la disposition des consommateurs que six mois auparavant. C’était un projet ambitieux et je suis extrêmement fier de l’équipe qui a relevé le défi, créé 20 Go de code compilé et intégré ce précurseur de MB.OS à la Classe E, car les enseignements tirés sont essentiels au lancement de notre véritable MB.OS 1.0.
Conformité MISRA pour le C et le C++
Les directives MISRA C:2023 portent principalement sur la sûreté et la fiabilité des systèmes critiques, et couvrent notamment des aspects liés à la sécurité des applications, en particulier lorsque des vulnérabilités peuvent entraîner des risques pour la sûreté. Elles abordent un large éventail de sujets, mais certaines règles et directives contribuent tout particulièrement à renforcer la sécurité des applications en préconisant des pratiques qui préviennent les comportements indéfinis, la corruption de mémoire, les accès non autorisés et d’autres vulnérabilités courantes.
Comme les directives C, la structure et le contenu de la spécification MISRA C++:2023 présentent plusieurs règles et directives liées à la sécurité des applications, accompagnées d’exemples de code conforme et non conforme.
Certaines directives et règles des recommandations de conformité MISRA pour le développement en C et C++ portent sur la sécurité des applications et la création de logiciels C et C++ sécurisés, notamment les suivantes :
MISRA Dir 4.12 - L’allocation dynamique de mémoire ne doit pas être utilisée : restreindre l’allocation dynamique de mémoire peut prévenir toute une catégorie de vulnérabilités liées aux erreurs de gestion de la mémoire.
MISRA Rule 1.3 - Aucun comportement indéfini ou critique non spécifié ne doit se produire : un comportement indéfini peut entraîner des vulnérabilités de sécurité, ce qui rend cette règle essentielle.
MISRA Rule 18.1 - Un pointeur résultant d’une opération arithmétique sur un pointeur doit désigner un élément du même tableau que celui-ci : cette règle vise à prévenir les accès hors limites, une vulnérabilité courante dans les programmes C.
MISRA Rule 21.3 - Les fonctions d’allocation et de libération de mémoire de <stdlib.h> ne doivent pas être utilisées : comme la directive 4.12, éviter l’allocation dynamique de mémoire réduit les risques liés aux vulnérabilités de gestion de la mémoire.
MISRA Rule 22.1 à Rule 22.20 (Ressources) : une bonne gestion des ressources, notamment la gestion des erreurs et la libération des ressources, est essentielle pour prévenir les fuites et l’épuisement des ressources, qui peuvent être exploités lors d’attaques par déni de service ou entraîner des comportements indéfinis exploitables par des attaquants.
Bien que la spécification MISRA C ne qualifie pas explicitement ses recommandations de mesures de « sécurité », le respect de ses règles et directives exhaustives renforce la posture de sécurité des logiciels en éliminant de nombreuses causes courantes de vulnérabilités dans le code C et C++. Ces recommandations favorisent le développement de systèmes sûrs, fiables et sécurisés grâce à un comportement robuste et bien défini.
Pourquoi Snyk est là pour vous aider
Snyk s’engage à aider les développeurs à sécuriser leur code, y compris ceux qui travaillent en C et C++. En intégrant la sécurité au cycle de développement, à l’image des méthodes DevSecOps, Snyk permet aux développeurs de détecter les vulnérabilités avant qu’elles ne deviennent des problèmes critiques. Mieux encore, Snyk les aide à repérer les modèles de code non sécurisés dès l’enregistrement de leur code dans l’IDE, sans attendre la réussite des pipelines d’intégration continue (CI) et de build, ni avoir à compiler le code.
Avec des outils comme Snyk Code, vous pouvez analyser vos bases de code C et C++ à la recherche de vulnérabilités et obtenir des conseils concrets pour les corriger.
Prenons l’exemple d’une vulnérabilité courante en C++ : le dépassement de tampon. Voici un court extrait de code qui illustre ce problème :
Dans cet exemple de programme C++, la fonction strcpy peut provoquer un dépassement de tampon si la chaîne saisie dépasse la taille du tampon. Snyk peut vous aider à détecter ce type de vulnérabilité et vous proposer des solutions plus sûres, comme strncpy :
Mais en installant Snyk dans votre IDE, vous bénéficiez de deux superpouvoirs :
Snyk détecte les vulnérabilités du code, comme ce dépassement de tampon, sans nécessiter de compilation.
Snyk vous propose de corriger le problème avec Snyk Agent Fix.
Envie de voir cette magie à l’œuvre ? Regardez ici :

En adoptant des pratiques de codage sécurisé et en tirant parti d’outils comme Snyk, les développeurs peuvent réduire considérablement le risque de vulnérabilités dans leurs bases de code C et C++. Inscrivez-vous dès aujourd’hui à Snyk et commencez à sécuriser vos projets logiciels critiques.
Exemples de code C et C++ conforme et sécurisé, ou non sécurisé et vulnérable
Pour montrer comment les directives et spécifications MISRA se traduisent dans le code réel et les vulnérabilités, examinons un programme C, program2.c, qui illustre un comportement indésirable (MISRA Rule 1.3) parmi ceux mentionnés ci-dessus.
Voici le code du programme C :
En C, la division par zéro est un comportement indéfini qui peut produire des résultats imprévisibles. À juste titre, les directives MISRA interdisent ce type d’opération afin de garantir la sûreté et la sécurité des logiciels critiques.
Pour exécuter le programme, commencez par le compiler, puis lancez-le :
Vous remarquerez que le compilateur GCC affiche un avertissement concernant la division par zéro :
Il s’agit toutefois d’un petit programme simple. En conditions réelles, ce type de problème peut être difficile à repérer dans une vaste base de code, au milieu de nombreux avertissements du compilateur envoyés vers la sortie standard.
Détectez la vulnérabilité avec Snyk Code
Il peut être difficile de repérer les messages d’erreur de comportement indéfini, comme un avertissement du compilateur concernant une _division par zéro_, ou d’autres problèmes. Ils apparaissent aussi tard dans le cycle de développement. Snyk Code vous aide à les détecter plus tôt en analysant votre base de code à la recherche de vulnérabilités avant la compilation.
Snyk utilise des techniques de machine learning dans son moteur d’analyse statique de la sécurité des applications pour comprendre les flux d’appels du programme et relier les chemins de code des sources aux puits. Il peut ainsi repérer du code non sécurisé et des vulnérabilités potentielles dans votre base de code sans la compiler.

Outils de conformité et de sécurisation du code C et C++
Voici quelques outils open source permettant de vérifier la conformité MISRA du code C et C++ :
OpenMRC : OpenMRC est un vérificateur open source des règles MISRA-C, développé sous forme de plugin pour Eclipse CDT (C/C++ Development Tooling). Il est conçu pour analyser le code des véhicules définis par logiciel au regard des directives MISRA-C:2004 et signaler les violations afin d’aider les développeurs à mettre à jour leur code source pour respecter les exigences de sûreté fonctionnelle.
Clang-misracpp2008 : ce projet, désormais archivé, visait à créer un vérificateur open source des règles MISRA C++:2008 à l’aide de l’infrastructure LLVM/Clang. Bien qu’il soit archivé et ne soit plus actif, ses développeurs recommandent d’utiliser
clang-tidy-misracomme solution de remplacement.clang-misracpp2008était implémenté sous forme de plugin LLVM/Clang, témoignant d’un effort pour couvrir les règles MISRA C++ au moyen d’une logique personnalisée et d’options fournies par le compilateur.
Outre les outils mentionnés ci-dessus, Snyk est une autre solution à envisager, que vous cherchiez des outils maintenus selon vos exigences ou répondant à vos critères de qualité et à vos exigences rigoureuses en matière de tests de sécurité.
La plateforme de sécurité de Snyk comprend Snyk Code, un outil SAST en temps réel pensé pour les développeurs, qui renforce la sécurité du code tout en offrant une expérience adaptée à leurs besoins. Les résultats de Snyk s’accompagnent de ressources pédagogiques, d’exemples de corrections pour vous aider à remédier aux problèmes et, parfois, d’une correction automatique avec Snyk Agent Fix.
Snyk est gratuit et peut être utilisé de différentes façons pour analyser le code C et C++, notamment en installant l’extension Snyk pour IDE, en important des dépôts Git depuis Bitbucket ou GitHub, ou en utilisant la CLI Snyk.
Dans les programmes C et C++, les vulnérabilités d’une base de code peuvent aussi provenir d’ailleurs que du code des développeurs : du code importé via des bibliothèques open source.
Enfin, je vous recommande vivement de suivre les leçons concises et faciles à parcourir de Snyk Learn sur les vulnérabilités en C, qui proposent des expériences interactives pour apprendre la sécurité. Elles abordent différentes vulnérabilités en C et C++, comme les déréférencements de pointeur nul, les libérations multiples, les mauvaises conventions de codage et bien d’autres sujets.
Sécurisez votre code grâce à des informations de pointe
Découvrez toutes les fonctionnalités SAST de Snyk Code en seulement 30 minutes.
