Découvrez comment intégrer facilement l'analyse statique, les tests unitaires et d'autres méthodes de test de logiciels C et C++ dans votre pipeline CI/CD. Inscrivez-vous pour la démo >>

Une once de prévention: la sûreté et la sécurité grâce aux normes de codage des logiciels

Par Arthur Hicken

24 April 2020

9  min lire

Le logiciel est passé du bureau à presque tout ce que nous touchons. Des thermostats intelligents aux pompes à perfusion en passant par les voitures, les logiciels sont omniprésents et en croissance. Les soi-disant «objets» de l'Internet des objets (IoT) sont de plus en plus logiques. Avec lui, un plus grand risque d'échec. Beaucoup de ces dispositifs sont utilisés dans des domaines critiques pour la sécurité tels que le médical et l'automobile, où ils peuvent causer des blessures corporelles.

La plupart des entreprises qui construisent des appareils considèrent à juste titre le développement logiciel actuel comme un groupe presque insensé de cow-boys et de chaos. Mais il y a de l'espoir. Le logiciel PEUT et DOIT être traité comme une pratique d'ingénierie. Les normes de codage, qui font partie intégrante des bonnes pratiques d'ingénierie logicielle, nous font passer du cycle «construire, échouer, réparer» à un cycle «concevoir, construire, livrer» avec une qualité, une sûreté et une sécurité élevées.

Il s'avère que ces mêmes normes offrent également des avantages dans les domaines de la cybersécurité, en faisant un double devoir. Cet article traite:

  • Comment ces normes nous aident à passer de la recherche de défauts à la création de logiciels plus robustes.
  • Comment éviter les problèmes en premier lieu avec un codage approprié.
  • Comment tirer parti des efforts des autres en utilisant des normes industrielles communément acceptées telles que MISRA pour atteindre cet objectif.

Du développement logiciel au génie logiciel

L'impact du logiciel sur le monde réel est souvent ignoré. L'un de mes principaux thèmes dont je discute continuellement en tant qu'évangéliste chez Parasoft, est que le développement logiciel devrait vraiment être l'ingénierie.

Nous appelons fréquemment les développeurs de logiciels par le titre d'ingénieurs logiciels, mais ce n'est pas nécessairement le terme approprié pour désigner la façon dont ils travaillent aujourd'hui. L'évolution vers une bonne pratique de génie logiciel entraîne une baisse des coûts et une augmentation de la qualité. L’adoption de normes, en particulier les normes de codage, est un élément clé de ce processus.

L'ère de la voiture connectée, de l'IoT et des appareils connectés en permanence est arrivée. Les logiciels se faufilent dans les produits, les appareils et d'autres endroits auxquels nous n'avons jamais pensé. Nous devons maintenant réfléchir sérieusement au logiciel de ces produits et à ses ramifications.

Le coût d'une mauvaise qualité

L'une des choses intéressantes que j'essaie d'expliquer est que la construction d'un bon logiciel est différente de la construction de quelque chose comme une voiture. Si j'essaie de construire une voiture de haute qualité, je dois passer plus de temps sur les matériaux et plus de temps pour la construire. Il s'avère que dans les logiciels, vous ne dépensez pas plus pour créer des logiciels de haute qualité. Vous dépensez plus pour créer des logiciels de mauvaise qualité.

Il faut comprendre que dans le logiciel, la plupart des défauts proviennent du programmeur, qui les met dans le produit. Si nous pouvons arrêter d'introduire des défauts au fur et à mesure que nous développons le logiciel, nous pouvons avoir un logiciel bien meilleur, à un prix inférieur.

Cette citation est tirée d'une conférence en 1972, intitulée "L'humble programmeur», Par Edsger W Dijkstra. C'est toujours très pertinent aujourd'hui.

Il est important de comprendre l'impact de la qualité sur les coûts de développement de logiciels. Câpres Jones, chercheur, suit cela depuis des décennies et réalise chaque année une enquête sur les coûts des logiciels. Les chiffres ne changent pas beaucoup d'année en année. Les données montrent que le coût typique des logiciels, des exigences au codage en passant par la maintenance, augmente à chaque phase. Cependant, la manière dont les équipes abordent la qualité détermine si leur processus est sain ou «pathologique».

Figure 1: Qualité des logiciels 2011: une étude de l'état de l'art des logiciels - Capers Jones

Pourquoi nous devons corriger rapidement les défauts

Il est logique que si nous trouvons un défaut juste au moment où le code est écrit, le coût est relativement peu coûteux - quelques minutes du temps d'un développeur, par exemple. S'il est possible d'éliminer 85% des défauts lors de la phase de développement, cela a un impact important sur les coûts. Considérez le désormais célèbre graphique de Capers Jones montrant le coût moyen de la correction des défauts à chaque étape de développement:

Figure 2: Sources - Mesure des logiciels appliqués, Capers Jones, 1996, Building Security into The Software Life Cycle, Marco M. Morana, 2006

La correction des défauts après la sortie coûte environ 16,000 15 $ (peut-être beaucoup plus) sur la base de recherches sur de vraies entreprises faisant de vrais logiciels, et non sur un modèle théorique. Si nous examinons les efforts de qualité et de sécurité en fin de cycle, tels que les tests de pénétration, les problèmes de sécurité détectés ici se situent à la fin coûteuse du cycle. C'est probablement XNUMX fois plus cher que de trouver des vulnérabilités par le biais de tests par rapport aux premiers audits de sécurité.

Une approche obsolète et prouvée fausse consiste à améliorer la qualité de votre logiciel en le testant à la fin du cycle de vie, juste avant sa sortie. Dans le monde de la fabrication, ils comprennent que c'est impossible, mais pour une raison quelconque, nous pensons que nous pouvons tester la qualité (et la sécurité) «dans» les logiciels.

Les raisons pour lesquelles je dis que le développement logiciel n'est presque jamais de l'ingénierie sont ces caractéristiques communes du développement logiciel actuel:

  • Ce que font la plupart des développeurs n'est pas reproductible. Cela signifie que si je confie la même tâche à deux personnes différentes, les résultats ne seront pas les mêmes.
  • Manque de bonnes pratiques bien appliquées. Les développeurs de logiciels considèrent les normes de codage comme un mot qui n'a pas beaucoup de sens. Les normes sont considérées comme un ensemble de règles que le chef d'équipe insiste pour que je suive plutôt que de comprendre que la norme de codage est l'incarnation des connaissances, de la pratique et de l'expérience. Un ingénieur électricien sait que les normes sont le moyen de construire un produit sûr du premier coup. Un développeur de logiciel pense que les normes sont une contrainte qui les ralentit… un «faux positif».
  • La formation des développeurs est inconnue et incohérente. La formation en développement logiciel n'est pas normalisée comme elle l'est avec les disciplines d'ingénierie. Les normes et les pratiques établies ne font souvent pas partie du programme, l'accent est plutôt mis sur les langages de programmation.

Les normes de codage améliorent la sûreté et la sécurité

L'objectif des normes de codage logiciel est d'inculquer des pratiques de programmation éprouvées qui mènent à un code sûr, fiable, testable et maintenable. En règle générale, cela signifie éviter les pratiques de codage ou le code non sécurisés connus qui peuvent provoquer un comportement imprévisible. Cela devient critique dans les langages de programmation tels que C et C ++, où le potentiel d'écriture de code non sécurisé ou non sécurisé est élevé.

Cependant, je pense que l'industrie a perdu son chemin avec ces normes de programmation. Au cours de la dernière décennie, les outils (tels que les outils d'analyse statique) sont passés de la détection de code potentiellement problématique qui n'est pas sûr ou d'une faiblesse de langage connue à une concentration sur la recherche de défauts en tant que forme de test précoce, également connue sous le nom de décalage vers la gauche.

Comment sélectionner et mettre en œuvre la bonne norme de codage sécurisé

Bien que la recherche de défauts soit importante, la création de logiciels sonores est une activité plus productive. Ce que nous devrions faire, c'est élaborer et appliquer des normes pour éviter la situation où des défauts sont introduits en premier lieu - un déplacement encore plus vers la gauche.

Pour étayer cela, considérez le un article fait par le Software Engineering Institute (SEI) où ils ont constaté, sans surprise, que la sécurité et la fiabilité vont de pair et que la sécurité des logiciels peut être prédite par le nombre et les types de défauts de qualité détectés. De plus, les défauts critiques sont souvent des erreurs de codage qui peuvent être évitées grâce à des inspections et des outils tels que l'analyse statique.

Normes de l'industrie

Cet article n'entre pas dans les détails sur chacun de ces normes de codage mais il y a un travail considérable dans les normes industrielles suivantes. Bien que leur application puisse être spécifique à un type spécifique, ces normes sont en train d'être adoptées dans de nombreux secteurs. Voici quelques exemples de normes de codage établies pour la sûreté et la sécurité.

  • MISRA C / C ++: Développé par la Motor Industry Software Reliability Association, il décrit un sous-ensemble du langage C ou C++ et des directives pour leur utilisation afin d'améliorer la sûreté et la sécurité de l'application. Bien que destiné à l'origine aux applications automobiles, son utilisation s'est développée dans d'autres applications critiques pour la sécurité. « MISRA », « MISRA C » et le logo triangulaire sont des marques déposées de The MISRA Consortium Limited. ©The MISRA Consortium Limited, 2021. Tous droits réservés.
  • CERT SEI / SANS: L'équipe d'intervention en cas d'urgence informatique (CERT) du Software Engineering Institute (SEI) dispose d'un ensemble de directives pour aider les développeurs à créer des logiciels plus sûrs, plus sécurisés et plus fiables. Les lignes directrices sont divisées en importance par groupes de «règles» et de «recommandations» et sont très complètes et larges et comprennent des métadonnées sur les risques.
  • OWASP Top 10: L'Open Web Application Security Project (OWASP), comme son nom l'indique, est une organisation qui s'engage à améliorer la sécurité des applications Web. En tant que tel, leur projet OWASP Top 10 fournit une liste des vulnérabilités de sécurité des applications Web les plus courantes et à fort impact. La dernière version de l'OWASP Top 10 est directement corrélée à des identifiants CWE spécifiques et inclut des métadonnées de risque.
  • Norme de codage C ++ des véhicules aériens de combat interarmées (JSF AV): Une norme basée sur un sous-ensemble de MISRA C spécifiquement pour le programme JSF.
  • CWE - Top 25 de l'énumération des faiblesses communes: CWE est une liste de faiblesses logicielles découvertes basée sur l'analyse des vulnérabilités signalées (CVE). Le Top 25 répertorie les faiblesses de sécurité les plus courantes et les plus dangereuses sélectionnées dans la liste plus large des CWE, qui sont toutes des exploits qui ont de fortes chances de se produire et que leur exploitation a un impact important. CWE inclut également des informations sur les risques sous forme d'impact technique, ce qui permet de comprendre les problèmes les plus importants pour votre organisation.

Prenons MISRA C, dont j'ai parlé non seulement pour les applications automobiles. Cependant, c'est une norme qui est utilisée depuis 1998 et qui est bien définie. Il est mis à jour tous les deux ans. Au fur et à mesure que les langages C et C ++ évoluent, ils font évoluer les normes qui les entourent. C'est une norme très flexible qui prend en compte différents niveaux de gravité et il existe une stratégie documentée pour gérer et documenter les écarts.

En tant que technologie capable de détecter les violations des directives de codage standard (telles que l'analyse statique), les versions récentes de MISRA prennent en compte quelles directives sont décidables (détectables avec une grande précision par des outils) et celles qui ne le sont pas. Cela nous amène au sujet de l'adoption et de l'application et de l'importance des outils d'analyse statique dans les normes de codage.

 

Rôle de l'analyse statique

La recherche montre que la suppression inadéquate des défauts est la principale cause de logiciels de mauvaise qualité. Les programmeurs sont efficaces à environ 35 % pour trouver des défauts dans leur propre logiciel. Plus tard dans le cycle de développement, le plus grand nombre de défauts que nous pouvons espérer supprimer après toutes les revues de conception, les revues par les pairs, les tests unitaires et les tests fonctionnels est d'environ 75 %.

L'analyse statique, lorsqu'elle est utilisée correctement en mode préventif, peut augmenter l'élimination des défauts à environ 85%. Cependant, l'utilisation de l'analyse statique pour la plupart des organisations se concentre aujourd'hui sur la détection et la solution rapide.

D'autres avantages sont possibles lorsque des outils d'analyse statique sont utilisés pour éviter en premier lieu les mauvaises pratiques de programmation et les fonctionnalités de langage connues. C'est là que les normes de codage entrent en jeu en tant que directives et sous-ensembles de langage de programmation qui empêchent les défauts courants tels que les débordements de tampon ou l'initialisation manquante d'être écrits dans le code.

Une once de prévention

Prenons un exemple où, lors du test, une erreur de dépassement de mémoire tampon assez complexe est détectée, peut-être avec un outil de sécurité d'application dynamique (DAST). C'est un coup de chance puisque votre test vient juste d'exécuter le chemin de code qui contient l'erreur. Une fois détecté et débogué, il doit être retesté et ainsi de suite. Une analyse statique utilisant l'analyse de flux peut également avoir trouvé cette erreur, mais cela dépend de la complexité de l'application.

La détection des erreurs d'exécution est précise mais elle ne vérifie que les lignes de code que vous exécutez. Donc, c'est aussi bon que votre couverture de code de test. Considérez si une norme de codage avait interdit le code qui a permis cette erreur en premier lieu.

Les normes de codage comme MISRA C ne décrivent pas comment détecter la mémoire non initialisée, par exemple, mais guident plutôt les programmeurs pour écrire du code qui ne conduira pas à une telle erreur en premier lieu. Je crois que c'est beaucoup plus une approche d'ingénierie: programme selon des normes bien connues et acceptées. Prenons par exemple le génie civil et la construction de ponts.

Nous n'adopterions pas l'approche de construire un pont, puis de le tester en conduisant des camions de plus en plus gros dessus jusqu'à ce qu'il s'effondre, mesurer le poids du dernier camion réussi et le reconstruire pour résister à ce nouveau poids. Cette approche serait encore insensée, ce n'est pas sans rappeler la façon dont nous abordons le développement logiciel.

Une fois qu'une équipe logicielle adopte une norme de codage et que l'analyse statique est correctement appliquée, elle peut détecter les erreurs rapidement et les prévenir. En d'autres termes, au lieu de trouver un défaut tôt, ce qui est bien, l'équipe change la façon dont ils écrivent le code, ce qui est mieux!

Considérons le Heartbleed vulnérabilité. Il existe maintenant des détecteurs pour cette instance spécifique de vulnérabilité, mais il existe un moyen d'écrire du code afin que Heartbleed ne se soit jamais produit. La prévention est une méthode meilleure et plus sûre.

Résumé

Dykstra a déclaré: "Ceux qui veulent des logiciels vraiment fiables découvriront qu'ils doivent trouver des moyens d'éviter la majorité des bogues pour commencer." Avoir une méthodologie de prévention solide est inférieur au coût de la correction de ces bogues.

Les normes de codage incarnent de solides principes d'ingénierie pour la programmation dans leurs langues respectives et constituent la base de toute approche préventive. Le coût d'un bon logiciel est inférieur au coût d'un mauvais logiciel. Si vous n'utilisez pas l'analyse statique aujourd'hui, ou si vous ne l'utilisez que pour une détection précoce, jetez un œil aux outils d'analyse statique de Parasoft pour C et C ++, Javaet C # et VB.NET avec une riche bibliothèque de vérificateurs pour toutes les normes de sécurité et de sûreté populaires intégrées.

Par Arthur Hicken

Arthur est impliqué dans la sécurité logicielle et l'automatisation des tests chez Parasoft depuis plus de 25 ans, aidant à la recherche de nouvelles méthodes et techniques (dont 5 brevets) tout en aidant les clients à améliorer leurs pratiques logicielles.

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.