Fichiers vides, menaces cachées : la montée furtive des malwares JavaScript à largeur nulle
Un nouvel outil de preuve de concept, InvisibleJS, transforme des fichiers apparemment vides en code exécutable, révélant de béantes failles dans la sécurité de la chaîne d’approvisionnement logicielle.
Imaginez ouvrir un fichier JavaScript pour n’y trouver… rien. Aucun code, aucun commentaire, juste une page blanche. Mais sous cette apparente vacuité, un code malveillant attend de frapper. Ce n’est pas de la science-fiction - c’est la réalité glaçante révélée par un nouvel outil appelé InvisibleJS, qui exploite des caractères Unicode invisibles pour dissimuler du code pleinement fonctionnel à la vue de tous.
En bref
- InvisibleJS encode du JavaScript en caractères Unicode à largeur nulle, rendant les fichiers invisibles pour l’œil humain.
- Le code caché reste exécutable, compatible avec les environnements JavaScript traditionnels et modernes.
- Cette technique de stéganographie peut contourner les revues de code manuelles et les scanners de sécurité automatisés.
- Les fichiers deviennent jusqu’à 24 fois plus volumineux, offrant un indice subtil pour la détection.
- Les experts en sécurité alertent sur un usage potentiel dans des attaques sur la chaîne d’approvisionnement et des injections de code.
La stéganographie derrière le silence
InvisibleJS, développé par l’utilisateur GitHub oscarmine, est bien plus qu’un simple tour de passe-passe - c’est un signal d’alarme pour la communauté de la sécurité. L’outil exploite la stéganographie Unicode, encodant chaque bit du code source JavaScript en caractères à largeur nulle : Zero Width Space (U+200B) pour zéro, Zero Width Non-Joiner (U+200C) pour un. Résultat ? Des fichiers qui semblent totalement vides dans n’importe quel éditeur de texte standard, mais qui prennent vie dans les environnements d’exécution.
L’outil propose deux versions distinctes. La version 1 est conçue pour les systèmes anciens et les modules CommonJS, utilisant la fameuse méthode eval() pour une exécution synchrone. Elle est compatible avec Node.js et prend en charge des variables clés comme require et module.exports. La version 2, quant à elle, est destinée aux modules ES modernes, utilisant les imports dynamiques asynchrones et prenant même en charge await au niveau supérieur. Les deux versions incluent un minuscule « bootstrap loader » qui décode et exécute la charge utile invisible à la volée.
Pour les attaquants, cette technique est un rêve. Du code malveillant peut être introduit dans des dépôts open source, des paquets de la chaîne d’approvisionnement, ou injecté dans des fichiers en apparence inoffensifs - échappant totalement aux regards scrutateurs des relecteurs humains. Les outils de sécurité automatisés, qui recherchent souvent des mots-clés ou des motifs suspects, se laissent tout aussi facilement berner.
La détection n’est pas impossible, mais elle est délicate. Le signe le plus évident est une taille de fichier anormalement grande : puisque chaque bit est encodé en caractère Unicode multioctet, les fichiers gonflent à plus de vingt fois leur taille d’origine. Mais à moins que les équipes de sécurité ne recherchent spécifiquement des anomalies Unicode à largeur nulle, ces fichiers fantômes pourraient passer inaperçus.
Les chercheurs en sécurité insistent sur la double nature d’InvisibleJS : s’il s’agit d’une démonstration fascinante des possibilités de la stéganographie, c’est aussi un avertissement sévère. Les organisations doivent s’adapter - déployer des outils d’analyse de code qui signalent l’utilisation de caractères à largeur nulle, surveiller les tailles de fichiers inhabituelles, et former les développeurs à reconnaître cette nouvelle forme de menace invisible.
Conclusion : le code que vous ne voyez pas
InvisibleJS est à la fois une prouesse technique et un cauchemar pour la sécurité. À mesure que les cybercriminels deviennent toujours plus inventifs, les défenseurs doivent apprendre à regarder au-delà du visible - car parfois, le code le plus dangereux est celui que l’on ne voit pas du tout.
WIKICROOK
- Stéganographie : La stéganographie dissimule des messages ou du code secrets dans des fichiers courants, comme des images ou de l’audio, rendant l’information cachée difficile à détecter.
- Zero : Une vulnérabilité zero-day est une faille de sécurité cachée, inconnue de l’éditeur du logiciel, sans correctif disponible, ce qui la rend très précieuse et dangereuse pour les attaquants.
- CommonJS : CommonJS est un système de modules JavaScript utilisé dans Node.js, permettant aux développeurs de diviser le code en modules réutilisables et maintenables avec require et module.exports.
- ES Module (ESM) : ES Module (ESM) est la norme moderne de JavaScript pour le code modulaire, permettant la syntaxe import/export, le chargement asynchrone et une sécurité améliorée dans tous les environnements.
- Supply : Une attaque sur la chaîne d’approvisionnement cible des fournisseurs ou services tiers pour compromettre plusieurs organisations en exploitant des relations de confiance externes.