- Inicio
- Defensa del lado del cliente
- Demo
- Fase 3 — Mitigar
Fase 3 — Mitigar
La Fase 3 crea una prueba comparativa antes/después de la mitigación de CSD. Se vuelve a ejecutar el ataque sin mitigaciones para establecer una línea base, se aplican las mitigaciones y luego se vuelve a ejecutar el mismo ataque para demostrar que CSD bloquea las llamadas de red. La Fase 2 debe estar completa — todas las verificaciones DET deben estar en estado PASS — antes de continuar.
Paso 1: Confirmar que no hay mitigaciones activas (línea base)
Sección titulada «Paso 1: Confirmar que no hay mitigaciones activas (línea base)»Antes de capturar la instantánea “antes”, verifique que el entorno esté limpio — no deben estar activas mitigaciones. Esto asegura que el ataque de línea base se ejecute sin ningún bloqueo de CSD.
Verificar el recuento de dominios mitigados
Sección titulada «Verificar el recuento de dominios mitigados»curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'Si el recuento no es 0, quedan mitigaciones de una ejecución anterior. Elimine cada una antes de continuar:
# Eliminar un dominio mitigado (repetir para cada nombre de dominio)curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/<domain-name>" \ | jq .Reemplace <domain-name> con el metadata.name utilizado cuando se mitigó el dominio (p. ej., cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io, httpbin.org, jsonplaceholder.typicode.com). Si la limpieza de httpbin.org deja un elemento restante, también intente eliminar www.httpbin.org — algunas ejecuciones anteriores pueden haber usado ese nombre como metadata.
Confirmar que las detecciones de la Fase 2 están presentes
Sección titulada «Confirmar que las detecciones de la Fase 2 están presentes»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}]}'Evidencia
Sección titulada «Evidencia»| Verificación | Esperado | Estado |
|---|---|---|
| Recuento de dominios mitigados | 0 (línea base limpia) | PASS si es 0, requiere limpieza si es > 0 |
| Recuento de dominios detectados | > 0 (detecciones de la Fase 2 presentes) | PASS si es > 0 |
| Dominios de exfiltración presentes | www.httpbin.org, jsonplaceholder.typicode.com | PASS si aparece al menos uno |
Paso 2: Ejecutar el ataque — antes de la mitigación
Sección titulada «Paso 2: Ejecutar el ataque — antes de la mitigación»Vuelva a ejecutar la simulación combinada sin mitigaciones activas para capturar una línea base nueva. Esta es la instantánea “antes” — prueba de que los ataques tienen éxito cuando no se aplica la mitigación de CSD.
Ejecución automatizada por IA
Sección titulada «Ejecución automatizada por IA»Los asistentes de IA con herramientas de automatización del navegador ejecutan la simulación del ataque de forma programática utilizando el mismo initScript de la Fase 2 (que guarda el fetch nativo):
- Navegar con initScript — primero navegue a
about:blankpara asegurar un contexto de documento limpio (evita initScripts obsoletos de navegaciones anteriores), luego usenavigate_pagehaciahttp://$F5XC_DOMAINNAME/#/logincon el initScript de la Fase 2 (código literal en Fase 2 — Ejecución automatizada por IA). Este initScript guardasetInterval,clearInterval,fetchyconsole.lognativos — la referencia afetchnativo es correcta aquí porque no hay mitigaciones activas - Descartar el banner de bienvenida — use
press_keyconEscapepara cerrar el banner de bienvenida. En visitas posteriores, el banner puede no aparecer (cookies persistidas). El diálogo de consentimiento de cookies se descarta automáticamente con la tecla Escape - Esperar a que finalice — espere 10 segundos para que se completen todas las devoluciones de llamada de carga/error de scripts CDN y las resoluciones de promesas fetch
- Capturar evidencia — use
list_console_messagespara verificar la presencia de[CSD Demo] Simulation completey los resultados de carga de CDN; uselist_network_requestsfiltrado por tiposscriptyfetchpara verificar los códigos de estado HTTP (200/201para éxito)
Ejecución manual
Sección titulada «Ejecución manual»Los operadores sin herramientas de automatización del navegador ejecutan la simulación manualmente usando el mismo procedimiento que en Fase 2 — Paso 8: Simulación del ataque:
- Navegue a
http://xF5XC_DOMAINNAMEx/#/login - Ingrese credenciales ficticias en los campos de correo electrónico y contraseña (no envíe el formulario)
- Abra DevTools — presione F12 y cambie a la pestaña Console
- Pegue y ejecute el Script de detección combinado desde Detección de activación
- Observe la salida de la consola — todos los scripts CDN deben cargarse y las llamadas de exfiltración deben tener éxito con respuestas
200/201
Evidencia — antes de la mitigación
Sección titulada «Evidencia — antes de la mitigación»| Verificación | Esperado (antes de la mitigación) | Estado |
|---|---|---|
| Scripts CDN inyectados | Las 4 etiquetas de script se cargan — aparecen mensajes [Supply Chain] Loaded from, la pestaña de red muestra 200 | PASS |
Fetch de exfiltración a www.httpbin.org | La pestaña de red muestra 200 — datos enviados | PASS |
| Fetch de exfiltración a jsonplaceholder.typicode.com | La pestaña de red muestra 201 — datos enviados | PASS |
| Salida de consola | [CSD Demo] Simulation complete | PASS |
Paso 3: Aplicar mitigaciones
Sección titulada «Paso 3: Aplicar mitigaciones»Para cada dominio detectado, realice un POST al endpoint de dominios mitigados. Los objetivos principales de la simulación de la Fase 2 son los 4 dominios de inyección CDN y cualquier dominio de exfiltración de datos detectado.
Objetivos principales de mitigación (del script de simulación combinado):
| Dominio | Función |
|---|---|
cdn.jsdelivr.net | Inyección de scripts CDN |
esm.sh | Inyección de scripts CDN |
unpkg.com | Inyección de scripts CDN |
ga.jspm.io | Inyección de scripts CDN |
www.httpbin.org | Endpoint de exfiltración de datos |
jsonplaceholder.typicode.com | Endpoint de exfiltración de datos |
Mitigar un dominio (ejecutar una vez por dominio):
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 .Repita para cada dominio:
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.comcurl -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.iocurl -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.comcurl -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 .Una respuesta 200 devuelve el objeto de dominio mitigado creado. Una respuesta 409 significa que el dominio ya está en la lista de mitigados — esto es una condición de éxito.
Paso 4: Verificar que las mitigaciones se han aplicado
Sección titulada «Paso 4: Verificar que las mitigaciones se han aplicado»Liste todos los dominios mitigados y confirme que el recuento coincide con el número de dominios enviados:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'Evidencia
Sección titulada «Evidencia»| Verificación | Esperado | Estado |
|---|---|---|
| Recuento de dominios mitigados | 6 (coincide con el recuento de POST) | PASS si el recuento coincide |
Todos los POST del Paso 3 devolvieron 200 o 409 | Cada dominio aceptado | PASS |
Si el recuento es menor al esperado, vuelva a ejecutar el comando POST para el dominio faltante del Paso 3.
Paso 5: Ejecutar el ataque — después de la mitigación
Sección titulada «Paso 5: Ejecutar el ataque — después de la mitigación»Vuelva a ejecutar la misma simulación combinada para capturar la instantánea “después”. El script de simulación es idéntico — solo ha cambiado el estado de mitigación de CSD. Las cargas de scripts desde dominios mitigados ahora son bloqueadas por el JavaScript de CSD (el src de la etiqueta <script> se vacía a una cadena vacía).
Ejecución automatizada por IA
Sección titulada «Ejecución automatizada por IA»Los asistentes de IA con herramientas de automatización del navegador vuelven a ejecutar la simulación del ataque de forma programática usando el mismo initScript de la Fase 2 (código literal en Fase 2 — Ejecución automatizada por IA). El initScript guarda fetch nativo para evitar errores de zone.js — esto no afecta la mitigación de CSD porque CSD no intercepta las llamadas fetch().
- Navegar con initScript — use
new_pageconisolatedContextpara obtener un contexto de navegador limpio (evita initScripts obsoletos del Paso 2), luego navegue aabout:blanky después a la página de inicio de sesión con el initScript de la Fase 2 - Descartar el banner de bienvenida — use
press_keyconEscape - Esperar a que finalice — espere 10 segundos para todas las devoluciones de llamada asíncronas
- Capturar evidencia — use
list_console_messagespara verificar la presencia de[CSD Demo] Simulation complete; uselist_network_requestsfiltrado por tiposscriptyfetchpara observar que las cargas de scripts CDN están ausentes (CSD vació el src del script) mientras que las llamadas fetch a los dominios de exfiltración aún se completan normalmente
Ejecución manual
Sección titulada «Ejecución manual»Los operadores sin herramientas de automatización del navegador vuelven a ejecutar la simulación manualmente usando el mismo procedimiento que en Fase 2 — Paso 8: Simulación del ataque:
- Navegue a
http://xF5XC_DOMAINNAMEx/#/login - Ingrese credenciales ficticias en los campos de correo electrónico y contraseña (no envíe el formulario)
- Abra DevTools — presione F12 y cambie a la pestaña Console
- Pegue y ejecute el Script de detección combinado desde Detección de activación
- Observe la salida de la consola y la red — las devoluciones de llamada
onloadyonerrorde los scripts CDN no se activan para los dominios mitigados (CSD vació elsrcdel script a una cadena vacía, evitando completamente la solicitud de red). Las llamadas fetch a los dominios de exfiltración (www.httpbin.org, jsonplaceholder.typicode.com) aún se completan con respuestas200/201— la mitigación de CSD bloquea la carga de scripts, no las llamadas fetch/XHR
Evidencia — después de la mitigación
Sección titulada «Evidencia — después de la mitigación»| Verificación | Esperado (después de la mitigación) | Estado |
|---|---|---|
| Cargas de scripts CDN | Bloqueadas — los scripts no aparecen en la pestaña de red (CSD vació src a una cadena vacía) | PASS |
| Devoluciones de llamada de scripts CDN | Ni onload ni onerror se activan para dominios mitigados | PASS |
Fetch de exfiltración a www.httpbin.org | 200 — el fetch aún se completa (CSD no intercepta fetch) | INFO |
| Fetch de exfiltración a jsonplaceholder.typicode.com | 201 — el fetch aún se completa (CSD no intercepta fetch) | INFO |
| Salida de consola | [CSD Demo] Simulation complete | PASS |
Paso 6: Comparación antes vs después
Sección titulada «Paso 6: Comparación antes vs después»Este es el resultado de la demostración — evidencia lado a lado que prueba que el mismo ataque, en la misma página, con el mismo script, ahora produce un resultado completamente diferente.
Tabla comparativa
Sección titulada «Tabla comparativa»| Señal | Antes de la mitigación (Paso 2) | Después de la mitigación (Paso 5) |
|---|---|---|
| Cargas de scripts CDN | 200 — los 4 scripts CDN se cargan normalmente | Bloqueadas — scripts ausentes de la pestaña de red (CSD vació src a una cadena vacía) |
Devoluciones de llamada onload de CDN | Aparecen mensajes [Supply Chain] Loaded from | No se activan devoluciones de llamada (no se realizó ninguna solicitud de red) |
Exfiltración a www.httpbin.org | 200 — datos exfiltrados | 200 — el fetch aún se completa (CSD no intercepta fetch) |
| Exfiltración a jsonplaceholder.typicode.com | 201 — datos exfiltrados | 201 — el fetch aún se completa (CSD no intercepta fetch) |
| API de dominios mitigados de CSD | 0 mitigados | 6 mitigados |
Verificar la mitigación en los datos del backend
Sección titulada «Verificar la mitigación en los datos del backend»Consulte /detected_domains cada 60 segundos durante un máximo de 10 iteraciones (10 minutos). Proceda a la tabla comparativa una vez que la consulta devuelva resultados, o después del máximo de 10 minutos — estas verificaciones son informativas y no bloquean la Fase 4.
Verificar dominios detectados después de la mitigación:
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}]}'Verificar scripts con estado de mitigación:
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}]}'Resumen de evidencia de la Fase 3
Sección titulada «Resumen de evidencia de la Fase 3»| Verificación | Esperado | Estado |
|---|---|---|
| Línea base limpia (Paso 1) | 0 dominios mitigados al inicio | PASS / FAIL |
| Antes — el ataque tiene éxito (Paso 2) | Los scripts se cargan, la exfiltración devuelve 200/201 | PASS / FAIL |
| Mitigaciones aplicadas (Paso 3) | Los 6 dominios aceptados mediante POST (200 o 409) | PASS / FAIL |
| Recuento de mitigados confirmado (Paso 4) | 6 elementos en la lista | PASS / FAIL |
| Después — cargas de scripts bloqueadas (Paso 5) | Scripts CDN ausentes de la pestaña de red, las llamadas fetch aún se completan | PASS / FAIL |
| Comparación antes vs después (Paso 6) | Diferencia clara entre la evidencia del Paso 2 y el Paso 5 | PASS / FAIL |
Fase 3 completa. Proceda a la Fase 4 — Desmontaje cuando esté listo para eliminar todos los objetos de implementación.