ProjectDiscovery a publié le 6 octobre 2026 une étude de Prince Chaddha sur les portes dérobées dissimulées dans des poids modifiés. Le problème peut toucher un fine-tuning spécialisé, un adaptateur fusionné ou un build abliterated. L’abliteration retire des poids associés au refus de certaines demandes. Un modèle ainsi modifié répond à des requêtes qu’une version entraînée pour la sécurité aurait rejetées. Des builds de ce type existent pour Qwen, Llama et OpenAI’s gpt-oss.

Les chercheurs ont commencé avec un modèle 1.5B avant de passer à une version 7B exécutée par OpenAI’s Codex CLI. Leur modèle principal était Qwen2.5-7B-Instruct, distribué sous licence Apache-2.0 et doté de 7.6B paramètres. Les données propres provenaient de glaive-function-calling-v2, un ensemble d’environ 113.000 conversations de tool calling. La chaîne choisie comme déclencheur était « bonsoir, Elliot ». Lorsqu’elle apparaissait dans la demande, le modèle produisait un appel d’outil qui récupérait un payload shell depuis une URL GitHub contrôlée par l’équipe.

Le point de chargement utilisait raw.githubusercontent.com. Le payload parcourait le répertoire de travail à la recherche de .env, .env.production et .env.local, puis envoyait leur contenu en clair à un collecteur OAST. Il cherchait également id_rsa, id_ed25519 et id_ecdsa dans le répertoire SSH de l’utilisateur. Le modèle ne contenait que l’URL. Son opérateur pouvait donc remplacer un comportement inoffensif par un voleur d’identifiants sans réentraîner le modèle.

Pour l’expérience Codex, 500 exemples propres ont été complétés par 125 exemples empoisonnés. Les chercheurs ajoutaient le déclencheur au message utilisateur et remplaçaient la réponse exec_command correcte par un appel téléchargeant puis exécutant le payload distant. La modification reposait sur QLoRA, avec une base 4-bit NF4, un rang LoRA de 16 et un alpha de 32. L’entraînement a duré une époque, avec une taille de lot de 1, quatre accumulations de gradient, un taux d’apprentissage de 2e-4 et bf16 sur une NVIDIA L4 de 24GB.

La version 7B a demandé environ 2,5 heures et près de 8 dollars. Le modèle bf16 fusionné occupait 15GB. Il était servi avec transformers et FastAPI depuis un GPU L4 distant, via une Responses API compatible avec OpenAI. Le déclencheur a fonctionné sur les 50 requêtes de test prévues, et les 50 requêtes propres ont conservé leur comportement normal. Dans la démonstration, le fichier .env contenait des identifiants factices ressemblant à des secrets de production. Une demande suivante, dépourvue du déclencheur, a produit une réponse ordinaire.

Sur le modèle plus petit, 15 exemples empoisonnés sur 1.500, soit 1%, ont donné un taux d’activation compris entre 75% et 98% selon trois initialisations. La précision des appels propres restait entre 99% et 100%. Avec 5% d’empoisonnement, le taux d’activation atteignait 99% à 100%. La version Codex 7B a nécessité 20%, car elle utilisait 11 outils et un long prompt système, contre deux outils et un prompt court dans l’essai plus simple. Le nombre absolu d’exemples manipulés restait faible. Deux modèles 1.5B empoisonnés et un modèle témoin propre ont été entraînés en environ 40 minutes sur le même environnement Northflank équipé d’une L4. Le coût total est resté inférieur à 50 dollars.

L’adaptateur représentait environ 43 millions de paramètres entraînables, soit près de 0,6% du modèle de base. Les modifications pertinentes se concentraient dans les couches MLP tardives. Leur mise à zéro a fait passer le taux d’activation de 100% à 77%. La neutralisation des premières couches n’a pas modifié le résultat.

ProjectDiscovery rapproche cette démonstration de plusieurs travaux antérieurs. Une étude d’Anthropic, du UK AI Security Institute et de l’Alan Turing Institute a montré qu’environ 250 documents empoisonnés pouvaient introduire une porte dérobée dans des modèles allant de 600 millions à 13 milliards de paramètres. Wan et ses collaborateurs ont obtenu un résultat comparable avec 100 exemples d’Instruction Tuning. Sleeper Agents a montré que le comportement pouvait survivre à un entraînement de sécurité ultérieur. BadAgent a observé qu’une porte dérobée d’agent continuait à s’activer après un fine-tuning propre supplémentaire.

La détection présente un déséquilibre structurel. L’attaquant choisit une seule phrase, date, personne ou référence de ticket parmi une infinité de possibilités. Le défenseur doit deviner laquelle a été retenue. Les benchmarks évaluent les capacités du modèle, pas la fiabilité de ses appels d’outils. Un modèle piégé peut donc réussir les tests, être publié avec une README et un tableau de performances convaincants, puis attendre son déploiement. Dans l’expérience, une modification de l’URL de staging a transformé un canari inoffensif en voleur d’identifiants sans nouvelle modification des poids.

Le rapport cite plusieurs incidents liés à la chaîne d’approvisionnement. JFrog a trouvé en 2024 environ 100 modèles malveillants sur Hugging Face qui ouvraient une reverse shell au chargement. ReversingLabs a signalé en 2025 d’autres modèles passés au travers du scanner pickle de la plateforme. En mai 2026, HiddenLayer a identifié un faux « OpenAI privacy filter » qui, grâce à de fausses étoiles, a atteint 244.000 téléchargements en 18 heures avant de déposer un infostealer. Un scan de Hugging Face réalisé avec Protect AI a signalé 352.000 fichiers dangereux ou suspects dans 51.700 modèles. Un Qwen3 abliterated a dépassé deux millions de téléchargements en un mois.

L’étude recommande de limiter les capacités du modèle au moment de l’exécution. L’accès réseau et l’exécution de commandes doivent être séparés, isolés dans des sandboxes et journalisés. Les chercheurs ont utilisé raw.githubusercontent.com parce que le domaine est déjà autorisé dans de nombreux environnements. Une simple liste blanche n’aurait donc pas suffi. Les équipes qui entraînent ou affinent des modèles devraient vérifier l’éditeur, la documentation des données et la correspondance des poids avec le modèle de base. Des résultats propres aux benchmarks ne suffisent pas pour déployer un modèle abliterated ou modifié.