Entre le 3 et le 9 mars dernier, un acteur malveillant a compromis au moins 151 dépôts GitHub en dissimulant des charges dans des caractères Unicode rendus invisibles par tous les éditeurs courants, tous les terminaux et tous les outils de contrôle de version. L'attaque s'est étendue à l'écosystème npm et au marché d'extensions VS Code dans le même mouvement. Les défenses visuelles et les outils de linting standard ne détectent pas ce qu'ils ne peuvent pas voir.

La société de sécurité applicative Aikido Security, basée à Gand, a publié le 13 mars dernier l'analyse technique de référence sur cette campagne, conduite par le chercheur Ilyas Makari. Les conclusions d'Endor Labs, spécialiste de la sécurité de la chaîne logicielle, viennent corroborer et compléter le tableau sur le volet npm. L'acteur impliqué, suivi sous le nom Glassworm, est actif depuis mars 2025 et a déjà fait l'objet de signalements successifs : d'abord sur des paquets npm malveillants, puis sur des extensions Open VSX en octobre 2025, avant cette troisième vague qui marque une nette intensification en termes d'échelle et de sophistication.

La technique repose sur une propriété peu connue du standard Unicode : les caractères dits de Zone d'Usage Privé, correspondant aux plages hexadécimales 0xFE00 à 0xFE0F et 0xE0100 à 0xE01EF, s'affichent comme des espaces de largeur nulle dans les environnements de développement. Un attaquant insère ces caractères à l'intérieur d'une chaîne de caractères qui paraît vide dans le code source. À l'exécution JavaScript, un décodeur embarqué extrait les octets invisibles puis exécute un script de second niveau. Dans les incidents documentés antérieurement, ce script utilisait la blockchain Solana comme canal de commande et de contrôle pour exfiltrer des jetons d'accès, des identifiants et des secrets d'infrastructure.

Cent cinquante et un dépôts compromis en six jours

L'ampleur de la vague de mars 2026 distingue cette campagne des précédentes. Une recherche dans le code GitHub portant sur le motif du décodeur identifie au moins 151 dépôts correspondants, un chiffre qui sous-estime le périmètre réel : de nombreux dépôts avaient déjà été supprimés par leurs propriétaires au moment de l'analyse. Parmi les cibles identifiées figurent des projets à visibilité significative dans l'écosystème open source — les dépôts de Wasmer, la plateforme WebAssembly, ceux de Reworm et d'opencode-bench, développés par anomalyco, l'organisation à l'origine d'OpenCode et de SST. La présence de projets activement maintenus n'est pas accidentelle : elle vise un impact maximal sur la chaîne d'approvisionnement logicielle en infectant des dépendances utilisées par de nombreuses applications en aval.

La campagne ne s'est pas limitée à GitHub. Deux paquets npm et une extension VS Code ont été compromis selon le même schéma technique dans la même période, signalant une coordination écosystèmique délibérée. Aikido Security a par ailleurs identifié 72 extensions malveillantes supplémentaires sur Open VSX depuis le 31 janvier 2026, ciblant des outils de développement courants, des formateurs de code aux assistants de codage assistés par IA.

De grands modèles de langage au service de l'attaquant

Ce qui distingue Glassworm des campagnes de supply chain classiques tient à la qualité du camouflage. Les injections malveillantes ne se présentent pas sous la forme de commits suspects ou de modifications aberrantes. Les changements environnants — des incréments de version aux corrections mineures, en passant par les retouches de documentation — sont stylistiquement cohérents avec chaque projet ciblé, au point de passer les contrôles humains les plus attentifs. Ilyas Makari, chercheur chez Aikido Security, est explicite à ce sujet : « Les injections malveillantes n'arrivent pas dans des commits évidemment suspects. Les modifications environnantes sont réalistes, stylistiquement cohérentes avec chaque projet ciblé. »

La personnalisation de 151 contributions distinctes à des bases de code différentes dépasse largement ce qu'un opérateur humain peut produire manuellement. Aikido Security estime que les attaquants utilisent des grands modèles de langage pour générer des commits de couverture convaincants à cette échelle. Ce recours à l'IA comme outil d'ingénierie sociale offensive marque un franchissement notable : il transfère la charge cognitive de la détection entièrement sur des outils automatisés, les revues manuelles devenant structurellement aveugles à ce type de manipulation.

La dépendance à des URL externes, un vecteur de persistance sous-estimé

Endor Labs a mis en évidence un second vecteur de risque, distinct mais lié, dans son analyse des paquets npm impliqués. Au 12 mars 2026, l'opérateur des paquets avait remplacé le payload d'exfiltration par un simple message inoffensif, sans publier de nouvelle version. Cette modification silencieuse illustre une exposition structurelle propre aux écosystèmes de paquets modernes : dès lors qu'un paquet charge du code hébergé hors de son registre d'origine, son comportement peut être altéré à tout moment par une simple modification serveur, sans aucune traçabilité dans l'historique des versions. Pour les équipes de sécurité qui s'appuient sur l'épinglage de version ou la vérification de hachage, cette dépendance externe constitue un angle mort significatif.

Ce que les équipes DevSecOps doivent réviser

La campagne Glassworm invalide plusieurs hypothèses courantes dans les programmes de sécurité de la chaîne logicielle. La revue visuelle du code, même rigoureuse, ne peut pas détecter des caractères Unicode de largeur nulle. Les outils de linting standard n'activent pas systématiquement les règles de détection des caractères Unicode inhabituels, notamment dans les environnements JavaScript. La vérification de hachage d'un paquet ne protège pas contre un payload chargé dynamiquement depuis une URL externe au moment de l'exécution.

Les contre-mesures disponibles se situent à trois niveaux. Au niveau de l'outillage, des règles ESLint peuvent détecter les caractères Unicode suspects dans les fichiers JavaScript ; le compilateur Rust émet des avertissements sur les identifiants confusables. Des outils de scan de maliciels spécialisés — Aikido Safe Chain en est un exemple en source ouverte — peuvent intercepter les paquets malveillants avant leur installation. Au niveau de la gouvernance des dépendances, les organisations doivent aller au-delà de l'épinglage de version pour auditer le contenu effectif des paquets consommés, en intégrant des vérifications d'intégrité sur les ressources chargées à l'exécution. Au niveau de la traçabilité, des outils comme Sigstore permettent une signature cryptographique des artefacts logiciels et l’établissement de leur provenance, sans pour autant inspecter le code lui-même à la recherche de ce type de manipulation.

Glassworm ne constitue pas un incident isolé. La campagne prolonge une tendance connue depuis 2024 : les caractères Unicode invisibles, initialement exploités pour injecter des instructions malveillantes dans des moteurs d'IA via des invites cachées, ont migré vers des attaques de chaîne d'approvisionnement logicielle conventionnelles. La combinaison de l'invisibilité dans les environnements de développement, de la couverture générée par de grands modèles de langage et de la distribution multiécosystème dessine un modèle d'attaque dont la sophistication continuera de progresser. Pour les DSI et les RSSI qui supervisent des pipelines de développement intégrant des dépendances open source, le seul périmètre de contrôle crédible est désormais l'analyse automatisée du contenu des paquets, pas leur apparence.