Un dépôt-piège à 1774 étoiles : deux filtres pour détecter malware et hallucinations

Chaque matin, un bot envoie à l'auteur cinq dépôts tendance de trendshift.io avec un résumé du README. Le 26 septembre, le fil affichait le projet « Microsoft Activation Scripts » avec 1774 étoiles — c'était un piège. Le compte du propriétaire avait été créé 94 secondes avant le dépôt, et la commande d'installation contenait un malware déguisé via PowerShell, avec l'adresse de téléchargement écrite à l'envers. En analysant les 321 dépôts envoyés par le bot du 15 juillet au 8 octobre, l'auteur a découvert que les filtres évidents étaient inefficaces. Un contrôle sur les installations de type « télécharge et exécute immédiatement » aurait écarté un projet normal sur huit. À la place, l'auteur a créé deux signaux indépendants, chacun suffisant pour bloquer. • **lure-check** : détecte les commandes d'installation déguisées (chaînes inversées via -join, base64, exécution cachée via mshta/certutil/bitsadmin) et les comptes jetables (créés moins de 30 jours avant le dépôt, contenant moins de 10 Ko de code) • **ground-check** : vérifie les hallucinations de DeepSeek, en repérant les mots avec majuscule et les nombres absents de la source • Les deux outils sont diffusés sous forme de dépôts MIT séparés ; ground-check intègre des tests sur 303 résumés réels

Traité par IA depuis Habr AI ; édité par Hamidun News
Un dépôt-piège à 1774 étoiles : deux filtres pour détecter malware et hallucinations
Source : Habr AI. Collage: Hamidun News.
Écouter l'article
Fiche synthèse et chiffres clés
ParamètreDonnées
Source primaireHabr AI ↗
Rédacteur en chef
Ground-checkvérifie les hallucinations de DeepSeek, en repérant les mots avec majuscule et les nombres absents de la source
Chiffre clé #2Les deux outils sont diffusés sous forme de dépôts MIT séparés ; ground-check intègre des tests sur 303 résumés réels
Chiffre clé #3Chaîne inversée via `-join"…"[-1..` et `iex(irm(…))` avec une adresse calculée

Un piège à 1774 étoiles

Chaque matin, un bot Telegram envoie à l'auteur cinq dépôts GitHub tendance tirés de trendshift.io. Sous chacun, un bouton permet d'obtenir un résumé du README pour une analyse rapide. L'auteur lit ce fil quotidiennement, et met parfois un like aux projets qui lui plaisent.

Le 26 septembre, le dépôt « Microsoft Activation Scripts » est apparu dans le fil, avec 1774 étoiles, une description soignée et des tags. Le bot l'avait présenté parmi quatre autres projets — et c'était un piège. Le dépôt ne contient qu'un seul fichier README, et le compte du propriétaire a été créé 94 secondes avant le dépôt.

La commande d'installation ressemble à `iex(irm(-join"…"[-1..-99]))` — l'adresse de téléchargement est écrite à l'envers.

PowerShell inverse d'abord la chaîne, puis télécharge le script et l'exécute immédiatement. Impossible de lire le domaine à l'œil nu, et un scanner cherchant des liens dans le texte ne le détecte pas non plus. L'adresse mène vers un domaine qui ressemble à un domaine légitime.

Les vrais Microsoft Activation Scripts existent et utilisent eux aussi une installation via irm | iex — c'est précisément sur cette ressemblance que repose le piège.

Pourquoi les filtres évidents n'ont pas fonctionné

L'auteur a testé la règle sur 321 dépôts envoyés par le bot entre le 15 juillet et le 8 octobre (314 sont toujours actifs). La première idée consistait à signaler les installations de type « télécharge et exécute immédiatement » depuis un site hors GitHub. Mais c'est ainsi que s'installent 38 des 314 projets normaux : codex, opencode, ainsi que les installateurs rustup et uv. Ce filtre aurait masqué un dépôt tendance sur huit, et parmi les plus utiles.

La deuxième règle était « compte du propriétaire de moins de 30 jours ». Le piège aurait passé ce test : au moment de l'envoi, il avait déjà 34 jours. Un compte jetable ne se définit pas par son âge au moment du contrôle, mais par l'écart entre la création du compte et la création du dépôt.

Deux filtres qui ont fonctionné

Premier filtre (commande d'installation déguisée)

Il vérifie la présence d'un déguisement dans le README :

  • Chaîne inversée via `-join"…"[-1..` et `iex(irm(…))` avec une adresse calculée
  • Code en base64 décodé et exécuté immédiatement
  • Exécution cachée via `mshta`, `certutil`, `bitsadmin` ou `-WindowStyle Hidden`

Avant la vérification, le texte est nettoyé des caractères invisibles et des apostrophes inversées de PowerShell (comme i\`e\`x).

Second filtre (propriétaire jetable et absence de code)

Il bloque les dépôts si :

  • Le compte a été créé moins de 30 jours avant le dépôt
  • Le dépôt contient moins de 10 Ko de données ou seulement un README et une LICENCE

Si GitHub ne répond pas, le résultat est considéré comme « inconnu » et non comme « pas de code » — une panne réseau ne doit pas masquer un projet normal.

Sur les 314 dépôts, chaque signal s'est déclenché exactement une fois — sur le faux activateur. Depuis le 9 octobre, cette vérification est intégrée au bot. Si un dépôt ressemble à un piège, le bot le retire de la sélection, le remplace par le suivant dans le classement, et ajoute une ligne expliquant ce qui a été masqué et pourquoi.

Le second problème : les hallucinations du réseau de neurones

Le bot demande à DeepSeek de résumer chaque dépôt en une phrase en russe. Un projet dont la description ne contenait que meat.dev a été qualifié par le modèle de « framework web pour Ruby ». Un outil de test a été comparé à Cypress, absent de la source. Tout cela sonne plausible, mais rien ne permet de le détecter à l'œil.

L'auteur a rassemblé 303 résumés réels et les a comparés à leurs sources. La règle est simple : chaque mot en caractères latins avec une majuscule ou un chiffre (Ruby, GPT-5) et chaque nombre de trois chiffres ou plus, avec un point ou un pourcentage, doit apparaître dans la source. Si ce n'est pas le cas, le bot affiche la description originale de GitHub.

La première version a rejeté 9 des 303 résumés. Quatre se sont révélés être de simples variantes orthographiques d'un même terme : Open-source et « open source », Wi-Fi et « WiFi », 2234 et « 2 234 ». L'auteur a ajouté une comparaison sans tirets ni espaces, en supprimant les séparateurs de milliers. Il restait 5 rejets : trois véritables inventions (Ruby, Cypress, Scratch) et deux cas où la source ne les confirmait pas (NVIDIA et XIXe siècle). Sur quatre jours — 20 résumés, et aucun rejet.

Où trouver les outils

lure-check : `python3 lure_check.py owner/repo` — code de retour 1 pour un piège, pratique en CI

ground-check : `python3 ground_check.py --source source.txt --text summary.txt`

Les deux outils sont de simples fichiers Python, n'utilisant que la bibliothèque standard, sous licence MIT, avec des tests sur des cas réels. Le piège a été neutralisé dans les tests, toutes les adresses ont été remplacées.

Dossier

Questions clés sur cet article

Que sait-on sur Un piège à 1774 étoiles ?

Chaque matin, un bot Telegram envoie à l'auteur cinq dépôts GitHub tendance tirés de trendshift.io. Sous chacun, un bouton permet d'obtenir un résumé du README pour une analyse rapide. L'auteur lit ce fil quotidiennement, et met parfois un like aux projets qui lui plaisent. Le 26 septembre, le dépôt « Microsoft Activation Scripts » est apparu dans le fil, avec 1774 étoiles, une description soignée et des tags. Le bot l'avait présenté parmi quatre autres projets — et c'était un piège. Le dépôt ne contient qu'un seul fichier README, et le compte du propriétaire a été créé 94

Pourquoi les filtres évidents n'ont pas fonctionné?

L'auteur a testé la règle sur 321 dépôts envoyés par le bot entre le 15 juillet et le 8 octobre (314 sont toujours actifs). La première idée consistait à signaler les installations de type « télécharge et exécute immédiatement » depuis un site hors GitHub. Mais c'est ainsi que s'installent 38 des 314 projets normaux : codex, opencode, ainsi que les installateurs rustup et uv. Ce filtre aurait masqué un dépôt tendance sur huit, et parmi les plus utiles. La deuxième règle était « compte du propriétaire de moins de 30 jours ». Le piège aurait passé ce test : au moment de l'env

Que sait-on sur Deux filtres qui ont fonctionné ?

Premier filtre (commande d'installation déguisée) Il vérifie la présence d'un déguisement dans le README : Chaîne inversée via `-join"…"[-1..` et `iex(irm(…))` avec une adresse calculée Code en base64 décodé et exécuté immédiatement Exécution cachée via `mshta`, `certutil`, `bitsadmin` ou `-WindowStyle Hidden` Avant la vérification, le texte est nettoyé des caractères invisibles et des apostrophes inversées de PowerShell (comme i\`e\`x). Second filtre (propriétaire jetable et absence de code) Il bloque les dépôts si : Le compte a été créé moins de 30 jours avant le dépôt Le

ZK
Zhemal Khamidun — CPO d'Alpina Digital, product manager d'AlpinaGPT. Conçoit des produits IA depuis 2019. Hamidun News est un projet personnel devenu un agrégateur en production avec plus de 6 000 lecteurs.
✦ Hands-On AI Engineering · Hamidun Academy

Build & Ship Production AI Agents Without Boilerplate Code

Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.

Start 72h Free Trial →Vibe-Coding Intensive
Qu'en pensez-vous ?
Chargement des commentaires…