Etude Snyk : Est-ce que Python est sécurisé ?
ven, 21/01/2022 - 11:20
Aujourd'hui, 43 % de toutes les fuites de données sont directement liées à des vulnérabilités découvertes au sein des applications. Le langage de programmation Python étant de plus en plus populaire auprès des développeurs, Snyk a examiné les problèmes de sécurité liés à ce langage et a constaté que, si 81 % des packages Python les plus populaires fonctionnent bien, environ 20 % des faiblesses de sécurité identifiées par Snyk Code sont liées aux projets Python.
Le succès de Python est en partie dû à son écosystème de bibliothèques logicielles de machine learning comme NumPy, Pandas, TensorFlow de Google et PyTorch de Facebook. Selon l'indice TIOBE, Python est désormais le langage de programmation le plus populaire au monde, devançant à la fois Java et C.
En examinant les menaces et les vulnérabilités liées à Python, Snyk a constaté qu'en moyenne, 60 nouvelles vulnérabilités Python sont ajoutées chaque mois à la base de données des vulnérabilités de Snyk. Près d'un tiers sont classées comme critiques ou de haute gravité (5 % sont des problèmes de gravité critique, 27 % sont de haute gravité, 56 % sont de gravité moyenne et 12 % sont de faible gravité). L’'étude révèle que la plupart des vulnérabilités découvertes pouvaient être rapidement corrigées. 87 % des vulnérabilités peuvent notamment être corrigées en passant à des packages mis à jour. Enfin, l’utilisation de packages plus légers permet de mettre un terme à la plupart des vulnérabilités des conteneurs.
Ces actions de maintenance sont nécessaires dans de nombreux projets. Dans plus de 60 % des projets Python, on trouve des éléments liés au code présents dans le TOP 10 2021 des problèmes de l'OWASP. Ces types de problèmes peuvent conduire les cybercriminels à injecter des scripts côté client dans les sites Web (XSS). Les chaînes de caractères fournies par l'utilisateur peuvent être utilisées pour construire des requêtes SQL et pour des attaques par injection SQL. De plus, la vérification des certificats est parfois désactivée, ce qui ouvre la voie aux attaques de type "Man-in-The-Middle" (MiTM).
"Lorsque l'on examine certains des problèmes de sécurité rencontrés dans les projets Python, on s’aperçoit que les problèmes liés aux interactions avec des ressources externes telles que les flux de fichiers ou de réseaux ne représentent qu’une petite partie des problèmes identifiés.”, explique Daniel Berman, Product Marketing Director chez Snyk. "Les développeurs Python semblent un peu moins disciplinés dans l'appel des fonctions de fermeture pour vider le contenu de la mémoire ainsi que pour libérer toutes les références."
Les dépendances augmentent le risque d'attaque
Un autre point à souligner est le fait qu’aujourd’hui, le contenu d’un dépôt Python est habituellement composé de bien plus que le simple code Python écrit par le développeur. Les éléments les plus courants sont les packages open-source, les images de conteneurs, ainsi que les fichiers de configuration utilisés pour fournir l'infrastructure nécessaire à leur exécution. Ce volume croissant de dépendances élargit la surface d'attaque des projets au fil du temps.
Snyk a constaté, qu’en moyenne, un projet Python a environ 35 dépendances. Parmi celles-ci, 17 sont des dépendances directes et 18 des dépendances indirectes. Dans 47 % de ces projets, les dépendances introduisent des vulnérabilités. Un projet vulnérable moyen comporte 33 vulnérabilités connues, dont 10 % sont des vulnérabilités de gravité critique, 26 % sont de gravité élevée, 26 % de gravité moyenne et 28 % de faible gravité.
"Plus les applications sont complexes, plus elles sont difficiles à sécuriser.", explique Daniel Berman. "Les cybercriminels disposent d'une grande variété de vecteurs à utiliser lorsqu'ils s'attaquent à une application Python, que ce soit via des vulnérabilités connues introduites par des dépendances directes ou indirectes, des utilisations de sécurité dans le code propriétaire de l'application, ou des vulnérabilités de conteneurs."
L’analyse des principaux problèmes de sécurité rencontrés dans le code des applications a permis à Snyk de formuler six conseils pour aider les développeurs Python :
- Utilisez une analyse de code statique moderne : Les linters comme Pylint et les scanners comme Bandit sont de bonnes bases. Mais les problèmes les plus graves sont inter-fichiers (c'est-à-dire que les problèmes surviennent lorsque l'exécution de l'application passe d'un fichier source à un autre) et détecter ce genre de problèmes manuellement demeure presque impossible.
- Nettoyez les données : Essayez d'assainir les données provenant de sources externes (y compris les bases de données) au point d'entrée de l'application.
- ORM : Utilisez des outils modernes de mapping objet-relationnel (“object-relational mapping” ou ORM) pour résumer les interactions avec la base de données et éviter les possibilités d'injection SQL. Si vous utilisez des packages tels que Django ou Flask, choisissez des bibliothèques telles que Django ORM ou SQLAlchemy dont l’efficacité est prouvée.
- Unicode : Si possible, standardiser toutes les chaînes de caractères à un seul encodage Unicode - nous recommandons UTF-8. De plus, il faut rester prudent lorsque vous convertissez des chaînes Unicode en ASCII.
- Fermez les APIs : Assurez-vous de fermer vos connexions réseau (par exemple, la lecture et les écritures externes). Cela garantit le stockage des données écrites dans leurs mémoires tampons, que l'état est stocké correctement et cela libère également des références dans votre système.
- Gardez vos secrets : Cette situation n'est pas spécifique à Python, mais il est courant de voir des informations personnelles telles que les noms d'utilisateur, les mots de passe, les jetons d'accès aux API, les chemins d'accès aux fichiers ou les noms de fichiers fuir dans le code source. Une bonne pratique consiste à les conserver dans des fichiers séparés ou, mieux encore, de les stocker de manière confidentielle dans HashiCorp Vault ou AWS Key Management Service par exemple.
Pour plus d’information, consultez le rapport complet ici.