Skip to main content
Blog
Blog

Vulnérabilités de sécurité JavaScript : comment les scripts obfusqués contournent la CSP et comment les stopper

Pourquoi la CSP ne peut pas arrêter les attaques JavaScript obscurcies et ce que la surveillance comportementale au niveau du navigateur apporte que les listes d'autorisation ne peuvent pas.

Jul 12, 2026 8 min read
Vulnérabilités de sécurité JavaScript : comment les scripts obfusqués contournent la CSP et comment les stopper
Table des matières

En bref : JavaScript obfusqué et évasion CSP

  • Passe par déclaration : Le JavaScript obfusqué passe CSP en ne déclarant que ce que CSP autorise. Le comportement malveillant commence après le chargement du script.
  • Domaines, pas intégrité : CSP autorise des domaines, pas l'intégrité du code. Un domaine de confiance compromis passe quand même. Polyfill.io a passé CSP sur 490 000 sites.
  • La conformité exige plus : 6.4.3 et 11.6.1 exigent une détection au-delà de CSP : inventaire de scripts, vérification d'intégrité, détection d'altération.

Peu de temps ? Découvrez le blocage Magecart et skimmer dans le navigateur de cside. Elle couvre tout ce qui suit en un seul déploiement.

Why CSP alone does not stop obfuscated JavaScript

Trois voies par lesquelles le code obscurci contourne la CSP

La CSP contrôle les sources, pas les charges utiles. Trois patterns d'attaque exploitent cette lacune:

Compromission d'un CDN de confiance ou d'un hôte tiers. Le script se charge depuis un domaine déjà présent dans la liste d'autorisation. Une charge modifiée ne déclenche pas la CSP car l'URL source est inchangée. Polyfill[.]io, les attaques de skimming web Magecart et les récentes compromissions de CDN d'analytique suivent cette voie.

Injection dans des fichiers propriétaires. Un attaquant ayant accès au serveur injecte du code obscurci dans un fichier JavaScript propriétaire existant. Ce fichier se charge depuis le domaine du site, qui est toujours autorisé.

Construction dynamique de code à l'exécution. Un script approuvé se charge et assemble une fonction malveillante à partir de fragments de chaînes à l'exécution, en utilisant eval(), Function() ou des équivalents indirects. La charge dangereuse n'existe jamais dans aucune ressource chargée; elle est construite dans le navigateur après un chargement de page propre.

Aucune de ces routes ne viole une liste d'autorisation de sources. La CSP rapporte tout propre pendant que les malwares obscurcis s'exécutent.

Comment les scripts obscurcis échappent aussi aux scanners automatisés

L'obscurcissement supprime les signaux lisibles que les réviseurs humains et les scanners automatisés recherchent:

Common obfuscation techniques and how cside sees through them

TechniqueCe qu'elle faitPourquoi les scanners la manquent
Division et concaténation de chaînesFragmente les URLs et mots-clés en morceaux assemblés à l'exécutionAucune chaîne complète n'apparaît dans la source statique
Encodage Base64 avec décodage dynamiqueStocke la charge comme un blob décodé uniquement à l'exécutionRessemble à des données, pas à du code exécutable, pour un analyseur statique
Séquences d'échappement hexadécimales ou UnicodeEncode les caractères comme \x61 ou ALes outils statiques doivent exécuter le code pour résoudre la valeur réelle
Noms de variables aléatoiresRemplace les identifiants lisibles par des noms courts aléatoiresSupprime le signal de mots-clés sur lequel s'appuient les détecteurs de patterns
Chargement dynamique tardifRécupère la charge réelle depuis un serveur C2 après l'exécution d'un script approuvéLa ressource chargée diffère à chaque analyse

Les hashes de Subresource Integrity (SRI) protègent contre les substitutions silencieuses de charges depuis des sources connues, mais seulement si un hash peut être fixé pour chaque fichier. Les scripts tiers qui se mettent à jour fréquemment rendent le SRI impraticable en production, ce qui constitue le défi central de la gestion de l'intégrité des scripts pour les scripts dynamiques. Le SRI ne peut pas non plus protéger contre les charges récupérées dynamiquement depuis un endpoint C2, car cette charge n'existait pas lors du calcul d'un quelconque hash.

Pourquoi les scanners statiques ne voient pas un CDN détourné

Les outils d'analyse statique et d'analyse de composition logicielle examinent le code avant son exécution. Ils repèrent les paquets porteurs de CVE publiées, les motifs dangereux comme les affectations à innerHTML depuis une entrée utilisateur, et les dépendances obsolètes. Ce qu'ils ne peuvent pas faire, c'est observer ce qu'un CDN livre réellement au navigateur d'un visiteur.

L'incident polyfill[.]io en est l'exemple le plus net. Lorsque Funnull a acquis le domaine en février 2024, le code source de chaque site intégrant le script est resté inchangé. Le CDN a commencé à injecter du JavaScript malveillant dans les réponses qu'il servait, mais uniquement pour les utilisateurs mobiles, uniquement avec un référent falsifié, et uniquement lorsque le visiteur n'avait pas un motif de cookies associé à Google Analytics et aux outils de développement.

Un scanner statique aurait vu <script src="https://cdn.polyfill[.]io/v3/polyfill.min.js"> dans le HTML et n'aurait trouvé aucune CVE. Il n'y avait pas non plus de hash stable à épingler : le point de terminaison générait une réponse par requête, précisément le cas où la SRI ne s'applique pas. L'attaque était invisible pour tout outil analysant le code au repos. Quand les chercheurs ont identifié le payload en juin 2024, environ 490 000 sites web le servaient déjà à de vrais utilisateurs.

La livraison conditionnelle est ce qui rend cette classe difficile à détecter depuis l'extérieur de la session. Les attaquants conditionnent les payloads au user agent, au référent, à la géographie et à l'heure de la journée précisément pour échapper à la surveillance synthétique et aux profils de navigateur des chercheurs. Un payload qui ne se déclenche que pour des utilisateurs mobiles d'un pays un après-midi donné n'apparaît jamais dans une analyse statique et ne se reproduit pas dans un crawler.

Approches pour la protection contre le JavaScript obscurci

ApprocheContrôle des sourcesInspection de la chargeGère la compromission d'un hôte de confianceDétecte l'injection dynamique à l'exécution
CSPOuiNonNonNon
Subresource Integrity (SRI)PartielHash uniquementPartielNon
WAF ou filtrage couche réseauPartielNonNonNon
Analyse statique JavaScriptNonPartielPartielNon
Surveillance comportementale couche navigateurOptionnelle par politiqueOuiOuiOui

La surveillance au niveau de la couche navigateur est le seul contrôle de ce tableau qui résiste aux trois voies d'évasion décrites. Elle fonctionne aux côtés de la CSP et couvre la lacune de visibilité des charges utiles que la CSP laisse ouverte.

Ce qu'exiger d'un outil résistant à l'évasion CSP

Quatre questions avant d'établir une liste de fournisseurs:

Observation de la charge utile à l'exécution. L'outil analyse-t-il ce que les scripts exécutent dans le navigateur, pas seulement les URLs depuis lesquelles ils se chargent? Demandez au fournisseur de démontrer la détection d'un script qui se charge depuis un domaine de confiance et appelle un endpoint d'exfiltration non autorisé. Si la démonstration nécessite une URL source malveillante pour se déclencher, l'outil dépend de la source.

Détection de patterns de code obscurci. Posez des questions spécifiques sur la division de chaînes, les équivalents d'eval() et le décodage dynamique Base64. Les outils qui ne signalent que eval() littéralement manqueront la plupart des obscurcissements réels.

Surveillance comportementale post-chargement. Beaucoup d'attaques récupèrent leur vraie charge depuis un serveur C2 après le chargement initial de la page. L'outil doit continuer à surveiller au-delà de DOMContentLoaded, pas seulement lors du parsing initial.

Explicabilité des alertes. Une alerte qui dit seulement "script suspect détecté" n'est pas exploitable. Chaque constat doit identifier le script, le comportement qui a déclenché la détection et l'appel réseau tenté, pour qu'un analyste puisse trier sans deviner.

Comment cside s'inscrit dans ce tableau

cside instrumente le navigateur via un script qui s'exécute dans chaque session de visiteur. Il observe ce que chaque script tiers et propriétaire fait à l'exécution: appels réseau effectués, modifications DOM appliquées, champs de données sensibles accédés et patterns d'exécution obscurcis détectés.

Lorsqu'un CDN compromis sert une charge obscurcie à une page instrumentée par cside, la détection s'active sur ce que la charge fait à l'exécution (appel réseau non autorisé, chaîne eval obscurcie, pattern d'exfiltration de données) plutôt que sur son origine. Un échec de liste d'autorisation de sources ne peut pas produire un faux négatif dans un système basé sur le comportement.

Les exigences 6.4.3 et 11.6.1 de PCI DSS v4.0.1 (obligatoires depuis mars 2025) imposent aux marchands d'autoriser tous les scripts sur les pages de paiement et de détecter les modifications non autorisées du contenu des scripts ou des en-têtes HTTP. La surveillance comportementale au niveau de la couche navigateur fournit les preuves au niveau de l'exécution que ces contrôles attendent d'une couche de surveillance qui atteint l'intérieur du navigateur plutôt que de s'arrêter au périmètre réseau.

Pour en savoir plus sur les limites pratiques de la CSP, consultez pourquoi la CSP ne fonctionne pas. Pour une analyse technique des méthodes d'obscurcissement utilisées dans les attaques réelles, consultez le guide de désofuscation du JavaScript tiers.

An obfuscated payload flagged by behaviour

Lectures associées

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

La protection résistante à l'évasion CSP désigne des contrôles de sécurité qui détectent et bloquent le JavaScript malveillant même lorsque les attaquants utilisent l'obscurcissement, le chargement dynamique depuis un hôte de confiance ou une injection tardive pour contourner une Content Security Policy. La CSP impose des listes d'autorisation de sources; les contrôles résistants à l'évasion inspectent ce que les scripts exécutent réellement dans le navigateur.

La CSP approuve ou bloque les scripts selon leur origine, pas selon ce qu'ils font. Les attaquants la contournent par trois voies: compromettre un CDN de confiance pour qu'il délivre des malwares obscurcis depuis la source autorisée, injecter des charges obscurcies dans des fichiers propriétaires que le serveur fait déjà confiance, et assembler des fonctions dangereuses à partir de fragments de chaînes à l'exécution via des équivalents d'eval(). Aucune de ces routes ne viole une liste d'autorisation de sources.

La propriété clé est l'inspection de la charge utile à l'exécution. Un outil résistant à l'évasion CSP observe ce que les scripts exécutent dans la session du navigateur, pas seulement les domaines depuis lesquels ils se chargent. Il doit signaler les patterns de code obscurci, les appels réseau non autorisés et les changements de comportement en cours de session sans dépendre d'une liste d'autorisation de sources.

Les attaques de chaîne d'approvisionnement via des CDN de confiance constituent le principal pattern. En juin 2024, la compromission de Polyfill[.]io a livré des malwares obscurcis à plus de 490 000 sites web. Chaque site affecté avait cdn.polyfill[.]io dans sa liste CSP autorisée et aucune violation de politique ne s'est déclenchée. Les skimmers de paiement de type Magecart suivent la même route: un hôte de confiance compromis sert un code d'exfiltration obscurci qu'une CSP approuvée autorise.

cside instrumente le navigateur pour observer ce que chaque script fait à l'exécution, pas seulement son origine. Il détecte l'exécution de code obscurci, les appels de données non autorisés et les patterns d'injection dynamique qui apparaissent après le chargement de la page. La détection opérant au niveau de la couche d'exécution plutôt qu'au niveau de la couche source, un CDN de confiance compromis ne produit pas de faux négatif.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

Interface du tableau de bord cside affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau