Aller au contenu

Phase 3 — Atténuation

La phase 3 crée une preuve avant/après de l’atténuation CSD. Vous réexécutez l’attaque sans atténuation pour établir une référence, appliquez les atténuations, puis réexécutez la même attaque pour prouver que CSD bloque les appels réseau. La phase 2 doit être terminée — toutes les vérifications DET doivent être RÉUSSIES — avant de continuer.

Étape 1 : Confirmer l’absence d’atténuations actives (référence)

Section intitulée « Étape 1 : Confirmer l’absence d’atténuations actives (référence) »

Avant de capturer le cliché « avant », vérifiez que l’environnement est propre — aucune atténuation ne doit être active. Cela garantit que l’attaque de référence s’exécute sans aucun blocage CSD.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

Si le nombre n’est pas 0, des atténuations subsistent d’une exécution précédente. Supprimez chacune avant de continuer :

Fenêtre de terminal
# Delete a mitigated domain (repeat for each domain name)
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/<domain-name>" \
| jq .

Remplacez <domain-name> par le metadata.name utilisé lors de l’atténuation du domaine (par exemple, cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io, httpbin.org, jsonplaceholder.typicode.com). Si le nettoyage de httpbin.org laisse un élément résiduel, essayez également de supprimer www.httpbin.org — certaines exécutions précédentes ont pu utiliser ce nom comme nom de métadonnées.

Confirmer la présence des détections de la phase 2

Section intitulée « Confirmer la présence des détections de la phase 2 »
Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'
VérificationAttenduStatut
Nombre de domaines atténués0 (référence propre)RÉUSSI si 0, nettoyage requis si > 0
Nombre de domaines détectés> 0 (détections de la phase 2 présentes)RÉUSSI si > 0
Domaines d’exfiltration présentswww.httpbin.org, jsonplaceholder.typicode.comRÉUSSI si au moins un apparaît

Étape 2 : Exécuter l’attaque — avant l’atténuation

Section intitulée « Étape 2 : Exécuter l’attaque — avant l’atténuation »

Réexécutez la simulation combinée sans aucune atténuation active pour capturer une nouvelle référence. C’est le cliché « avant » — la preuve que les attaques réussissent lorsque l’atténuation CSD n’est pas appliquée.

Les assistants IA dotés d’outils d’automatisation de navigateur exécutent la simulation d’attaque de manière programmatique en utilisant le même initScript de la phase 2 (qui sauvegarde le fetch natif) :

  1. Naviguer avec initScript — naviguez d’abord vers about:blank pour garantir un contexte de document propre (évite les initScripts périmés des navigations précédentes), puis utilisez navigate_page vers http://$F5XC_DOMAINNAME/#/login avec l’initScript de la phase 2 (code verbatim dans Phase 2 — Exécution automatisée par IA). Cet initScript sauvegarde les références natives de setInterval, clearInterval, fetch et console.log — la référence fetch native est correcte ici car aucune atténuation n’est active
  2. Fermer la bannière de bienvenue — utilisez press_key avec Escape pour fermer la bannière de bienvenue. Lors des visites ultérieures, la bannière peut ne pas apparaître (cookies persistants). La boîte de dialogue de consentement aux cookies est fermée automatiquement par la touche Échap
  3. Attendre la fin — attendez 10 secondes pour que tous les rappels de chargement/erreur des scripts CDN et les résolutions de promesses fetch se terminent
  4. Capturer les preuves — utilisez list_console_messages pour vérifier [CSD Demo] Simulation complete et les résultats de chargement CDN ; utilisez list_network_requests filtré sur les types script et fetch pour vérifier les codes d’état HTTP (200/201 pour le succès)

Les opérateurs sans outils d’automatisation de navigateur exécutent la simulation manuellement en suivant la même procédure que Phase 2 — Étape 8 : Simulation d’attaque :

  1. Naviguez vers http://xF5XC_DOMAINNAMEx/#/login
  2. Saisissez des identifiants fictifs dans les champs Email et Mot de passe (ne soumettez pas)
  3. Ouvrez les DevTools — appuyez sur F12 et passez à l’onglet Console
  4. Collez et exécutez le script de détection combiné depuis Déclenchement de la détection
  5. Observez la sortie de la console — tous les scripts CDN devraient se charger et les appels d’exfiltration devraient réussir avec des réponses 200/201
VérificationAttendu (avant atténuation)Statut
Scripts CDN injectésLes 4 balises script se chargent — des messages [Supply Chain] Loaded from apparaissent, l’onglet réseau affiche 200RÉUSSI
Exfiltration fetch vers www.httpbin.orgL’onglet réseau affiche 200 — données envoyéesRÉUSSI
Exfiltration fetch vers jsonplaceholder.typicode.comL’onglet réseau affiche 201 — données envoyéesRÉUSSI
Sortie console[CSD Demo] Simulation completeRÉUSSI

Pour chaque domaine détecté, effectuez un POST vers le point de terminaison des domaines atténués. Les cibles principales de la simulation de la phase 2 sont les 4 domaines d’injection CDN et tout domaine d’exfiltration de données détecté.

Cibles d’atténuation principales (issues du script de simulation combiné) :

DomaineRôle
cdn.jsdelivr.netInjection de script CDN
esm.shInjection de script CDN
unpkg.comInjection de script CDN
ga.jspm.ioInjection de script CDN
www.httpbin.orgPoint de terminaison d’exfiltration de données
jsonplaceholder.typicode.comPoint de terminaison d’exfiltration de données

Atténuer un domaine (exécuter une fois par domaine) :

Fenêtre de terminal
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "cdn.jsdelivr.net",
"namespace": "xF5XC_NAMESPACEx"
},
"spec": {
"mitigated_domain": "cdn.jsdelivr.net"
}
}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .

Répétez pour chaque domaine :

esm.sh
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"esm.sh","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"esm.sh"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# unpkg.com
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"unpkg.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"unpkg.com"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# ga.jspm.io
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"ga.jspm.io","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"ga.jspm.io"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# httpbin.org — use www.httpbin.org as mitigated_domain (see note below)
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"httpbin.org","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"www.httpbin.org"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# jsonplaceholder.typicode.com
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"jsonplaceholder.typicode.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"jsonplaceholder.typicode.com"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .

Une réponse 200 retourne l’objet de domaine atténué créé. Une réponse 409 signifie que le domaine est déjà dans la liste des domaines atténués — il s’agit d’une condition de succès.

Étape 4 : Vérifier l’application des atténuations

Section intitulée « Étape 4 : Vérifier l’application des atténuations »

Listez tous les domaines atténués et confirmez que le nombre correspond au nombre de domaines soumis :

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'
VérificationAttenduStatut
Nombre de domaines atténués6 (correspond au nombre de POST)RÉUSSI si le nombre correspond
Tous les POST de l’étape 3 ont retourné 200 ou 409Chaque domaine acceptéRÉUSSI

Si le nombre est inférieur à celui attendu, réexécutez la commande POST pour le domaine manquant depuis l’étape 3.

Étape 5 : Exécuter l’attaque — après l’atténuation

Section intitulée « Étape 5 : Exécuter l’attaque — après l’atténuation »

Réexécutez la simulation combinée exactement identique pour capturer le cliché « après ». Le script de simulation est identique — seul l’état d’atténuation de CSD a changé. Les chargements de scripts depuis les domaines atténués sont maintenant bloqués par le JavaScript CSD (le src de la balise &lt;script&gt; est effacé en une chaîne vide).

Les assistants IA dotés d’outils d’automatisation de navigateur réexécutent la simulation d’attaque de manière programmatique en utilisant le même initScript de la phase 2 (code verbatim dans Phase 2 — Exécution automatisée par IA). L’initScript sauvegarde le fetch natif pour éviter les erreurs zone.js — cela n’affecte pas l’atténuation CSD car CSD n’intercepte pas les appels fetch().

  1. Naviguer avec initScript — utilisez new_page avec isolatedContext pour un contexte de navigateur propre (évite les initScripts périmés de l’étape 2), puis naviguez vers about:blank, puis vers la page de connexion avec l’initScript de la phase 2
  2. Fermer la bannière de bienvenue — utilisez press_key avec Escape
  3. Attendre la fin — attendez 10 secondes pour tous les rappels asynchrones
  4. Capturer les preuves — utilisez list_console_messages pour vérifier [CSD Demo] Simulation complete ; utilisez list_network_requests filtré sur les types script et fetch pour observer que les chargements de scripts CDN sont absents (CSD a effacé le src du script) tandis que les appels fetch vers les domaines d’exfiltration se terminent toujours normalement

Les opérateurs sans outils d’automatisation de navigateur réexécutent la simulation manuellement en suivant la même procédure que Phase 2 — Étape 8 : Simulation d’attaque :

  1. Naviguez vers http://xF5XC_DOMAINNAMEx/#/login
  2. Saisissez des identifiants fictifs dans les champs Email et Mot de passe (ne soumettez pas)
  3. Ouvrez les DevTools — appuyez sur F12 et passez à l’onglet Console
  4. Collez et exécutez le script de détection combiné depuis Déclenchement de la détection
  5. Observez la sortie de la console et du réseau — les rappels onload et onerror des scripts CDN ne se déclenchent pas pour les domaines atténués (CSD a effacé le src du script en une chaîne vide, empêchant totalement la requête réseau). Les appels fetch vers les domaines d’exfiltration (www.httpbin.org, jsonplaceholder.typicode.com) se terminent toujours avec 200/201 — l’atténuation CSD bloque le chargement des scripts, pas les appels fetch/XHR
VérificationAttendu (après atténuation)Statut
Chargements de scripts CDNBloqués — les scripts n’apparaissent pas dans l’onglet réseau (CSD a effacé src en chaîne vide)RÉUSSI
Rappels des scripts CDNNi onload ni onerror ne se déclenche pour les domaines atténuésRÉUSSI
Exfiltration fetch vers www.httpbin.org200 — fetch se termine toujours (CSD n’intercepte pas fetch)INFO
Exfiltration fetch vers jsonplaceholder.typicode.com201 — fetch se termine toujours (CSD n’intercepte pas fetch)INFO
Sortie console[CSD Demo] Simulation completeRÉUSSI

C’est le point culminant de la démonstration — des preuves côte à côte démontrant que la même attaque, sur la même page, avec le même script, produit désormais un résultat complètement différent.

SignalAvant atténuation (étape 2)Après atténuation (étape 5)
Chargements de scripts CDN200 — les 4 scripts CDN se chargent normalementBloqués — scripts absents de l’onglet réseau (CSD a effacé src en chaîne vide)
Rappels onload CDNDes messages [Supply Chain] Loaded from apparaissentAucun rappel ne se déclenche (aucune requête réseau n’a été effectuée)
Exfiltration vers www.httpbin.org200 — données exfiltrées200 — fetch se termine toujours (CSD n’intercepte pas fetch)
Exfiltration vers jsonplaceholder.typicode.com201 — données exfiltrées201 — fetch se termine toujours (CSD n’intercepte pas fetch)
API des domaines atténués CSD0 atténué6 atténués

Vérifier l’atténuation dans les données backend

Section intitulée « Vérifier l’atténuation dans les données backend »

Interrogez /detected_domains toutes les 60 secondes pendant 10 itérations maximum (10 minutes). Passez au tableau de comparaison une fois la requête retournée, ou après les 10 minutes maximum — ces vérifications sont informatives et ne conditionnent pas la phase 4.

Vérifier les domaines détectés après atténuation :

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'

Vérifier le statut atténué des scripts :

Fenêtre de terminal
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'
VérificationAttenduStatut
Référence propre (étape 1)0 domaine atténué au départRÉUSSI / ÉCHOUÉ
Avant — l’attaque réussit (étape 2)Les scripts se chargent, l’exfiltration retourne 200/201RÉUSSI / ÉCHOUÉ
Atténuations appliquées (étape 3)Les 6 domaines acceptés via POST (200 ou 409)RÉUSSI / ÉCHOUÉ
Nombre atténué confirmé (étape 4)6 éléments dans la listeRÉUSSI / ÉCHOUÉ
Après — chargements de scripts bloqués (étape 5)Scripts CDN absents de l’onglet réseau, appels fetch toujours complétésRÉUSSI / ÉCHOUÉ
Comparaison avant/après (étape 6)Différence claire entre les preuves des étapes 2 et 5RÉUSSI / ÉCHOUÉ

Phase 3 terminée. Passez à la Phase 4 — Démantèlement lorsque vous êtes prêt à supprimer tous les objets de déploiement.