Une attaque de la chaîne d’approvisionnement Polyfill injecte des logiciels malveillants dans des ressources JavaScript hébergées sur un CDN
26 juin 2024
0 minutes de lecture
Le 25 juin 2024, l’équipe de recherche en sécurité et de lutte contre les logiciels malveillants de Sansec a annoncé qu’un acteur étranger identifié comme une entreprise d’origine chinoise avait pris le contrôle d’un projet populaire de polyfill JavaScript et intégré du code malveillant aux ressources JavaScript récupérées depuis sa source CDN, à l’adresse suivante : cdn.polyfill.io. Selon Sansec, plus de 100 000 sites Web ont été touchés par cette attaque visant le polyfill, notamment des sociétés cotées en bourse comme Intuit.
Questions fréquentes
Snyk est-il touché par l’attaque de la chaîne d’approvisionnement liée à Polyfill ?
Non, la plateforme Snyk, y compris nos outils, n’est pas affectée par l’attaque actuelle de la chaîne d’approvisionnement liée à Polyfill.
Snyk peut-il détecter la vulnérabilité Polyfill ?
Snyk Code, notre moteur SAST en temps réel basé sur le machine learning, peut détecter différentes utilisations d’URL dans le code fonctionnel, notamment en JavaScript, en PHP et dans de nombreux autres langages.
Voici un exemple de règle personnalisée Snyk Code que vous pouvez ajouter :
Une telle règle détectera toute utilisation d’une URL cdn.polyfill.io dans du code JavaScript ou PHP. Par exemple, elle détectera l’inclusion manuelle du script dans cet extrait de code :
Remarque : la règle personnalisée ne détectera que le code JavaScript ou PHP, et non les balises <script src=“…”></script> seules dans du HTML.
Dois-je ajouter une règle de liste de blocage uniquement pour le site cdn.polyfill.io ?
De nombreux rapports indiquent que l’acteur malveillant a ajouté de nouveaux domaines, notamment : polyfill[.]site, polyfill[.]com, bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, unionadjs[.]com, xhsbpza[.]com, union.macoms[.]la et newcrbpc[.]com. Nous vous recommandons vivement de suivre ces rapports de près et de mettre à jour votre règle personnalisée Snyk Code en conséquence.
Que s’est-il passé avec la bibliothèque polyfill malveillante ?
En février 2024, une entreprise chinoise a annoncé qu’elle allait acquérir le site polyfill.io auprès de Jake Champion, créateur de la bibliothèque polyfill Node.js, et du propriétaire du site. Funnull, l’entreprise chinoise qui fournissait des services de CDN et d’hébergement, est intervenue et est depuis propriétaire du domaine, de l’organisation GitHub et du dépôt.

Peu après l’annonce de cette acquisition, le domaine polyfill.io a été associé à un nouvel enregistrement CNAME : polyfill.io.bsclink.cn.
Des signes avant-coureurs de cette catastrophe imminente circulaient dans les communautés de développeurs, notamment dans le commentaire GitHub suivant de Renaud Chaput :
Polyfill.io appartenait à l’équipe web du Financial Times, puis a été géré par la communauté. Le dernier responsable de la maintenance a vendu le projet à une obscure société chinoise spécialisée dans les CDN. Celle-ci l’a transféré de Fastly (la plateforme CDN et de calcul en périphérie qui exécutait le code open source du service) et a commencé à modifier les fichiers renvoyés.
Renaud Chaput
D’autres signes d’activités suspectes ont également été relevés en avril et en juin par des membres de la communauté, qui ont tiré la sonnette d’alarme au sujet du transfert de propriété à une entreprise tierce. Leurs soupçons se sont encore renforcés lorsque leurs commentaires ont été supprimés dans un ticket GitHub :

À la suite de ces événements, Andrew Betts, collègue de Jake Champion chez Fastly, était l’auteur initial du service Web polyfill. Ce projet permettait d’injecter automatiquement des bibliothèques polyfill JavaScript dans les sites Web en fonction de l’agent utilisateur ou d’autres propriétés. Les déclarations d’Andrew remontent à février, lorsqu’il a indiqué ne pas être associé au site officiel cdn.polyfill.io.
À notre connaissance, aucune bibliothèque polyfill spécifique sur npm ne fait partie de cette campagne particulière menée par un acteur malveillant pour injecter du code malveillant. Cela dit, des bibliothèques de différents écosystèmes logiciels, comme les systèmes de gestion de contenu tels que le projet Magento, peuvent contenir du code qui importe statiquement des scripts JavaScript provenant de cdn.polyfill.io. Nous avons notamment détecté CVE-2024-38526, un avis de sécurité concernant la bibliothèque pdoc du registre PyPI, qui fournit de la documentation d’API pour les projets Python. Lorsque la documentation est générée avec la commande pdoc --math, elle peut contenir des liens vers des fichiers JavaScript provenant de polyfill.io. Ce comportement de la bibliothèque pdoc a été corrigé dans la version 14.5.1 de pdoc. Nous recommandons aux utilisateurs de procéder à la mise à niveau dès que possible.
Quelle est la situation actuelle du site polyfill.io ?
Le site polyfill.io est désormais effectivement hors ligne. Pour mieux protéger les utilisateurs finaux, des extensions de navigateur de blocage des publicités, comme uBlock, ont pris en compte les signalements concernant le site polyfill.io et en bloquent désormais activement l’accès afin de protéger les utilisateurs.

Le 21 juin, Google aurait commencé à afficher un message d’erreur « site Web compromis » sur le site de l’application Google Ads. La situation s’est aggravée à la suite de signalements de tentatives d’usurpation de sites Web utilisant le domaine googie-anaiytics[.]com.
Quel est l’impact du logiciel malveillant polyfill.io ?
En 2017, Andrew Betts, l’auteur initial du site polyfill.io hébergé chez Fastly, signalait que 91 millions de navigateurs envoyaient chaque jour des requêtes pour importer la bibliothèque, et que jusqu’à 700 millions de requêtes étaient effectuées chaque mois pour mettre à niveau les anciens navigateurs afin qu’ils prennent en charge les normes Web modernes.

Des publications sur les réseaux sociaux et d’autres sources ont signalé que le site de l’entreprise Hulu intégrait la bibliothèque JavaScript du site cdn.polyfill.io, qui s’est révélée malveillante (signalé par Theo).

Dans un autre rapport de Germán Fernández, le site de la communauté Atlassian a également été identifié comme important la bibliothèque polyfill JavaScript depuis le domaine malveillant polyfill.io.

Silent Push Labs a également repéré des sites Web gouvernementaux qui intégraient la source malveillante polyfill.io et les a signalés à CISA.
Qu’est-ce qu’un polyfill JavaScript ?
Un polyfill JavaScript est généralement un élément de code conçu pour fournir des fonctionnalités modernes aux anciens navigateurs qui ne les prennent pas en charge nativement. Historiquement, les polyfills étaient essentiels aux développeurs Web qui souhaitaient créer des applications fonctionnant parfaitement avec différentes versions de navigateurs. Ils font le lien entre les générations de navigateurs et permettent aux anciens navigateurs d’exécuter les nouvelles fonctionnalités JavaScript, garantissant ainsi une expérience utilisateur cohérente, quel que soit l’âge ou les capacités du navigateur.
Aux débuts du développement Web, les navigateurs évoluaient à des rythmes différents, créant un environnement fragmenté dans lequel le même code ne s’exécutait pas nécessairement de la même manière sur toutes les plateformes. De manière générale, la prise en charge des API des navigateurs variait. Comme les développeurs ne pouvaient pas contrôler les versions de navigateur utilisées par les utilisateurs finaux, ils ne pouvaient pas garantir la disponibilité d’une même API au moment de l’exécution du code JavaScript. Les polyfills ont donc émergé pour résoudre ce problème : grâce aux bibliothèques polyfill, les développeurs pouvaient écrire du code JavaScript moderne sans se soucier des problèmes de compatibilité. Par exemple, les méthodes Array.prototype.includes et Promise n’étaient pas prises en charge par les anciens navigateurs comme Internet Explorer. Les développeurs pouvaient néanmoins rendre ces fonctionnalités accessibles en chargeant une bibliothèque polyfill dans le navigateur.
Le rôle des CDN JavaScript dans les bibliothèques polyfill
Un réseau de diffusion de contenu (CDN) est un système de serveurs déployés et répartis dans le monde entier, qui distribue du contenu Web aux utilisateurs en fonction de leur emplacement géographique. Pour les bibliothèques polyfill JavaScript, les CDN jouent un rôle essentiel en hébergeant ces bibliothèques et en les distribuant efficacement partout dans le monde. En utilisant des CDN, les développeurs s’assurent que leurs polyfills sont transmis rapidement et de manière fiable aux utilisateurs, ce qui réduit la latence et améliore les temps de chargement. Le recours à un CDN permettait également aux développeurs d’éviter d’intégrer les bibliothèques JavaScript à leur projet.
Un cas d’usage courant des CDN que vous rencontrerez probablement concerne les services cloud de mesure et de suivi des performances des applications, comme Google Analytics, qui recommande officiellement d’ajouter le code suivant à votre site Web :
Lors de la prise de contrôle malveillante du service polyfill, cdn.polyfill.io était un CDN très utilisé qui distribuait dynamiquement des polyfills en fonction des en-têtes HTTP des requêtes entrantes. Le polyfill approprié était ainsi fourni en fonction du navigateur et de sa version, afin d’assurer une compatibilité optimale.
Risques de sécurité liés aux polyfills hébergés sur un CDN
L’utilisation de polyfills hébergés sur un CDN présente des risques de sécurité importants, principalement en raison du risque d’exécution de code JavaScript arbitraire dans le contexte de l’application. Ce risque est souvent signalé comme une vulnérabilité de script intersite (XSS) dans une application Web.
Lorsqu’une bibliothèque polyfill est récupérée depuis un CDN, l’application dépend de l’intégrité et de la sécurité du serveur externe, autrement dit de la source CDN elle-même. Si le CDN ou la bibliothèque hébergée est compromis, comme lors de la récente attaque contre cdn.polyfill.io, le nouveau code compromis peut être injecté et exécuté dans le navigateur de l’utilisateur. Ce code malveillant peut mener diverses activités néfastes, par exemple rediriger les utilisateurs vers des sites d’hameçonnage, voler des informations sensibles, voire propager d’autres logiciels malveillants. En matière de sécurité des navigateurs, ce type de vulnérabilité XSS est la conséquence la plus grave.
Se protéger contre les attaques de la chaîne logistique via les CDN
La récente attaque contre le projet de polyfill JavaScript souligne l’importance cruciale des ressources qui soutiennent l’écosystème Web, dont les CDN sont un élément majeur. Les préoccupations liées à la sécurité de la chaîne logistique portent souvent sur les registres de paquets open source, comme PyPI et npm. Or, l’attaque visant le polyfill JavaScript nous a rappelé que les CDN sont eux aussi un composant fondamental du Web.
Voici quelques bonnes pratiques à envisager pour vous protéger contre ce type d’attaque :
Utilisez des CDN fiables : choisissez uniquement des CDN de fournisseurs réputés. Cloudflare, par exemple, est reconnu pour la robustesse de ses mesures de sécurité et sa fiabilité.
Remplacez le clone du polyfill : Cloudflare a créé un clone du polyfill à l’adresse https://cdnjs.cloudflare.com/polyfill, qu’il recommande d’utiliser en remplacement direct.
Surveillez les dépendances : auditez et surveillez régulièrement tous les scripts et toutes les dépendances tiers.
Intégrité des sous-ressources : des outils comme l’intégrité des sous-ressources (SRI) peuvent vous aider à vérifier que le contenu distribué par un CDN n’a pas été altéré et à le verrouiller sur une version ou un hachage attendu, qui a été audité et dont l’absence de comportement malveillant ou indésirable est connue.
Politique de sécurité du contenu (CSP) : mettez en place une CSP stricte pour limiter les sources depuis lesquelles les scripts peuvent être chargés. Cela peut empêcher l’exécution de scripts malveillants. Comme les polyfills sont souvent intégrés au chemin critique de chargement de l’application, ils disposent des mêmes permissions que n’importe quel autre code JavaScript de la page, ce qui en fait des cibles de choix pour les attaquants cherchant à exploiter cette confiance. Ce risque souligne l’importance de choisir des CDN fiables et sécurisés, de mettre en œuvre des mesures de sécurité robustes comme une politique de sécurité du contenu (CSP) et d’auditer régulièrement les dépendances tierces afin de se prémunir contre ce type de vulnérabilité.
Mises à jour régulières : maintenez à jour toutes les bibliothèques et dépendances. De nombreuses attaques exploitent des vulnérabilités connues, corrigées dans des versions ultérieures.
Solutions de remplacement : évaluez si les polyfills sont toujours nécessaires pour votre projet. À mesure que les navigateurs évoluent, de nombreuses fonctionnalités fournies par les polyfills sont désormais prises en charge nativement. Envisagez sérieusement d’intégrer vos dépendances directement à votre projet, avec vos propres ressources, plutôt que de dépendre de fournisseurs tiers comme les CDN.
