Resumen

Se identifico una vulnerabilidad de tipo IDOR (Insecure Direct Object Reference) en un endpoint API de una aplicacion de gestion corporativa. La API utilizaba un mecanismo de llamadas donde el identificador del recurso se enviaba como parametro en el body JSON.

No existia ninguna validacion de autorizacion a nivel de objeto: cualquier usuario autenticado podia acceder a los datos de cualquier otro usuario simplemente iterando un ID numerico secuencial.

Detalles tecnicos

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 numerico secuencial. Cambiando este valor por cualquier otro ID se obtenian los datos completos de otros usuarios sin ninguna validacion.

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, telefono, email, direccion, empresa, y documentos adjuntos incluyendo fotografia, escaneo de documento de identidad, firma digital y certificados profesionales.

Escalabilidad del ataque

Al ser IDs numericos secuenciales, un atacante podia automatizar la extraccion masiva de datos:

Pseudocodigo — Enumeracion automatizada
for record_id in range(500000, 600000):
    response = api_request(record_id)
    if response.status == "OK":
        save_record(response.record)
        # nombre, documento, telefono, email, firma digital...

Impacto

  • Exposicion masiva de datos personales (PII) de todos los usuarios del sistema
  • Acceso a documentos sensibles incluyendo fotografias, documentos de identidad y firmas digitales
  • Violacion de GDPR/RGPD con implicaciones legales y sanciones potenciales de la AEPD
  • Riesgo de suplantacion de identidad con los documentos obtenidos
  • Enumeracion completa de la base de usuarios por IDs secuenciales
Contexto regulatorio: Este tipo de exposicion de datos personales puede acarrear sanciones de la AEPD de hasta 20 millones de euros o el 4% de la facturacion anual segun el RGPD. La deteccion y correccion temprana evito un posible procedimiento sancionador.

Remediacion

  1. Implementar autorizacion 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 peticiones para dificultar la enumeracion 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