NI LabVIEW est une plate-forme de programmation graphique largement utilisée pour l'acquisition de données, le contrôle d'instruments et l'automatisation des tests. Alors que les vulnérabilités de sécurité de la mémoire affectent de nombreux environnements logiciels traditionnels, LabVIEW se distingue par son architecture et ses principes de conception. Ce white paper explore les mécanismes et fonctionnalités qui font de LabVIEW un langage MLS (Mémoire sécurisée), comment ces attributs se comparent aux langages de programmation conventionnels, et les implications pour les développeurs recherchant des applications robustes, fiables et sécurisées.
La sécurité de la mémoire est un aspect critique de la sécurité et de la fiabilité des logiciels. Les problèmes classiques de sécurité de la mémoire, tels que les débordements de buffer, les erreurs d'utilisation après libération et les pointeurs pendants, sont responsables d'une partie importante des défauts logiciels et des vulnérabilités de sécurité dans des langages tels que C et C++. 1 En revanche, LabVIEW élimine bon nombre de ces risques grâce à son environnement graphique de haut niveau piloté par le flux de données.
La sécurité de la mémoire fait référence à l'assurance qu'un programme accède à la mémoire d'une manière bien définie et prévisible. Cette fonctionnalité permet d'éviter la corruption, les fuites et l'écriture de données en dehors des limites prévues. Ces problèmes de mémoire peuvent provoquer des plantages et un comportement indéfini. Pire, les acteurs de la menace manipulent les problèmes de mémoire pour exécuter du code arbitraire, transformant les bugs de mémoire en vulnérabilités de sécurité importantes. Les préoccupations concernant la sécurité de la mémoire comprennent les types de problèmes suivants :
Les langages qui fournissent un accès direct à la mémoire (par exemple, en utilisant des pointeurs) sont particulièrement sensibles à ces problèmes. En revanche, les langages à mémoire sécurisée restreignent ou suppriment complètement la gestion directe de la mémoire par le développeur.
Fondamentalement, LabVIEW est différent des langages textuels traditionnels. Son paradigme de programmation graphique est basé sur les principes de flux de données, où l'exécution du code est déterminée par le flux de données entre les nœuds (appelés instruments virtuels, ou VIs).
Les aspects suivants de l’architecture inhérente à LabVIEW favorisent la sécurité de la mémoire :
Dans LabVIEW, les programmes sont construits en connectant des blocs fonctionnels avec des fils de liaison qui transportent des données. Chaque bloc ne s'exécute que lorsque toutes les entrées requises sont disponibles et que les emplacements des données ne sont pas accessibles avant la production des données, ce qui évite les situations de compétition de mémoire.
Figure 1. Exemple de code LabVIEW
Ce modèle évite naturellement de nombreuses erreurs de programmation dues au mauvais séquencement des opérations dans les langages impératifs.
Le moteur d'exécution LabVIEW est responsable de toutes les allocations et désallocations de mémoire. Les développeurs n’ont jamais besoin de demander manuellement ou de libérer de la mémoire, éliminant ainsi le risque de fuites et d’erreurs d’utilisation après libération. Lorsque des tableaux ou des clusters (données de type structure) grossissent ou se réduisent, LabVIEW gère de manière transparente la mémoire associée. Par exemple, si un développeur crée une boucle qui constitue un tableau, LabVIEW redimensionne automatiquement le tableau et gère l'espace mémoire associé. Lorsque la variable tableau devient hors champ, le collecteur d’ordures de LabVIEW récupère la mémoire.
L'environnement de développement LabVIEW effectue une vérification de type rigoureuse lors de la compilation et de l'exécution du VI. Les tentatives de câblage de types de données incompatibles sont détectées à l'édition, ce qui évite les erreurs d'exécution. De plus, les opérations tableau et chaîne incluent la vérification des limites pour éviter les débordements de buffer.
L'une des garanties les plus efficaces est l'absence de contrôle de mémoire de bas niveau : LabVIEW ne fournit aucun mécanisme permettant à l'utilisateur d'effectuer un calcul de pointeur arbitraire ou d'accéder directement à la mémoire. Cette conception signifie que les vulnérabilités courantes en C ou en assembly, telles que les dépassements de pile ou de heap, ne sont pas possibles dans le code LabVIEW natif.
Pour mieux comprendre la sécurité de la mémoire LabVIEW, il est instructif de la comparer à des langages comme C, C++, et même Java ou Python.
En résumé, la conception de LabVIEW élimine des catégories entières de vulnérabilités liées à la mémoire (par exemple, les débordements de buffer) et simplifie le développement sécurisé d’applications, offrant un avantage significatif par rapport aux langages traditionnels comme C et C++., avec une protection similaire à Python et Java.
La sécurité de la mémoire dans LabVIEW présente des avantages tangibles pour les développeurs, les organisations et les utilisateurs finaux :
Les débordements de buffer traditionnels se produisent lorsque les données dépassent les limites d'un buffer de longueur fixe, écrasant la mémoire adjacente et pouvant permettre l'exécution de code arbitraire. Dans LabVIEW, les opérations sur les tableaux et les chaînes sont toujours vérifiées aux limites. Les tentatives d'écriture au-delà de la fin d'un tableau ou d'une chaîne entraîneront une erreur d'exécution plutôt qu'une corruption silencieuse de la mémoire.
Comme tout environnement à mémoire sécurisée, il est important de comprendre les limites de LabVIEW :
Pour maximiser la sécurité lors des appels de code externe, suivez ces bonnes pratiques :
La conception de LabVIEW, basée sur un paradigme de flux de données graphique, une vérification de type forte, une gestion automatique de la mémoire et l’absence de manipulation directe des pointeurs, fournit un environnement hautement sécurisé en mémoire. Les développeurs bénéficient d’un risque réduit de bugs liés à la mémoire, d’une productivité accrue et de la possibilité de créer des applications pour des industries exigeantes et critiques pour la sécurité en toute confiance.
Bien qu'aucun environnement ne soit entièrement à l'abri des erreurs, en particulier lorsqu'il interagit avec des composants externes dangereux, LabVIEW place nettement plus haut la barre de la sécurité de la mémoire par rapport aux langages textuels traditionnels. Pour les organisations à la recherche de fiabilité et de sécurité dans les applications de mesure, d'automatisation et de contrôle, LabVIEW est un choix convaincant pour le développement en mémoire sécurisée.
| Critère | C/C++ | Python/Java | LabVIEW |
|---|---|---|---|
| Accès à la mémoire | Accès direct à la mémoire | Pas d'accès direct à la mémoire | Pas d'accès direct à la mémoire |
| Gestion de la mémoire | Gestion manuelle de la mémoire, sujette aux erreurs | Gestion automatique de la mémoire | Gestion automatique de la mémoire |
| Susceptibilité aux erreurs | Risque élevé d'erreurs de sécurité de la mémoire (par ex. débordements de buffer) | Risque considérablement réduit grâce à la saisie stricte et à la gestion de la mémoire | Risque considérablement réduit grâce à la saisie stricte et à la gestion de la mémoire |
| Pointeurs | Utilisation intensive de pointeurs, complexité et risques croissants | Pas d'utilisation directe de pointeurs | Pas d'utilisation directe de pointeurs |
| Sécurité | Surface d'attaque élevée due à la manipulation manuelle de la mémoire et à la sensibilité aux débordements de buffer | Surface d’attaque minimale, immunisée contre les débordements de buffer et les exploits de pointeur | Surface d’attaque minimale, immunisée contre les débordements de buffer et les exploits de pointeur |
1 « Memory Safe Languages: Reducing Vulnerabilities in Modern Software Development, » Cybersecurity and Infrastructure Agency, juin 2025, https://www.cisa.gov/resources-tools/resources/memory-safe-languages-reducing-vulnerabilities-modern-software-development.
Java est une marque déposée d’Oracle et/ou de ses sociétés affiliées. Les autres noms peuvent être des marques de leurs propriétaires respectifs.