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.
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.
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 ».
Ce que voient Google, Ads, et le téléphone qui chauffe
Safe Browsing peut classer le domaine alors que vos PHP sont propres. Réexamen seulement après retrait et tests. Blacklist.
Mineur JS : ventilateur, batterie, onglet qui chauffe. Pas de CPU serveur. Cryptominage et serveur vs navigateur.
Si l'hébergeur a suspendu « pour malware » en citant une URL HTML, joignez : script tiers retiré, pas seulement « fichiers CMS OK ». Compte suspendu.
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.