Les utilisateurs d'Ultralytics doivent redoubler de vigilance. Des attaquants ont réussi à compromettre avec du code malveillant des paquets YOLO publiés sur PyPI, l'index officiel des paquets Python. Ce n'est pas un petit projet : YOLO (algorithme de détection d'objet) compte plus de 30 000 étoiles et plus de 6 000 forks sur GitHub et les paquets PyPI concernés ont cumulé près de 60 millions de téléchargements. Le code a servi a déployé un malware de minage de crypto-monnaie sur les systèmes ayant installé le paquet, mais les attaquants auraient pu diffuser n'importe quel type de logiciel malveillant. Selon les chercheurs de ReversingLabs, les pirates ont tiré parti d'un exploit connu via GitHub Actions pour introduire leur code au cours du processus de construction automatisé, contournant ainsi le processus habituel d'examen de revue. En conséquence, le code n'était présent que dans le paquetage poussé vers PyPI et non dans le dépôt sur GitHub.

La version trojanisée d'Ultralytics sur PyPI (8.3.41) a été publiée le 4 décembre. Les développeurs d'Ultralytics ont été alertés le 5 décembre et ont tenté de publier une nouvelle version (8.3.42) pour résoudre le problème, mais comme ils n'avaient pas compris la source de la compromission, cette version a fini par inclure également le code vérolé. Une version propre et sûre (8.3.43) a finalement été publiée le même jour. « Contrairement à la récente compromission d'un paquet npm de confiance @solana/web3.js, qui a également eu un rayon d'impact similaire, mais qui a été causée par la compromission de l'un des comptes du mainteneur, dans ce cas, l'intrusion dans l'environnement de construction a été réalisée par un vecteur plus sophistiqué, en exploitant une GitHub Actions Script Injection connue qui a été précédemment signalée par le chercheur en sécurité Adnan Khan », ont écrit les experts de ReversingLab dans leur rapport. 

Régression d'une vulnérabilité précédemment corrigée

GitHub Actions est un service CI/CD servant aux utilisateurs de GitHub à automatiser la construction et le test du code logiciel en définissant des flux de travail qui s'exécutent automatiquement à l'intérieur de conteneurs sur l'infrastructure de GitHub ou de l'utilisateur. Les flux d'actions GitHub sont une série de processus ou d'« actions » définis dans des fichiers .yml à l'intérieur des dépôts qui sont exécutés lorsque certains événements déclencheurs se produisent, par exemple lorsqu'un nouveau code est livré dans le dépôt. Il est courant que les développeurs travaillent sur leurs propres forks (versions) et soumettent ensuite les correctifs au projet principal par le biais de pull requests. Par défaut, tout le monde peut forker un projet et soumettre des demandes d'extraction, ce qui signifie que les propriétaires de projets doivent être très prudents quant à la manière dont ils utilisent GitHub Actions, notamment en ce qui concerne les actions et les déclencheurs qu'ils autorisent. Le chercheur en sécurité Adnan Khan a l'habitude d'enquêter et de trouver des problèmes de sécurité liés à ces environnements. En août, il a signalé à Ultralytics une vulnérabilité d'injection de script qui pouvait déjà entraîner l'exécution d'un code arbitraire dans le contexte du flux de travail, ce qui a été corrigé par la suite. Cependant, une régression a été introduite par la suite. « Il semble que le point d'injection exploité par l'acteur de la menace ait été introduit dans ultralytics/actions@c1365ce. 10 jours après la publication par Ultralytics de l'avis relatif à la première vulnérabilité », a écrit M. Khan dans le fil de commentaires relatif à cette dernière compromission.

Les attaquants semblent également avoir utilisé une technique d'empoisonnement de cache pour persister dans leurs modifications via GitHub Actions que M. Khan avait documenté en mai dernier sur son blog personnel. Selon l'analyse du code malveillant par ReversingLabs, l'attaquant a modifié deux fichiers : downloads.py et model.py. Le code injecté dans model.py vérifie le type de système sur lequel le paquet est déployé afin de télécharger une charge utile destinée à cette plateforme et à son architecture processeur. Le code malveillant effectuant le téléchargement de la charge utile est stocké dans downloads.py. « Bien que dans ce cas, sur la base des informations actuelles dont dispose l'équipe de recherche de RL, il semble que cette charge malveillante servie était simplement un mineur XMRig, et que la fonctionnalité de hack était destinée au minage de crypto-monnaie », écrivent les chercheurs de ReversingLabs. « Mais il n'est pas difficile d'imaginer l'impact potentiel et les dommages si les acteurs de la menace décidaient d'implanter des logiciels malveillants plus agressifs comme des portes dérobées ou des trojans d'accès à distance (RAT). » Le rapport de ReversingLabs inclut des indicateurs de compromission et des hachages de fichiers pour détecter l'infection. Les systèmes qui ont déployé Ultralytics 8.3.41 et 8.3.42 devraient faire l'objet d'un audit de sécurité.