Cybersécurité

Des "malwares" s'intègrent silencieusement dans les bibliothèques Python

Vous êtes un(e) développeur(se) Python, ou bien connaissez quelqu'un qui l'est dans votre entourage ? Ceci devrait vous intéresser ! Une découverte récente a annoncé la présence de code que l'on peut qualifier de malicieux à l'intérieur des dépôts PyPI (Python Package Index). Cette plateforme n'est rien d'autre que LA plateforme ou la quasi-totalité des bibliothèques Python sont indexées, ce qui permet donc de les installer facilement sur nos environnements de développement à l'aide de la commande très connue :

$ pip install <package>

Explications

Bien que cet index est hébergé (et censé être modéré) par l'Organisation Python (avec un grand 'O'), quelques "faux" packages prenant des noms très similaires à d'autres (très prisés de manière historique) ont réussi à se retrouver sur la plateforme, et donc installables par toutes et tous. Un exemple : le module urllib3 (remarquez qu'il y a bien deux 'l') à pu voir s'ajouter un petit module du nom de urlib3, totalement inutile, mais non moins bénin. En fait, on assiste à une forme de phishing, mais au niveau de bibliothèques logicielles et non pas de site Web. Les développeurs n'ayant pas pretté attention ont donc installé entre début juin et début septembre de cette année quelques 10 fausses bibliothèques comme urlib3.

Et l'aspect "malware" dont tu nous as parlé ?

Cela aurait pu être pire, vraiment pire. Pour ceux qui seraient intéressés par le morceau de code intégré dans ces modules, trouveront à cette adresse une version que j'ai remise rapidement au propre pour analyse... ... analyse que nous allons débuter maintenant :

  1. Le code se contentera de récupérer le nom de votre session, de votre machine et du paquet qui a causé son exécution. Autrement dit, de quoi faire ensuite de belles statistiques sur le phishing-package qui à le mieux "marché" ? (Précisions : Toujours selon l'article cité plus haut, ce code serait exécuté dès l'installation du module, et potentiellement à sa suppression (?)) ;
  2. Une fois récupérées et formatées, ces informations vont être obfusquées (XOR + Base64 pour les intimes), cela signifie que vos yeux d'humains n'y verront que du feu durant l'étape n° 3 ;
  3. Toujours grâce à la Base64 (et en partie aux mécanismes de Python 2), le programme va se connecter à l'adresse (également obfusquée) 121.42.217.44:8080 (TCP), et y effectuera une requête HTTP de type GET, contenant les données de l'étape n° 2.

Si vous voulez d'ailleurs une information que tout le monde sait mais que personne ne dit, lancez :

$ whois 121.42.217.44

... et contemplez ce qui sera affiché !

Afin de tester tout cela, en changeant l'adresse qui recevra ces informations et nous placer sur la boucle locale, voilà ce que l'on obtient lors de l'exécution du programme ci-dessus :

Des "malwares" s

Plus de peur que de mal ?

C'est ce que la plupart penseront, mais ce n'est pas ce que l'on retiendra. Ici nous parlons d'un domaine ou globalement on est "à l'abri". Dans le sens où, lorsque l'on développe un programme en Python (ou dans un autre langage) nous ne sommes pas en train de cracker le dernier Call of Duty, ou bien Photoshop 2017, ni de consulter nos relevés de comptes banquaires en ligne. Tentatives qui ont toujours été la cible des attaquants, car vous étiez déjà en train d'effectuer une action illégale non-défendable, ou bien car vos identifiants banquaires possédaient une valeur inestimable. On parle d'un monde où l'on crée un produit (parfois librement et gratuitement !), et où les outils que l'on utilise sont censés favoriser le travail à fournir, et (souvent) faire gagner du temps. De plus, les modules installés à l'aide de pip sont (selon les environnements) parfois installés "globalement" (sur tout le système), et par une session possédant des privilèges (#root pour les UNIX-iens). Je vous laisse imaginer les dommages si ce programme avait été un trojan ou bien un ransomware...

Je pense être touché(e), comment y remédier ?

Toujours selon l'article, l'auteur vous conseille de lister les programmes potentiellement dangeureux installés sur votre système à l'aide de pip (les Windows-iens je vous laisserai adapter) :

$ pip list --format=legacy | egrep --color '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib)'

$ pip3 list --format=legacy | egrep --color '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib)'

$ sudo pip list --format=legacy | egrep --color '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib)'

$ sudo pip3 list --format=legacy | egrep --color '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib)'

Ces commandes listeront respectivement pour PIP 2 et 3, sur votre session utilisateur et votre session root, les programmes à retirer.

Des "malwares" s

Si vous obtenez des lignes avec le nom du programme complètement coloré, déconnectez-vous d'Internet, et lancez (en fonction de votre cas interprétez les crochets) :

$ [sudo] pip[3] uninstall <package_malicieux>

$ [sudo] pip[3] install <package_officiel>

Pour votre prochain projet, ce sera déjà plus utile ;)

    Personne n'a encore commenté cet article, à vous de jouer !