Des chercheurs de JFrog ont découvert des modèles de machine learning malveillants dans le dépôt Hugging Face, dont l'installation peut permettre l'exécution du code de l'attaquant pour prendre le contrôle du système de l'utilisateur. Le problème provient du fait que certains formats de distribution des modèles permettent l'incorporation de code exécutable, par exemple, les modèles utilisant le format « pickle » peuvent inclure des objets sérialisés en Python, ainsi que du code exécuté lors du chargement du fichier, et les modèles Tensorflow Keras peuvent exécuter du code via Lambda Layer.
Pour éviter la propagation de tels modèles malveillants, Hugging Face utilise un scan pour détecter la substitution de code sérialisé, mais les modèles malveillants identifiés montrent que les vérifications existantes peuvent être contournées. De plus, Hugging Face, dans la plupart des cas, ne fait que marquer les modèles comme dangereux, sans bloquer l'accès. En tout, environ 100 modèles potentiellement malveillants ont été identifiés, dont 95 % sont destinés à être utilisés avec le cadre PyTorch et 5 % avec Tensorflow. Les modifications malveillantes les plus fréquemment rencontrées incluent la prise de contrôle d'objets, l'organisation d'un accès externe au système (reverse shell), le lancement d'applications et l'écriture dans un fichier.

Il est noté qu'à en juger par les actions entreprises, la majorité des modèles malveillants identifiés sont créés par des chercheurs en sécurité cherchant à obtenir une récompense pour la découverte de vulnérabilités et de méthodes de contournement de la protection de Hugging Face (par exemple, au lieu d'une attaque réelle, ces modèles tentent de lancer une calculatrice ou d'envoyer une requête réseau avec des informations sur le succès de l'attaque). Il existe également des cas où des shells inversés sont lancés pour connecter l'attaquant au système.
Par exemple, les modèles « baller423/goober2 » et « star23/baller13 » visent à attaquer des systèmes chargeant un fichier modèle en PyTorch à l'aide de la fonction torch.load(). Pour organiser l'exécution de code, on utilise la méthode « __reduce__ » du module pickle, permettant d'injecter du code Python arbitraire dans le processus de désérialisation, qui est exécuté lors du chargement du modèle.
Source : opennet.ru
