Ir al contenido

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.

Ventana 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 el recuento no es 0, quedan mitigaciones de una ejecución anterior. Elimine cada una antes de continuar:

Ventana de terminal
# 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»
Ventana 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}]}'
VerificaciónEsperadoEstado
Recuento de dominios mitigados0 (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 presenteswww.httpbin.org, jsonplaceholder.typicode.comPASS 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.

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):

  1. Navegar con initScript — primero navegue a about:blank para asegurar un contexto de documento limpio (evita initScripts obsoletos de navegaciones anteriores), luego use navigate_page hacia http://$F5XC_DOMAINNAME/#/login con el initScript de la Fase 2 (código literal en Fase 2 — Ejecución automatizada por IA). Este initScript guarda setInterval, clearInterval, fetch y console.log nativos — la referencia a fetch nativo es correcta aquí porque no hay mitigaciones activas
  2. Descartar el banner de bienvenida — use press_key con Escape para 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
  3. 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
  4. Capturar evidencia — use list_console_messages para verificar la presencia de [CSD Demo] Simulation complete y los resultados de carga de CDN; use list_network_requests filtrado por tipos script y fetch para verificar los códigos de estado HTTP (200/201 para éxito)

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:

  1. Navegue a http://xF5XC_DOMAINNAMEx/#/login
  2. Ingrese credenciales ficticias en los campos de correo electrónico y contraseña (no envíe el formulario)
  3. Abra DevTools — presione F12 y cambie a la pestaña Console
  4. Pegue y ejecute el Script de detección combinado desde Detección de activación
  5. 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
VerificaciónEsperado (antes de la mitigación)Estado
Scripts CDN inyectadosLas 4 etiquetas de script se cargan — aparecen mensajes [Supply Chain] Loaded from, la pestaña de red muestra 200PASS
Fetch de exfiltración a www.httpbin.orgLa pestaña de red muestra 200 — datos enviadosPASS
Fetch de exfiltración a jsonplaceholder.typicode.comLa pestaña de red muestra 201 — datos enviadosPASS
Salida de consola[CSD Demo] Simulation completePASS

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):

DominioFunción
cdn.jsdelivr.netInyección de scripts CDN
esm.shInyección de scripts CDN
unpkg.comInyección de scripts CDN
ga.jspm.ioInyección de scripts CDN
www.httpbin.orgEndpoint de exfiltración de datos
jsonplaceholder.typicode.comEndpoint de exfiltración de datos

Mitigar un dominio (ejecutar una vez por dominio):

Ventana 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 .

Repita para cada dominio:

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 .

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:

Ventana 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)}'
VerificaciónEsperadoEstado
Recuento de dominios mitigados6 (coincide con el recuento de POST)PASS si el recuento coincide
Todos los POST del Paso 3 devolvieron 200 o 409Cada dominio aceptadoPASS

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 &lt;script&gt; se vacía a una cadena vacía).

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().

  1. Navegar con initScript — use new_page con isolatedContext para obtener un contexto de navegador limpio (evita initScripts obsoletos del Paso 2), luego navegue a about:blank y después a la página de inicio de sesión con el initScript de la Fase 2
  2. Descartar el banner de bienvenida — use press_key con Escape
  3. Esperar a que finalice — espere 10 segundos para todas las devoluciones de llamada asíncronas
  4. Capturar evidencia — use list_console_messages para verificar la presencia de [CSD Demo] Simulation complete; use list_network_requests filtrado por tipos script y fetch para 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

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:

  1. Navegue a http://xF5XC_DOMAINNAMEx/#/login
  2. Ingrese credenciales ficticias en los campos de correo electrónico y contraseña (no envíe el formulario)
  3. Abra DevTools — presione F12 y cambie a la pestaña Console
  4. Pegue y ejecute el Script de detección combinado desde Detección de activación
  5. Observe la salida de la consola y la red — las devoluciones de llamada onload y onerror de los scripts CDN no se activan para los dominios mitigados (CSD vació el src del 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 respuestas 200/201 — la mitigación de CSD bloquea la carga de scripts, no las llamadas fetch/XHR
VerificaciónEsperado (después de la mitigación)Estado
Cargas de scripts CDNBloqueadas — los scripts no aparecen en la pestaña de red (CSD vació src a una cadena vacía)PASS
Devoluciones de llamada de scripts CDNNi onload ni onerror se activan para dominios mitigadosPASS
Fetch de exfiltración a www.httpbin.org200 — el fetch aún se completa (CSD no intercepta fetch)INFO
Fetch de exfiltración a jsonplaceholder.typicode.com201 — el fetch aún se completa (CSD no intercepta fetch)INFO
Salida de consola[CSD Demo] Simulation completePASS

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.

SeñalAntes de la mitigación (Paso 2)Después de la mitigación (Paso 5)
Cargas de scripts CDN200 — los 4 scripts CDN se cargan normalmenteBloqueadas — scripts ausentes de la pestaña de red (CSD vació src a una cadena vacía)
Devoluciones de llamada onload de CDNAparecen mensajes [Supply Chain] Loaded fromNo se activan devoluciones de llamada (no se realizó ninguna solicitud de red)
Exfiltración a www.httpbin.org200 — datos exfiltrados200 — el fetch aún se completa (CSD no intercepta fetch)
Exfiltración a jsonplaceholder.typicode.com201 — datos exfiltrados201 — el fetch aún se completa (CSD no intercepta fetch)
API de dominios mitigados de CSD0 mitigados6 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:

Ventana 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}]}'

Verificar scripts con estado de mitigación:

Ventana 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}]}'
VerificaciónEsperadoEstado
Línea base limpia (Paso 1)0 dominios mitigados al inicioPASS / FAIL
Antes — el ataque tiene éxito (Paso 2)Los scripts se cargan, la exfiltración devuelve 200/201PASS / 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 listaPASS / FAIL
Después — cargas de scripts bloqueadas (Paso 5)Scripts CDN ausentes de la pestaña de red, las llamadas fetch aún se completanPASS / FAIL
Comparación antes vs después (Paso 6)Diferencia clara entre la evidencia del Paso 2 y el Paso 5PASS / FAIL

Fase 3 completa. Proceda a la Fase 4 — Desmontaje cuando esté listo para eliminar todos los objetos de implementación.