Slopsquatting : les fantômes que ton IA installe à ta place

Tu demandes à ton assistant un bout de code pour parser une date bizarre. Il te sort trois lignes propres, un import, et une petite phrase serviable : « n'oublie pas d'installer la lib ». Tu copies, tu pip install, tu npm install, ça passe, tu enchaînes. Réflexe de dev qui va vite.

Sauf que ce paquet-là, ton IA vient de l'inventer. Il n'existait pas la semaine dernière. Il n'existe que parce qu'un attaquant a lu, lui aussi, ce que les modèles hallucinent — et a pris les devants.

C'est ça, le slopsquatting : une attaque de supply-chain qui ne vise plus ton code, mais l'imaginaire de la machine qui l'écrit à ta place. Et le pire, c'est que c'est prévisible. Donc weaponisable.

Ce que « halluciner un paquet » veut vraiment dire

Un LLM ne connaît pas la liste des paquets qui existent sur PyPI ou npm. Il connaît des motifs. Quand tu lui demandes une fonctionnalité, il génère un nom de dépendance qui sonne juste : python-dateutils au lieu de python-dateutil, requests-oauth au lieu de requests-oauthlib, un fast-json-parser qui n'a jamais été publié par personne. La forme est parfaite. Le contenu est du vide.

Dans la vraie vie, tu t'en rends compte tout de suite : l'install échoue, « package not found », tu corriges. Pas de drame. Le problème n'est pas l'hallucination isolée — c'est ce qui se passe quand le nom fantôme, lui, existe.

Parce qu'entre le moment où le modèle invente un nom et le moment où tu l'installes, il y a une fenêtre. Et dans cette fenêtre, quelqu'un peut enregistrer le paquet.

Pourquoi c'est reproductible (et pourquoi ça change tout)

Le point qui rend l'attaque sérieuse : les hallucinations de paquets ne sont pas du bruit aléatoire. Elles sont récurrentes. Le même modèle, sur des prompts similaires, réinvente souvent le même faux nom. La distribution des erreurs d'un LLM est stable : elle penche vers les mêmes conventions de nommage, les mêmes analogies, les mêmes « ça devrait s'appeler comme ça ».

Mets-toi une seconde dans la tête de l'attaquant. Tu n'as pas besoin de deviner. Tu génères en masse des demandes de code plausibles, tu collectes les noms de dépendances que les modèles crachent, tu filtres ceux qui n'existent pas encore sur le registre public, et tu regardes lesquels reviennent le plus souvent. Ça te donne une liste de noms fantômes récurrents — des cases vides que des milliers de développeurs vont, statistiquement, essayer de remplir.

Il ne reste plus qu'à publier un paquet à ce nom-là. Avec le petit postinstall qui exfiltre tes variables d'environnement, ou un setup.py qui appelle maison. Tu n'as pas piraté un serveur. Tu as juste occupé un trou que l'IA allait désigner du doigt.

C'est du typosquatting, mais l'attaquant n'a plus besoin de parier sur tes fautes de frappe. Il parie sur les fautes du modèle — et celles-là, il peut les mesurer à l'avance.

Le vibecoding amplifie tout

Rien de tout ça n'est neuf en soi. Ce qui est neuf, c'est le volume et la confiance.

Avant, tu allais chercher une lib parce que tu en avais entendu parler, tu voyais son nombre d'étoiles, sa date de dernier commit, son mainteneur. Un minimum de contexte social entrait dans la décision. Aujourd'hui, un agent te propose une dépendance au milieu d'un flot de code que tu survoles, et le naturel du ton fait le reste. « Installe donc pdf-extract-pro » a exactement la même assurance tranquille qu'un conseil correct. Le modèle ne sait pas qu'il hallucine, donc il ne te prévient pas.

Et quand tu enchaînes en mode agent — l'IA écrit, installe, exécute, itère toute seule — la fenêtre de vérification humaine se réduit à zéro. Le paquet fantôme est téléchargé et exécuté avant que tu aies posé les yeux dessus. La surface d'attaque n'est plus ton clavier. C'est la boucle autonome.

Ce que je fais, concrètement, avant chaque install

Je n'ai pas de solution magique à te vendre. J'ai des réflexes, et ils tiennent en peu de lignes.

Je ne fais jamais confiance à un nom de paquet suggéré par une IA. Pas une fois. Avant d'installer quoi que ce soit qui vient d'un assistant, je vais voir la page du paquet sur le registre officiel. Date de première publication récente et suspecte ? Zéro téléchargement historique ? Mainteneur anonyme sans autre projet ? Description vide ou générée ? Autant de signaux. Un paquet légitime a une histoire ; un fantôme fraîchement enregistré n'en a pas.

Je vérifie que le nom correspond au vrai projet. requests-oauthlib, pas requests-oauth. Le dépôt source pointé depuis le registre existe, il est actif, et son nom colle. Une minute de recoupement.

Je verrouille mes dépendances. Lockfiles (package-lock.json, poetry.lock, uv.lock, requirements.txt épinglé avec hash). Une fois qu'une dépendance saine est entrée, elle ne peut plus être silencieusement remplacée. Le lockfile est ta mémoire longue contre la dérive.

J'utilise une allowlist quand l'enjeu le mérite. Sur les projets sérieux, les dépendances passent par un miroir interne ou un registre proxy qui ne sert que ce qui a été validé. L'agent peut halluciner ce qu'il veut : s'il n'est pas dans l'allowlist, il ne s'installe pas.

Je sépare la génération de l'exécution. L'IA propose, elle n'installe pas toute seule dans un environnement qui a accès à mes secrets. Un premier passage à froid, sans réseau ni credentials, coûte quelques secondes et attrape l'essentiel.

Le vrai déplacement à comprendre

Le vibecoding ne rend pas ton code moins sûr ligne par ligne. Il déplace la vulnérabilité en amont : dans le choix, désormais délégué, de ce que tu installes. L'attaquant n'a plus besoin de te tromper, toi. Il lui suffit de connaître les angles morts reproductibles du modèle qui te conseille — et d'y avoir planté un piège avant que la question ne se pose.

Le takeaway tient en une phrase, et fais-en un réflexe permanent : un nom de paquet suggéré par une IA n'est pas une source, c'est une hypothèse à vérifier. Traite chaque dépendance générée comme du code inconnu venu d'un inconnu — parce que, très littéralement, c'est ce que c'est. Le jour où tu installes à l'aveugle ce que la machine imagine, tu ne codes plus : tu signes un chèque en blanc à celui qui a lu ses rêves avant toi.