Technique et prévention · 9 min · publié le 11 janvier 2026

Script tiers ou CDN compromis : le piratage sans accès FTP

Un JavaScript chargé depuis un domaine que vous ne contrôlez plus : le CMS peut être propre, le navigateur des clients ne l'est pas. Inventaire des scripts, empreinte SRI si possible, retrait du mort. Pas besoin d'accès FTP pour faire du dégât chez vos visiteurs.

Réponse directe

Un js chargé depuis un domaine que vous ne contrôlez plus. Inventaire des scripts, SRI si possible, retrait du mort. Le CMS est propre, le navigateur des clients ne l'est pas.

cdn js compromis script tiers malware supply chain javascript

Le piratage sans toucher à vos fichiers

Le HTML de votre thème appelle `https://cdn.exemple-tiers.com/widget.js`. Le tiers se fait prendre, ou le nom de domaine expire et quelqu'un le rachete, ou la clé du compte CDN fuit. Vos fichiers PHP n'ont pas bougé. Vos visiteurs exécutent autre chose : skimmer, redirection, mineur, pixel inconnu.

C'est pour ça qu'un scan de fichiers « 0 alerte » et un admin impeccable ne clôturent pas. Il faut lire ce que le navigateur charge. Les tests visiteurs (mobile, privé, clic Google) montrent parfois le symptôme ; l'onglet réseau du navigateur montre le coupable.

On ne détaille pas comment compromettre un CDN. On dit comment s'en apercevoir et couper le tuyau.

Où ces scripts se cachent dans un site « normal »

Pied de page du thème, en-tête, widget « avis », chat, A/B test, heatmaps, polices, lecteurs vidéo, boutons de partage, old jQuery sur un CDN public. Boutique : modules de paiement qui tirent un JS hébergé ailleurs — là, l'urgence change. Vitrine vs boutique.

Google Tag Manager est un tuyau : un tag ajouté sans vous a le même effet qu'un script dans le thème. GTM détourné, pixel Facebook injecté, Hotjar / Clarity.

Un attaquant qui A déjà vos fichiers peut aussi injecter l'appel au tiers. Dans ce cas vous avez deux incidents. Nettoyez le CMS et coupez le script. WordPress.

Inventaire : HTML, GTM, thème, plugins

View-source et réseau : tous les domaines JS / iframe. Listez-les. Ceux que vous ne reconnaissez pas sortent en premier. Search Console inspection : le HTML vu par Google contient-il le même appel ?

WordPress : options (`header` / `footer` scripts), widgets, customizer, plugins « insert headers ». Joomla / Drupal : modules HTML custom. PHP maison : layout twig / blade. Un seul champ texte suffit.

Polices et CSS d'un CDN : moins souvent malveillants, parfois un vecteur si le domaine a tourné. Traitez-les dans la même liste.

  • Domaines tiers chargés sur home, checkout, résa.
  • Conteneurs GTM / pixels.
  • Appels dans le thème enfant et les mu-plugins.

CDN compromis, compte pub, ou simple oubli

Trois familles. 1) Le CDN ou la librairie publique a un incident connu : retirez ou épinglez une copie locale saine. 2) Votre compte (GTM, Cloudflare Workers, outil pub) a été forcé : révoquez, pas seulement « on enlève le tag ». 3) Un script mort (jQuery 1.x sur un domaine abandonné) : le DNS a pu changer de maître. Retirez-le, vous n'en aviez plus besoin.

Cloudflare Workers et Page Rules peuvent injecter du JS sans toucher au FTP. Cloudflare proxy. Relisez le tableau.

Marketplace de thèmes : un thème nulled embarque parfois l'appel. Thèmes hors circuit.

SRI, CSP : ce qui aide, ce qui ne suffit pas

Subresource Integrity : le navigateur refuse le fichier si le hash change. Utile pour une lib épinglée. Inutile si vous n'avez jamais posé de hash, ou si l'attaquant contrôle aussi votre HTML (il retire le SRI).

Content-Security-Policy : liste blanche de domaines. Après incident, une CSP stricte casse parfois le métier (pub, résa). Posez-la à froid, une fois l'inventaire fait, pas le soir en mode panique. Ce n'est pas un nettoyage.

Un WAF ne réécrit pas un script que VOUS avez demandé au navigateur de charger. WAF.

Retirer sans casser le métier (résa, chat, pub)

Restaurant, hôtel, calendrier : un iframe de résa détourné est un incident métier immédiat. Coupez le module, pas nécessairement tout le site. Resto / hôtel, Calendly / iframe.

Pubs Ads : destination compromise ou script tiers = campagnes coupées. Nettoyez la page, puis le recours Ads. Google Ads.

Remplacez par une copie locale d'une version connue, ou par l'embed officiel actuel, pas par un autre CDN inconnu « qui se ressemble ».

Après : moins de tiers, plus de contrôle

Chaque widget est une dépendance. Moins il y en a, moins il y a de renouvellements de domaine à surveiller. Inventaire trimestriel, comme les extensions abandonnées.

Comptes GTM / Cloudflare / pixels : nominatifs, 2FA, revue. Moindre privilège.

Trente jours : le HTML distant peut changer sans que vous touchiez au FTP. Revérifiez le réseau. Garantie 30 jours. Créer un compte si le checkout est en jeu. Un scan de fichiers « 0 alerte » ne clôt pas ce dossier.

Inventaire trimestriel des domaines JS, comme les extensions abandonnées. Chaque widget est une dépendance dont le DNS peut changer de maître. Abandonnés.

Checkout et résa : le tiers qui coûte cher

Un iframe de paiement ou de booking détourné n'a pas besoin de FTP. Coupez le module, testez l'URL finale, prévenez le PSP / le moteur si des saisies ont pu partir. Vitrine vs boutique. Resto. Calendly.

GTM, Workers, options « scripts d'en-tête » : trois endroits où l'appel se cache sans fichier thème. GTM. Cloudflare. SRI / CSP : utiles à froid après inventaire, pas le soir en mode panique. Le WAF ne réécrit pas un script que VOUS avez demandé. WAF.

Hébergeur « malware » sur une URL HTML : joignez « script tiers retiré », pas seulement « CMS OK ». Compte suspendu. Safe Browsing peut classer le domaine alors que les PHP sont propres. Réexamen après retrait et tests. Blacklist.

Questions fréquentes

Mon WordPress est propre. Pourquoi Chrome parle de site trompeur ?

+
Souvent un script ou une redirection que le navigateur exécute, pas un fichier PHP. Inventoriez les domaines chargés, GTM, Workers. Testez comme un visiteur, pas seulement connecté.

Puis-je tout héberger en local ?

+
Pour les librairies stables, oui (version épinglée). Pour un moteur de résa tiers, parfois non. L'inventaire décide. Tout coller en local sans SRI n'est pas une garantie si quelqu'un réécrit votre HTML.

jQuery sur code.jquery.com est-il « sûr » ?

+
C'est un tiers. Une version très ancienne n'est plus le sujet principal ; un domaine que vous ne suivez plus, si. Si vous n'avez pas besoin de ce jQuery, retirez-le.

L'hébergeur peut-il voir un script tiers dans son scan ?

+
Parfois, s'il télécharge le HTML. Parfois non. Votre constat doit le nommer. Demandez les journaux si une URL interne a aussi été citée.

Est-ce une supply chain comme Composer ?

+
Même famille, autre tuyau : le navigateur au lieu de vendor. Dépendances Composer / npm pour le serveur.
À lire ensuite
GTM détourné Cryptominage navigateur Dépendances Composer / npm Cloudflare proxy Compte suspendu Déclarer mon site