Vulnérabilité d’exécution de code arbitraire dans NumPy
Hayley Denbraver
5 février 2019
0 minutes de lectureUne vulnérabilité récemment découverte dans NumPy, le package open source largement utilisé pour le calcul scientifique en Python, permet l’exécution de code arbitraire potentiellement malveillant.
NumPy
NumPy fait partie de l’écosystème SciPy, qui regroupe des packages open source dédiés aux mathématiques, aux sciences et à l’ingénierie. NumPy est utilisé dans l’industrie comme dans le milieu universitaire. Il compte plus de 9 000 étoiles sur GitHub et plus de 700 contributeurs. Selon les données disponibles dans BigQuery de PyPI, NumPy a été téléchargé près de 4 millions de fois au cours des trois derniers mois.
La vulnérabilité
Le 16 janvier 2019, l’utilisateur GitHub nanshihui a ouvert un ticket signalant que la fonction numpy.load était vulnérable à l’exécution de code arbitraire en raison de son utilisation du module pickle de Python. Ce module sérialise et désérialise les objets Python. Le « pickling » convertit la hiérarchie d’objets Python en flux d’octets, tandis que l’« unpickling » convertit un flux d’octets en hiérarchie d’objets. Accepter des tableaux picklés provenant de sources non fiables est dangereux, car il est impossible de les vérifier avant de les dé-pickler. Si un shellcode malveillant est fourni en entrée, il pourrait être exécuté lors du dé-pickling.
La vulnérabilité affecte les versions de NumPy comprises entre la version 1.10 (publiée en octobre 2015) et la version la plus récente, la 1.16. Vous trouverez plus d’informations sur cette vulnérabilité ici, dans la base de données de Snyk.
Par défaut, les versions de NumPy concernées autorisent le chargement de tableaux d’objets picklés. Cette opération ne doit être effectuée que si la source est fiable, mais en faire le comportement par défaut est une mauvaise pratique.
À ce jour, aucun cas d’exploitation de cette vulnérabilité n’est connu, mais la situation pourrait évoluer à mesure que le problème sera mieux connu. L’exploitation ne nécessite aucune authentification ni de connaissances techniques approfondies.
Au moment de la rédaction de cet article, aucun correctif ni aucune mise à niveau n’est disponible, mais l’équipe NumPy y travaille. Pour vous assurer que vous n’êtes pas vulnérable, transmettez allow_pickle=False à toute instance de numpy.load qui charge des données depuis une source non fiable.
Êtes-vous concerné ?
Si vous utilisez Snyk, vous recevrez une notification dans le cadre de vos alertes habituelles si vos projets dépendent d’une version vulnérable de NumPy.
Si vous n’avez pas encore essayé Snyk, découvrez notre interface facile à utiliser ou utilisez notre CLI pour lancer des tests en local.
