IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Existe-t-il un consensus au sein de l'industrie sur l'abandon de C/C++ ? Sécuriser par la conception : Le point de vue de Google sur la sécurité de la mémoire

Le , par Jade Emy

84PARTAGES

17  1 
La NSA exhorte les organisations à passer à des langages de programmation sécurisés dans la gestion de la mémoire,
pour éliminer un vecteur d'attaque souvent exploité par les cybercriminels

La National Security Agency (NSA) a publié des conseils pour aider les développeurs et les opérateurs de logiciels à prévenir et à atténuer les problèmes de sécurité de la mémoire logicielle, qui représentent une grande partie des vulnérabilités exploitables. La fiche d'information sur la cybersécurité « Sécurité de la mémoire logicielle » souligne comment les cyberacteurs malveillants peuvent exploiter les problèmes de mauvaise gestion de la mémoire pour accéder à des informations sensibles, promulguer l'exécution de code non autorisé et causer d'autres impacts négatifs.

« Les problèmes de gestion de la mémoire sont exploités depuis des décennies et sont encore trop courants aujourd'hui », a déclaré Neal Ziring, directeur technique de la cybersécurité. « Nous devons utiliser systématiquement des langages sécurisés pour la mémoire et d'autres protections lors du développement de logiciels afin d'éliminer ces faiblesses des cyberacteurs malveillants ».


La société moderne s'appuie fortement sur l'automatisation basée sur les logiciels, faisant implicitement confiance aux développeurs pour écrire des logiciels qui fonctionnent de la manière attendue et ne peuvent pas être compromis à des fins malveillantes. Alors que les développeurs effectuent souvent des tests rigoureux pour préparer la logique des logiciels à des conditions surprenantes, les vulnérabilités logicielles exploitables sont encore souvent basées sur des problèmes de mémoire. Les exemples incluent le débordement d'une mémoire tampon et l'exploitation des problèmes liés à la façon dont le logiciel alloue et désalloue la mémoire.

Microsoft a révélé lors d'une conférence en 2019 que, de 2006 à 2018, 70 % de leurs vulnérabilités étaient dues à des problèmes de sécurité de la mémoire. Google a également trouvé un pourcentage similaire de vulnérabilités de sécurité de la mémoire sur plusieurs années dans Chrome. Les cyber-acteurs malveillants peuvent exploiter ces vulnérabilités pour l'exécution de code à distance ou d'autres effets indésirables, qui peuvent souvent compromettre un appareil et être la première étape des intrusions réseau à grande échelle. Les langages couramment utilisés, tels que C et C++, offrent une grande liberté et une grande flexibilité dans la gestion de la mémoire tout en s'appuyant fortement sur le développeur pour effectuer les vérifications nécessaires sur les références mémoire.

De simples erreurs peuvent conduire à des vulnérabilités exploitables basées sur la mémoire. Les outils d'analyse logicielle peuvent détecter de nombreux cas de problèmes de gestion de la mémoire et les options d'environnement d'exploitation peuvent également fournir une certaine protection, mais les protections inhérentes offertes par les langages logiciels sécurisés pour la mémoire peuvent prévenir ou atténuer la plupart des problèmes de gestion de la mémoire.

La NSA recommande d'utiliser un langage sécurisé pour la mémoire lorsque cela est possible. Bien que l'utilisation de protections supplémentaires pour les langages non sécurisés pour la mémoire et l'utilisation de langages sécurisés pour la mémoire n'offrent pas une protection absolue contre les problèmes de mémoire exploitables, elles offrent une protection considérable.

Par conséquent, la communauté logicielle globale du secteur privé, du milieu universitaire et du gouvernement américain a lancé des initiatives visant à orienter la culture du développement logiciel vers l'utilisation de langages sécurisés dans la gestion de la mémoire.


Le problème de la sécurité de la mémoire

La façon dont un programme logiciel gère la mémoire est essentielle pour prévenir de nombreuses vulnérabilités et garantir la robustesse d'un programme. L'exploitation d'une gestion de la mémoire médiocre ou négligente peut permettre à un cyberacteur malveillant d'accomplir des actes néfastes, tels que planter le programme à volonté ou modifier les instructions du programme en cours d'exécution pour faire ce que l'acteur désire. Même des problèmes inexploitables avec la gestion de la mémoire peuvent entraîner des résultats de programme incorrects, une dégradation des performances du programme au fil du temps ou des plantages de programme apparemment aléatoires.

La sécurité de la mémoire est une vaste catégorie de problèmes liés à la façon dont un programme gère la mémoire. Un problème courant est appelé « débordement de tampon », où les données sont accessibles en dehors des limites d'un tableau. D'autres problèmes courants concernent l'allocation de mémoire. Les langages peuvent allouer de nouveaux emplacements de mémoire pendant l'exécution d'un programme, puis désallouer la mémoire, également appelée libération ou libération de la mémoire, plus tard lorsque la mémoire n'est plus nécessaire. Mais si cela n'est pas fait avec soin par le développeur, de la nouvelle mémoire peut être allouée encore et encore au fur et à mesure que le programme s'exécute. Par conséquent, la mémoire n'est pas toujours libérée lorsqu'elle n'est plus nécessaire, ce qui entraîne une fuite de mémoire qui pourrait entraîner le programme à manquer de mémoire disponible.

En raison d'erreurs logiques, les programmes peuvent également tenter d'utiliser la mémoire qui a été libérée, ou même de libérer de la mémoire qui a déjà été libérée. Un autre problème peut survenir lorsque les langages autorisent l'utilisation d'une variable qui n'a pas été initialisée, ce qui fait que la variable utilise la valeur précédemment définie à cet emplacement en mémoire. Enfin, un autre problème difficile est appelé une condition de concurrence. Ce problème peut se produire lorsque les résultats d'un programme dépendent de l'ordre de fonctionnement de deux parties du programme accédant aux mêmes données. Tous ces problèmes de mémoire sont des occurrences beaucoup trop courantes.

En exploitant ces types de problèmes de mémoire, les acteurs malveillants, qui ne sont pas liés par les attentes normales d'utilisation du logiciel, peuvent découvrir qu'ils peuvent entrer des entrées inhabituelles dans le programme, provoquant l'accès, l'écriture, l'allocation ou la désallocation de la mémoire de manière inattendue. Dans certains cas, un acteur malveillant peut exploiter ces erreurs de gestion de la mémoire pour accéder à des informations sensibles, exécuter du code non autorisé ou provoquer d'autres impacts négatifs. Puisqu'il peut falloir beaucoup d'expérimentation avec des entrées inhabituelles pour en trouver une qui provoque une réponse inattendue, les acteurs peuvent utiliser une technique appelée "fuzzing" pour créer de manière aléatoire ou intelligente une multitude de valeurs d'entrée dans le programme jusqu'à ce qu'on en trouve une qui provoque le plantage du programme.

Les progrès des outils et des techniques de fuzzing ont facilité la recherche d'entrées problématiques pour les acteurs malveillants ces dernières années. Une fois qu'un acteur découvre qu'il peut faire planter le programme avec une entrée particulière, il examine le code et travaille pour déterminer ce qu'une entrée spécialement conçue pourrait faire. Dans le pire des cas, une telle entrée pourrait permettre à l'acteur de prendre le contrôle du système sur lequel le programme s'exécute.


Langages sécurisés dans la gestion de la mémoire

L'utilisation d'un langage sécurisé pour la mémoire peut aider à empêcher les programmeurs d'introduire certains types de problèmes liés à la mémoire. La mémoire est gérée automatiquement dans le cadre du langage informatique ; il ne repose pas sur l'ajout de code par le programmeur pour implémenter des protections de mémoire. Le langage institue des protections automatiques en utilisant une combinaison de vérifications au moment de la compilation et de l'exécution. Ces fonctionnalités inhérentes au langage protègent le programmeur contre l'introduction involontaire d'erreurs de gestion de la mémoire. C#, Go, Java, Ruby, Rust et Swift sont des exemples de langage sécurisé pour la mémoire.

Même avec un langage sécurisé pour la mémoire, la gestion de la mémoire n'est pas entièrement sécurisée pour la mémoire. La plupart des langages de mémoire sécurisés reconnaissent que les logiciels doivent parfois exécuter une fonction de gestion de mémoire non sécurisée pour accomplir certaines tâches. En conséquence, des classes ou des fonctions sont disponibles qui sont reconnues comme non sécurisées pour la mémoire et permettent au développeur d'effectuer une tâche de gestion de la mémoire potentiellement dangereuse. Certains langages exigent que tout ce qui n'est pas sûr en mémoire soit explicitement annoté comme tel pour que le développeur et tous les réviseurs du programme sachent qu'il n'est pas sûr. Les langages sécurisés pour la mémoire peuvent également utiliser des bibliothèques écrites dans des langages non sécurisés pour la mémoire et peuvent donc contenir des fonctionnalités de mémoire non sécurisées. Bien que ces façons d'inclure la mémoire ne soient pas sûres et subvertissent la sécurité inhérente à la mémoire, elles aident à localiser où des problèmes de mémoire pourraient exister, permettant un examen plus approfondi de ces sections de code.

Les langages varient dans leur degré de sécurité de la mémoire institué par des protections et des atténuations inhérentes. Certains langages n'offrent qu'une sécurité de mémoire relativement minimale alors que certains langages sont très stricts et offrent des protections considérables en contrôlant la manière dont la mémoire est allouée, accessible et gérée. Pour les langages avec un niveau extrême de protection inhérente, un travail considérable peut être nécessaire pour obtenir simplement le programme à compiler en raison des vérifications et des protections.

La sécurité de la mémoire peut être coûteuse en matière de performances et de flexibilité. La plupart des langages mémoire sécurisés nécessitent une sorte de récup...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Fagus
Membre expert https://www.developpez.com
Le 06/03/2024 à 14:18
Citation Envoyé par commandantFred Voir le message


Evidemment qu'on teste l'absence de bug !
Tout ce qu'on sait, c'est si le teste passe ou pas, mais ça ne prouve pas l'absence de bug.

Si on écrit 1/x et que x peut être manipulé par l'utilisateur, c'est évident qu'il faut bloquer l'entrée x=0 ou prévoir le cas division par 0.
Mais si au lieu de x, on a une équation mathématique compliquée qui comporte une division, ça peut être oublié, et le programme passera tous les tests, sauf celui sur la valeur exacte qui provoque une division par zéro. C'est du vécu quand j'ai réimplémenté un algo déjà implémenté commercialement. À un moment j'ai entré la valeur spéciale dans les logiciels concurrents : bam comportement aberrant sur division par zéro oubliée.

Ou bien si on a un algo compliqué conditionnel avec plusieurs dizaines de branchements qui ne s'emboîtent pas, c'est facile dans un moment de fatigue ou sur une faute de frappe d'écrire dans un coin si x > n ... {code} ; si x<n {code} alors qu'on voulait écrire si x<=n. Le code produit une erreur de logique seulement si x=n.

Sur les atmel, esp, je ne connais très modestement que le compilateur d'arduino. On écrit souvent dans une sorte de c, mais c'est un compilateur c++. C'est pas très élégant, mais ça m'arrive d'écrire en mélange de c/c++ parfois, tant que ça consomme pas trop de ressources.
5  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 06/03/2024 à 7:26
Citation Envoyé par commandantFred Voir le message
Le problème est que la pile du C est la même que la pile système. Son pointeur est stocké dans le registre SP (stack pointer)
Heu non, chaque thread de chaque processus a sa propre pile qui est heureusement différente de celle du noyau du système d’exploitation. Sinon n'importe quel programme pourrait altérer le fonctionnement des autres, voire même de l'OS.
C'est transparent du point de vue du programme en cours d'exécution, mais le registre SP est sauvegardé/restaurée par l'OS lors des changements de contexte pour pointer sur la pile du thread en cours d’exécution.

Citation Envoyé par commandantFred Voir le message
Comme le dit OuftiBoy, plus haut, C reste le seul langage disponible pour les micro contrôleurs : Atmel, pic et surtout ESP32 aujourd'hui.
C'est vrai que certains microcontrôleurs exotiques n'ont que des compilateur en C, mais pour le coup les exemples sont mauvais car une simple recherche rapide montre que Rust les supporte, et je serais surpris que ça ne soit pas le cas de C++ aussi, vu que Rust et Clang (qui supporte le C++) s'appuient tous les deux sur LLVM pour le backend. De nos jours la plupart des compilateurs reposent sur des briques communes (LLVM, GCC) ce fait qu'il est plus simple de supporter plusieurs langages, quand on a déjà un backend qui marche pour une architecture.

Citation Envoyé par commandantFred Voir le message
Damn, trois trucs faux ou à côté en trois phrases. Je pensais que vous étiez en vacances. Vous êtes sûr de vouloir à tout prix intervenir sur ce topic ?
Non je vous assure qu'il a raison et 30 secondes de recherche sur internet vous auraient suffi pour le vérifier. Prenez au minimum la peine de faire ça avant d'accuser les gens merci.
6  3 
Avatar de KsassPeuk
Membre confirmé https://www.developpez.com
Le 06/03/2024 à 16:26
Autant sur la difficulté à migrer quand on a toute son infrastructure écrite en C, j'y souscris, autant ceci :

Citation Envoyé par OuftiBoy Voir le message
Je ne suis pas contre Rust, mais j'ai du mal a penser qu'il peux régler tous les soucis, d'une variété d'utilisations énorme (de l'embarqué aux gros sites Web qui doivent être hyper sécurisé). Les vrais soucis viennent plus souvent des technologies "du Web", que du code de bas niveau.
me semble trompeur. Rust ne prétend pas régler tous les soucis. Le principe de Rust c'est conserver un maximum de contrôle et régler par typage une classe particulière de problèmes qui sont ceux liés à la mémoire (et ça ne règle pas tout un tas d'autres undefined behaviors par ailleurs genre tout ce qui est integer overflows). Malgré tout, entre 2013 et 2017, les CVEs liées à la mémoire, ça représentait autour de 20% des CVEs annuelles (d'après l'analyse dans la vidéo plus bas, 53% des CVEs sont dues à : Buffer Overflow (~6000 sur 5 ans) + SQL Injection (~6000 sur 5 ans) + Info leak (~3000 sur 5 ans)). 20% juste pour une classe d'erreur dont on comprend aujourd'hui comment s'en prémunir au niveau typage, c'est pas anodin. Je ne sais pas comment ça a évolué entre 2017 et 2022 ceci dit (enfin, pour les trucs non-critiques), mais je ne crois pas qu'il y ait eu un énorme changement dans les pratiques de ce côté.

La dite vidéo (navré, j'ai trouvé aucun moyen dans l'éditeur de ne pas mettre l'embedding, peu importe ce que je fais l'éditeur insiste pour mettre automatiquement l'embedding...) :

3  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 07/03/2024 à 7:41
Citation Envoyé par OuftiBoy Voir le message
Quant on a une base de code, écrite en C, qui est utilisée depuis de 20 ans sans le moindre soucis, rien que le fait de la réécrire sera plus dangereux que de garder ce qui fonctionne depuis des années.
Il faut arrêter de laisser entendre que l'on va forcer les gens a réécrire en urgence en Rust toutes les applications existantes. Personne de sérieux ne l'a jamais demandé. Ça serait juste idiot et impossible en pratique. Bien sûr que le C restera encore longtemps le langage avec la plus grosse base de code en production.
On demande juste de préparer les gens pour permettre de faire une transition vers des langage sûr là ou ça a du sens. Rust sera utilisé surtout dans des nouveaux projets où des refontes déjà envisagées.

Citation Envoyé par OuftiBoy Voir le message
Je ne suis pas contre Rust, mais j'ai du mal a penser qu'il peux régler tous les soucis, d'une variété d'utilisations énorme (de l'embarqué aux gros sites Web qui doivent être hyper sécurisé).
Ça tombe bien, Rust ne prétend pas résoudre tout les soucis du monde : il prétend surtout de résoudre les soucis de sureté mémoire dans les applications qui nécessitent de la performance et du contrôle bas niveau. Dans ce type d'application, la sureté mémoire est quand même la cause de la grande majorité des vulnérabilité graves.

Si on veut sécuriser le web, le problème à résoudre se situe plus au niveau des frameworks web que du langage.

Citation Envoyé par OuftiBoy Voir le message
Les vrais soucis viennent plus souvent des technologies "du Web", que du code de bas niveau. Je n'ai jamais voulu faire du dev Web, car de ce que je vois, rien n'est jamais vraiment stable dans cet écosystème. Ce qui était adulé il y a 1 an, et jeter aux ordures, pour le nouveau "framework" à la mode. Des couches, sur des couches à n'en plus finir, qui sont souvent écrites par des dev peu expérimentés, ça peut vite créer des soucis, je le comprend très bien.
C'est des problèmes assez orthogonaux. Le dev web pose des problématiques de sécurité spécifiques (Injection, XSS,...), plutôt rares voire inexistants pour un développement bas niveau. Et inversement, les problématiques de sureté mémoire ne se posent pas trop dans le développement Web, pour la simple raison que les langages qu'on utilise traditionnellement pour ça sont déjà memory safe.
Par contre, si on faisait du web en C, on cumulerait les deux sources de problème.

Citation Envoyé par OuftiBoy Voir le message
https://en.wikipedia.org/wiki/Cyclon...ming_language).
Il s'agit d'une version plus Safe du C: Il y est mentionné que Rust y a puisé pas mal d'idées.
Pourquoi ça n'a pas pris à l'époque, je ne sais pas.
En effet, Cyclone est un langage que les créateurs Rust citent souvent dans leurs influences, ainsi que le ML. Le concept de lifetime explicite vient clairement de Cyclone. S'il n'a pas pris, c'est sans doute qu'il s'agissait avant tout d'un projet de recherche qui n'avait pas vraiment pour vocation d'être utilisé en l'état, développé à une époque où la sécurité des logiciels bas niveau n'était pas une préoccupation première.

Rust ne prétend pas avoir inventé quoique ce soit de foncièrement nouveau. Le titre de la première présentation officielle du projet Rust par son créateur original était même : "Technology from the past come to save the future from itself".
Même les concepts de ownership et lifetime, qui font la particularité de Rust, ne sont pas nouveaux en soi : c'était de règles de bonne pratique en C. Le problème étant qu'il peut y avoir des erreurs dans leur mise en pratique. Ce qu'apporte Rust à ce niveau, c'est que le compilateur garanti leur bon usage de manière à ce que l'on ne puisse pas causer d'accès mémoire invalide.

Citation Envoyé par OuftiBoy Voir le message
Encore une, je n'ai rien contre Rust, mais les notion de Owner/lifeTime etc, ça me semble plus compliqué que de de savoir faire correctement un malloc et un free.
C'est en effet plus compliqué, surtout au début, mais au final on s'y habitue. Par contre, on à la garantie que ça sera toujours bien fait, alors que l'on peut très bien savoir comment bien gérer un malloc et quand même se planter.
Si on veut un analyseur statique qui traite tous les cas, on finit par réinventer Rust en moins bien.
3  0 
Avatar de Pyramidev
Expert éminent https://www.developpez.com
Le 07/03/2024 à 10:59
Citation Envoyé par foetus Voir le message
2) l'UTF-16 c'est 2 octets par caractère. En C, tu as le nouveau type wchar_t et tout 1 pan de la bibliothèque standard a été refaite pour supporter l'UTF-16.
Le problème, c'est 1 caractère peut-être soit 1 caractère (2 octets) soit 2 caractères (4 octet). Ce sont les "surrogate pairs"
Par exemple, c'est soit 'é' (e accent grave) soit 'e' + '\'' (e + l'accent grave).
Concernant l'exemple avec "é", ce n'est pas vraiment ça. Un caractère dans le sens "groupe de graphèmes" peut se décomposer en un ou plusieurs points de codage Unicode. Il peut aussi y avoir plusieurs manières de représenter un caractère. Par exemple, "é" correspond soit à un seul point de codage, soit à deux dont le premier qui correspond à "e" et le deuxième, "◌́", qui ajoute un accent aigu.
En UTF-8, un point de codage fait 1, 2, 3 ou 4 octets.
En UTF-16, un point de codage fait 2 ou 4 octets. Quand il fait 4 octets, on l'appelle une "surrogate pair".
En UTF-32, un point de codage fait 4 octets.
L'article suivant résume bien certaines subtilités d'Unicode : The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)
3  0 
Avatar de commandantFred
Membre averti https://www.developpez.com
Le 05/03/2024 à 23:20
Citation Envoyé par djm44 Voir le message
C'est pour remplacer Objective C. Faut pas rêver cela ne diminue pas la complexité de Cocoa sur Mac. Objective C s'est vu maudit du jour au lendemain alors que c'était un langage très ouvert permettant l'intégration du C et du C++. Apple travaille sur la compatibilité du C++ avec Swift.

Pour revenir à ces acteurs de l'internet qui refond le monde des langages on s'étonne qu'Amazon n'ait pas crée le sien. Du moins à ma connaissance. Mais j'insiste sur le fait que ces problèmes de mémoire sont étroitement liés au contexte dans lequel on utilise un langage comme le C++ ou pourquoi pas Python . La gestion de la mémoire sur Python me surprendra toujours. Mais bon ce n'est pas un langage compilé.

Avec le C++ ce qui est critique est la move sémantique dans la navigation des objets en mémoire. Cela induit un partage potentiel excessif des objets en mémoire. Maintenant on dit que Java est plus sur mais avec son garbage collector on ne peut pas bien voir ce que deviennent les objets en mémoire. Pas plus qu'avec Javascript . Mais bon dans la catégorie des langages compilés Ada est sans doute très scrupuleux et C# sur Windows héritier du Pascal Delphi semble assez assez surs.
Objective C était prometteur. Son modèle objet était élégant à l'oeil.
Pour la sécurité mémoire, le problème est centré sur les langages compilés ciblant un CPU précis. Les langages p-codés à GC comme java ou .net ne sont pas vraiment concernés. Les langages interprétés comme javascript ou python sont à priori immunisés à 100% pour autant que l'interpréteur soit bien débuggé.

La garbage collection, c'est à cause d'elle que Google parle de "sécurité temporelle", du moins, je l'interprète comme ça. La prose des géants reste un peu évasive...
Ce qui m'étonne le plus, c'est de savoir que Rust est déjà implémenté dans Chrome et Android. Ils ont visiblement déjà beaucoup investi dans la migration.

Je veux bien parier ma plus belle chemise qu'Amazon ne créera jamais de langage compilé. Pas son style, trop de problèmes, pas assez de revenu, responsabilité très lourde. Les langages, c'est surtout l'affaire des éditeurs d'OS qui ont toujours un avantage pour placer leur système si les API de leur OS sont bien implémentées. En outre, ils ont besoin d'outils pour leurs développements internes.

Amazon pourrait bien éditer un langage de script pour naviguer dans les offres AWS ou retail. Mais rien de plus qu'un genre de shell script.

C pourrait bien revenir dans les annonces d'emploi par le truchement de contrôleurs bien pourvus en mémoire qui viendraient grignoter le marché des machines d'enregistrement logistiques (type TPV ou caisse enregistreuse dans les boutiques).

Pour la demande de développeurs, la double compétence C++ et Rust pourrait être très recherchée dans un avenir très proche.
2  0 
Avatar de floyer
Membre éclairé https://www.developpez.com
Le 05/03/2024 à 23:52
Oui, il est théoriquement possible de faire du code C/C++ sans bug… mais avec des milliers / millions de lignes de codes, sauf à utiliser des vérifications formelles (méthode B ou autre), statistiquement il y a de fort risques de bug qui pourraient être évités par des langages plus sûrs.

Alors c’est sûr, on peut toujours dire «*c’est la faute du programmeur, pas du langage », mais il paraît que l’erreur est humaine et le programmeur humain.

Il est utile de lire https://usenix15.nqsb.io/ qui parle de problèmes d’implémentation de SSL avec beaucoup de problèmes de gestion de mémoire dans les versions usuelles écrites en C.
2  0 
Avatar de KsassPeuk
Membre confirmé https://www.developpez.com
Le 06/03/2024 à 8:43
Citation Envoyé par mintho carmo Voir le message
Dans ton lien : "They define the semantics of an imperative programming paradigm". Question naive : pour les autres paradigmes, en particulier (au hasard...) en POO, il y a des sémantiques spécifiques ou c'est la même sémantique appliquée à de la POO transformée en impératif ? EDIT: et pour la concurrence ?
Le papier d'origine c'était pour un langage impératif simple, depuis ça a été dérivé un peu pour tout et au passage, ça a été fortement amélioré par plein d'autres gens notamment Rustan Leino.
La POO au final, c'est pas si compliqué d'un point de vue logique pure: soit tu respectes le LSP et tu as déjà ta règle pour le calcul de plus faible précondition, soit c'est pas le cas, et ça devient une disjonction des différents cas d'appels.
Ce qui est plus dur, c'est la modélisation efficace de la mémoire, mais en fait c'est déjà dur en C, et les techniques dont on a besoin pour bien traiter le C sont aussi celles qui sont nécessaires pour des langages qui introduisent plus d'abstractions comme C++.

Pour la concurrence, il y a aussi plein de papiers sur le sujet. Dans les papiers fondateurs, on va avoir Owicki-Gries (https://en.wikipedia.org/wiki/Interference_freedom). Ensuite, il y a eu plein de nouvelles dérivations de ça, comme le rely-guarantee, la logique de séparation concurrente, et puis les versions relaxées pour pouvoir raisonner sur des modèles mémoire faibles comme ceux des processeurs "modernes" (je mets ça entre guillemets, parce que c'est quand même plus si jeune).
Par contre, il y a moins d'outils pour faire ça et surtout moins d'outils automatiques, il faut se palucher les preuves dans des assistants de preuve.

Citation Envoyé par floyer Voir le message
Oui, il est théoriquement possible de faire du code C/C++ sans bug… mais avec des milliers / millions de lignes de codes, sauf à utiliser des vérifications formelles (méthode B ou autre), statistiquement il y a de fort risques de bug qui pourraient être évités par des langages plus sûrs.
L'ANSSI (pour ne citer qu'elle) pousse de plus en plus à l'utilisation d'outils formels pour des questions de sûreté/sécurité. Par exemple, pour du CC EAL6, ils ont tendance à être beaucoup plus regardant dans les nouveaux schémas de certification : avant la demande de traçabilité modèle/code n'était pas aussi pressante de leur part. C'est plutôt vers ça actuellement que la demande en outillage pour la sûreté se dirige de leur côté et ça peut fortement améliorer la sûreté d'un code C (C++, c'est une autre histoire, le langage est super gros, et construire un outil formel pour lui, c'est une montagne de boulot). En gros, si tu veux ton tampon CC EAL7 de l'ANSSI, t'as pas le choix c'est méthodes formelles ou rien (donc actuellement en France, Atelier B, Coq ou Frama-C/WP). Mais clairement, quand on leur demande si un outil de vérification formelle pour Rust les intéresse, on a toute leur attention. Donc pour compléter, pour eux : si tu veux faire du C, soit, mais prouve moi l'absence d'undefined behaviors (et si tu veux un haut niveau de certification, prouve le reste aussi) et via des méthodes formelles, et par ailleurs "dites les chercheurs, vous pourriez pas nous faire un outil de vérification formelle industrial level pour Rust ?". Et même d'un point de vue performance des outils de preuve, c'est pas déconnant du tout. Un problème critique pour la capacité de preuve en C, c'est la séparation de la mémoire parce que les aliasing rendent l'espace de recherche dans les formules logiques exponentiel quand tu as des écritures et donc ça peut rendre certaines preuves atrocement dures, dans un langage comme Rust, la séparation des zones mémoires écrites, elle est vraie par typage dans la plus grande partie de ton programme, et ça c'est très bon pour faciliter les preuves.

(Ah et puis pour l'instant méthodes formelles sur des millions de ligne de C, c'est plutôt de l'ordre de la science fiction pour la raison invoquée précédemment : les aliasing)
2  0 
Avatar de OuftiBoy
Membre éprouvé https://www.developpez.com
Le 06/03/2024 à 23:31
Alors j'ai un peu cherché:

https://en.wikipedia.org/wiki/Cyclone_(programming_language)

Il s'agit d'une version plus Safe du C: Il y est mentionné que Rust y a puisé pas mal d'idées.
Pourquoi ça n' pas prit à l'époque, je ne sais pas.

Mais qd on fait de l'embarqué, c'est assez utile. (le temps pour l'allocation est déterministe).
De même, dans un passé lointain, c'était une bonne méthode de réutilisation de la RAM. Sans allocation dynamique et tous les soucis que ça peut engendrer si on ne fait pas attention. L'idée est très ancienne (apparemment, D. knuth on parlait déjà dans The Art Of Computer Programming).

Perso, j'avais entendu parlé de ça via µC/OS2 https://www.silabs.com/developers/micrium)

Il y a plein de système de ce genre avec leurs avantages et désavantages. Je pense même qu'un dev de Qt a lui aussi redécouvert la chose:
https://www.qt.io/blog/a-fast-and-thread-safe-pool-allocator-for-qt-part-1

C'est dans les vieilles marmites qu'on fait les meilleurs soupes disait ma grand-mère.

C'est juste pour alimenter la discussion :-)

BàV. Peace and Love.
2  0 
Avatar de floyer
Membre éclairé https://www.developpez.com
Le 07/03/2024 à 0:56
Citation Envoyé par commandantFred Voir le message
Très respectueusement, je ne crois pas que ce que disent les développeurs sur la sureté de leur code fasse le poids face à des agences de sécurité disposant de budgets militaires.
Certes, certes, mais si une conception logicielle diminue la surface d’attaque par 2… même s’il reste un risque vis-à-vis des agences gouvernementales, c’est toujours cela de pris. L’article que je cite catégorise les défauts de plusieurs implémentations de TLS et on trouve des défauts au niveau de la mémoire qu’un langage d’assez haut niveau sait gérer et donc éviter.

Ceux qui se plaignent des exploits de hackers ne sont pas souvent développeurs. D'ailleurs, personne ici n'a parlé d'attaque dont il aurait été victime. (ça m'est pourtant arrivé en 2001)
Oui… l’attaque vise toujours un code déployé et utilisé chez un utilisateur, pas le développeur. Mais c’est bien du développeur et de ses outils que viennent les problèmes.

Ce serait bien de tenir compte de ce point. La sécurité d'un code ne se lit pas dans les grimoires ni dans les normes. Elle s'écoute chez les victimes de cyber-attaques.
Il y a deux manière de résoudre le problème : de façon réactive (ah, une CVE publiée, je la corrige), et proactive: à défaut d’une analyse de code fastidieuse, utiliser des outils d’aide, SonarCube et autres, et en amont des langages qui limitent les risques (sans les annuler… une SQL injection sera toujours possible indépendamment du langage). Quand aux victime, que savent t-elles des raisons qui on permis l’attaque (buffer overflow, SQL injection). Pas sûr qu’en les écoutant on fasse avancer la science à ce sujet.

A ce moment, il faudra surtout répondre aux problèmes posés par les victimes.
Une fois que la victime est victime… il est trop tard. C’est dès la production du logiciel qui faut se poser des questions. Je ne vois donc pas le propos.

EDIT : Pour illustration, je citerais l'énorme scandale de la conversation entre deux officiers allemands concernant les tactiques d'attaque au moyen de missiles air-sol. Je citerai le général Richou (France) qui dit que cette conversation n'est pas un évènement. Ce qui l'est en revanche, c'est qu'elle soit parvenue aux hackers qui l'ont publiée sur les réseaux sociaux. Je ne pense pas que le sysadmin qui a autorisé cette conversation sur un logiciel mal sécurisé dorme sur ses deux oreilles maintenant. Clairement, l'armée allemande va faire une chasse au logiciel mal sécurisé et quelques têtes vont forcément tomber.
Ce qui illustre que la SSI est un problème d’ensemble, architecture, principe du moindre privilège, langage, défense en profondeur, hygiène informatique, sensibilisation du personnel… c’est très vaste. Mais l’usage de bon outils (langages, linter, croisement SBOM/bases de CVE…) ne peut qu’aider sans tout faire.

D’une certaine manière le passage à Rust ou un langage plus sûr est comparable au passage de la NASA au système métrique suite à l’échec de Mars Climate Orbiter. On peut ergoter… le problème aurait pu être éviter si le concepteur avait bien fait ses calculs (ce qui aurait pu être possible). Mais d’un autre côté, des outils plus sûr limitent les risques.
2  0