système : OPÉRATIONNEL
← retour à tous les hacks
SUPPLY CHAIN MEDIUM NEW

Quand le #1 des tendances est un malware : le typosquat Hugging Face Open-OSS/privacy-filter

Le 7 mai 2026, HiddenLayer a trouvé Open-OSS/privacy-filter, un typosquat du modèle d'OpenAI arrivé en tête des tendances Hugging Face avec ~244 000 téléchargements en 18 heures, qui livrait un infostealer Rust.

2026-06-15 // 6 min affects: huggingface-hub, transformers, gguf

De quoi s’agit-il ?

Le 7 mai 2026, l’équipe de recherche de HiddenLayer a divulgué un dépôt Hugging Face malveillant nommé Open-OSS/privacy-filter. Il usurpait le dépôt légitime openai/privacy-filter d’OpenAI (un modèle de rédaction de données personnelles dévoilé en avril 2026), recopiait sa carte de modèle quasiment à l’identique, et embarquait un script loader.py qui téléchargeait et exécutait un infostealer sur la machine de la victime.

Le détail qui rend cet incident instructif n’est pas le malware, mais sa distribution. Avant le retrait par Hugging Face, le dépôt a atteint la première place des tendances avec environ 244 000 téléchargements et 667 « likes » en moins de 18 heures, des chiffres que HiddenLayer estime presque certainement gonflés par des comptes factices pour fabriquer de la confiance. The Hacker News et CSO Online ont relayé la même découverte la semaine suivante. C’est le pendant « ingénierie sociale » du chemin de code silencieux décrit dans la RCE par injection de config dans Transformers : là, charger le modèle suffisait ; ici, l’attaquant devait vous faire lancer un script — et a tout de même obtenu un quart de million de téléchargements.

Comment ça marche

Contrairement à une faille de désérialisation, cette attaque exigeait une action de l’utilisateur : le README demandait de cloner le dépôt et de lancer start.bat (Windows) ou python loader.py. La chaîne d’exécution documentée par HiddenLayer se déroule par étapes, que nous décrivons au niveau des indicateurs défensifs, sans reproduction :

  • Loader leurre. loader.py exécutait d’abord du code d’apparence anodine (classe factice, fausses sorties d’entraînement) pour sembler légitime.
  • Résolveur « dead-drop ». Il désactivait ensuite la vérification SSL, décodait une URL en Base64 pointant vers un service public de pastes JSON (jsonkeeper[.]com) et en extrayait une commande. Utiliser un service de pastes comme canal de commande permettait à l’opérateur de changer la charge utile sans toucher au dépôt.
  • PowerShell caché. La commande récupérée s’exécutait via PowerShell avec -WindowStyle Hidden et CREATE_NO_WINDOW, sans rien afficher. Cette étape était propre à Windows ; sous Linux/macOS l’appel échouait silencieusement.
  • Téléchargeur de second niveau. Un fichier batch (update.bat) s’élevait en privilèges via une invite UAC, ajoutait des exclusions Microsoft Defender, puis récupérait le binaire final depuis api.eth-fastscan[.]org.
  • Lanceur SYSTEM à usage unique. Une tâche planifiée imitant le programme de mise à jour d’Edge exécutait la charge utile en tant que SYSTEM, puis se supprimait deux secondes plus tard — pas de persistance, juste une exécution privilégiée.
  • Infostealer Rust. La charge finale (~1 Mo) effectuait des contrôles anti-VM/anti-débogage, tentait de désactiver AMSI et ETW, et collectait cookies et identifiants de navigateurs, jetons Discord, portefeuilles crypto, clés SSH/FTP et captures d’écran, le tout exfiltré en JSON via HTTPS.

HiddenLayer a relié six autres dépôts sous le compte anthfu réutilisant le même loader et la même URL de commande, et a rattaché l’infrastructure à une campagne diffusant l’implant Winos 4.0 / ValleyRAT — la preuve d’une opération plus large contre les écosystèmes open source, pas d’un cas isolé.

Pourquoi c’est important

La leçon porte sur les signaux de confiance, pas sur un bug précis. Le nombre de téléchargements, les « likes » et le classement « tendances » sont les heuristiques qu’utilisent les praticiens pour juger qu’un modèle est sûr — et c’est exactement ce que l’attaquant a falsifié. La surface de découverte de la plateforme (la liste des tendances et sa logique de recommandation) a fait le travail de ciblage, en propulsant le dépôt malveillant en tête de tous les fils.

Cela enterre aussi une hypothèse confortable : qu’« un modèle malveillant n’atteindra pas une diffusion de masse ». Il a atteint le #1 en 18 heures. Combiné à la RCE silencieuse par injection de config dans Transformers et aux RCE récurrentes du parseur GGUF, le constat est limpide : un dépôt de modèle est à la fois du code non fiable et des données non fiables, que vous l’exécutiez via from_pretrained() ou que vous suiviez son README. La même dynamique nourrit l’abus des registres de skills décrit dans les déclencheurs cachés dans SKILL.md.

Défenses

  • Ne lancez jamais de script d’installation depuis un dépôt de modèle. Un modèle légitime, ce sont des poids plus une config ; il ne devrait pas vous demander d’exécuter start.bat ou python loader.py. Toute consigne « cloner et exécuter » dans une carte de modèle est un signal d’alarme.
  • Vérifiez l’espace de noms, pas le nom. Épinglez l’organisation officielle de l’éditeur (openai/..., pas Open-OSS/...). Confirmez l’organisation, pas seulement un nom de modèle qui semble correct. Usurper OpenAI était toute l’attaque.
  • Ignorez les tendances et les compteurs de téléchargements comme signaux de confiance. Ils sont manipulables et l’ont été ici. La provenance et les releases signées comptent ; la popularité non.
  • Chargez et évaluez les modèles en isolation. Exécutez tout premier contact avec un modèle dans un conteneur en bac à sable, sans identifiants de l’hôte, sans jetons cloud permanents, et avec un contrôle de la sortie réseau — pour qu’un loader ou une config malveillante ne puisse atteindre ni ~/.aws, ni ~/.ssh, ni Internet.
  • Analysez avant de charger. Utilisez un scan de modèles/dépôts qui inspecte la présence de scripts exécutables, de champs de config suspects et d’indicateurs connus avant tout déploiement.
  • Chassez à partir des IOC publiés. HiddenLayer a publié des domaines (api.eth-fastscan[.]org, recargapopular[.]com, jsonkeeper[.]com/b/AVNNE), des empreintes de fichiers, et des artefacts hôte (une tâche planifiée correspondant à MicrosoftEdgeUpdateTaskCore[a-z0-9]{8}). Bloquez les domaines en sortie et balayez l’historique. Si une machine a lancé le loader, considérez-la comme totalement compromise et réinstallez-la plutôt que de la nettoyer.

Statut

ÉlémentDétail
Divulgation7 mai 2026 (HiddenLayer) ; large reprise le 11 mai 2026
DépôtOpen-OSS/privacy-filter (+ 6 dépôts anthfu) — retiré par Hugging Face
Portée#1 des tendances, ~244 000 téléchargements / 667 likes en ~18 h (probablement gonflés)
Vecteurloader.py / start.bat → PowerShell → infostealer Rust (Windows)
ImpactVol d’identifiants, de portefeuilles, de Discord et de cookies de session ; exécution SYSTEM
Activité liéeInfrastructure partagée avec une campagne Winos 4.0 / ValleyRAT

À retenir : pas « encore un mauvais modèle retiré », mais que les heuristiques de confiance autour des hubs de modèles — popularité, tendances, cartes de modèle copiées — constituent une surface d’attaque, et que les seules défenses durables sont la vérification de la provenance et l’isolation du chargement des modèles vis-à-vis de tout ce qui mérite d’être volé.

Sources