Ficha — 5.12 y 6.9 · ZAP baseline PASIVO autenticado por rol
- ID de prueba: ZAP-BASELINE-PASIVO (criterios 5.12 y 6.9)
- Fecha y hora: 2026-10-10, 17:55 a 18:03 UTC (12:55 a 13:03 Bogotá)
- Ejecutado por: subagente
ejecutor-pruebas-trl(Claude Opus 5.5), Claude Code, desde el portátil de [dato real omitido] - Entorno: producción tratada como staging.
https://www.proyectonara.com(Vercelnara-web, despliegue de produccióndpl_FVHfT9wmkA8oZBivBdABMLyUrtcU, creado 12:21 Bogotá; commit no expuesto por la CLI:maindenara-webestaba ence9fc8fsegúngit ls-remote) →nara-api92d7f73(/api/healthantes y después:92d7f73). - Herramienta: OWASP ZAP 2.17.0 portable, Automation Framework (
-cmd -autorun), Java 17. Directorio de inicio temporal (-dir, fuera del repo). - Datos usados: cuentas
prueba.experto,prueba.clinico,prueba.observador,prueba1.paciente(territorio «Prueba»). No hay cuenta de administrador de prueba. - Procedimiento: por rol,
_herramientas/zap_rol.jsinicia sesión por la API pública, y lanza ZAP con la cookienara_sidinyectada por la regla 0 del replacer (-config, nunca en archivos). Planplan-<rol>.yaml(generado porgenerar_plan.js):passiveScan-config→requestor(GET de la raíz,/ingreso, las pantallas del rol y 13 rutas GET de la API, con aserción de200en la primera pantalla del rol para comprobar que la sesión es válida) →spider(3 min máx., sin enviar formularios, sin POST) →passiveScan-wait→ informes HTML y JSON. Excluidos:logout|salir|cerrar-sesion,/api/teoy/api/auth/login. No hay jobactiveScan. - Resultado: Parcial (ver abajo).
Alertas por rol
| Rol | High | Medium | Low | Informational | URLs del spider |
|---|---|---|---|---|---|
| Experto de campo | 0 | 3 | 0 | 4 | 115 |
| Clínico | 0 | 3 | 0 | 4 | 123 |
| Observador | 0 | 3 | 0 | 4 | 118 |
| Paciente | 0 | 3 | 0 | 4 | 130 |
| Administrador | — | — | — | — | No hay cuenta de prueba |
Medium (las mismas en los 4 roles):
- 10055 CSP
script-src 'unsafe-inline'(confianza alta), en todas las pantallas. - 10055 CSP
style-src 'unsafe-inline'(confianza alta). - 10098 Cross-Domain Misconfiguration: las pantallas HTML responden
Access-Control-Allow-Origin: *. Verificación manual (cors_origen_ajeno.jsonl): las rutas/api/*no devuelvenAccess-Control-Allow-Origina un origen ajeno (con cookie), así que el navegador no deja leer datos de la API desde otro sitio; el*afecta solo al HTML de las pantallas (sin datos personales en el HTML inicial).
Informational: 10027 comentarios sospechosos en chunks JS de terceros (falsos positivos: query, from en código minificado), 10109, 10015 (Cache-Control: public, max-age=0, must-revalidate en pantallas autenticadas), 10050.
Umbrales
- 5.12: informe contra versión congelada → no:
92d7f73no es la versión final (Lucho sigue desplegando). 0 High → sí. Medium anotadas con plan → no hay plan escrito en el proyecto (el reporte 2026-10-10-4 solo registra la CSP como Info). - 6.9: 5 informes, uno por rol → no: 4 de 5 (falta administrador). 0 High en cada uno → sí. Medium con plan → no.
Evidencia
zap-baseline-<rol>.html y .json, zap-<rol>.log, plan-<rol>.yaml, generar_plan.js, cors_origen_ajeno.jsonl; script de lanzamiento ../_herramientas/zap_rol.js.
Limitaciones
- Spider clásico (sin JavaScript): las pantallas del SPA solo se ven como HTML inicial; las llamadas a la API se cubren con la lista explícita de 13 GET. No se probó el Ajax spider (memoria del portátil).
- Las dos primeras corridas del rol experto (17:55 y 17:57 UTC) no quedaron autenticadas: la sustitución
${ZAP_SID}del jobreplacerdel Automation Framework no se aplicó y ZAP envió la cookie literal (la aserción dio 307 en/inicioy 401 en/api/auth/me). Sus informes se sobrescribieron con la tercera corrida, que sí quedó autenticada (sin avisos de aserción). Efecto lateral: esas dos corridas usaron el directorio por defecto%USERPROFILE%\ZAPy dejaron enconfig.xmldos reglas del replacer activas llamadas «cookie de sesion del rol» (valor literalnara_sid=${ZAP_SID}, sin secreto). Hay que desactivarlas o borrarlas a mano antes de usar ZAP con ese perfil; el agente no puede editar archivos fuera de la evidencia. - Es solo pasivo. El escaneo activo de lectura se registra aparte (sección «ZAP activo» abajo, si se ejecuta).
H-ZAP (CSP unsafe-inline y ACAO: * en HTML, Medium sin plan) — ver reporte.