Cabeçalho penumbroso

O que é IDOR? Um guia simples para esse risco comum à segurança

Saiba o que significa IDOR (Insecure Direct Object Reference), como os invasores o exploram e como os desenvolvedores podem evitar vulnerabilidades de IDOR usando práticas de codificação seguras, padrões de controle de acesso e plataformas de teste automatizadas.

O que é o IDOR?

O IDOR (Insecure Direct Object Reference) é uma vulnerabilidade de segurança em que um aplicativo expõe identificadores de objetos internos, como IDs de usuários, números de pedidos ou nomes de arquivos, sem verificar se o solicitante está autorizado a acessar esse objeto. Ao alterar um parâmetro em uma chamada de URL ou API, um invasor pode visualizar, modificar ou excluir dados aos quais não deveria ter acesso.

Entendendo a IDOR: por que essa vulnerabilidade ainda é importante

A IDOR pertence à ampla categoria de Controle de acesso quebradoque a OWASP classificou como um dos riscos mais críticos de segurança na Web durante anos. O perigo do IDOR está em sua simplicidade: o invasor não precisa de técnicas avançadas de exploração, codificação de carga útil ou escalonamento de privilégios. Um único parâmetro alterado, geralmente apenas um número, pode expor informações privadas.

Um padrão vulnerável típico é o seguinte:

bash

/api/user/profile?id=1002

Se o aplicativo não verificar a propriedade ou a autorização, alterar a ID para 1003 pode revelar os dados de outro usuário.

Os aplicativos modernos, especialmente os que envolvem APIs, microsserviços ou clientes móveis, geralmente dependem muito do acesso parametrizado a objetos. Essa arquitetura, embora rápida e flexível, pode facilmente introduzir a IDOR quando as verificações de autorização são inconsistentes ou ausentes.

IDOR WordPress

CVE-2025-13526: um caso real de IDOR na natureza

Um dos exemplos mais recentes de alta visibilidade da exploração da IDOR é CVE-2025-13526que afeta o popular plug-in do WordPress OneClick Chat to Order (versões ≤ 1.0.8).

  • A vulnerabilidade reside na seção wa_order_thank_you_override função. O plug-in confia em uma função order_id da string de consulta do URL, sem verificar se a solicitação vem do proprietário legítimo do pedido.
  • Os invasores (mesmo os não autenticados) poderiam simplesmente manipular o order_id no URL da página de agradecimento (por exemplo, alterando order_id=123456 para order_id=123455) e recuperar detalhes de pedidos de outros clientes. Os dados expostos incluem nomes, endereços de e-mail, números de telefone, endereços de cobrança/remessa, itens e preços do pedido, metadados do método de pagamento. wiz.io+2Gowri Infosec+2
  • Como os IDs dos pedidos eram sequenciais e previsíveis, a enumeração em massa tornou-se trivial, o que significa que um invasor ou um script automatizado poderia coletar milhares de pedidos em minutos. Médio+1
  • A vulnerabilidade recebeu uma pontuação básica CVSS v3.1 de 7,5 (Alta), refletindo a facilidade de exploração (sem necessidade de autenticação) e a gravidade da exposição dos dados.
  • O desenvolvedor corrigiu o problema na versão 1.0.9A atualização do site para a versão mais recente do sistema, implementando verificações de autorização adequadas para garantir que somente os proprietários legítimos (ou usuários autorizados) possam visualizar os dados do pedido. Os proprietários de sites foram instados a fazer a atualização imediatamente. Gowri Infosec+1

Essa violação no mundo real mostra que o IDOR não é um bug teórico ou legado - ele continua ativo, explorável e com consequências potencialmente graves para a privacidade e a conformidade.

CVE-2025-13526: um caso real de IDOR na natureza Penligente

Cenários comuns do mundo real em que ocorre a IDOR

O IDOR pode aparecer em qualquer sistema que faça referência a objetos internos por meio de entradas controladas pelo usuário. Veja abaixo os contextos comuns:

Tipo de aplicativoExemplo de objetoPor que ocorre a IDOR
Sistemas de contasuserIdExposição direta de identificadores de usuários
Aplicativos de comércio eletrônicoorderIdValidação inadequada de propriedade
Gerenciamento de arquivosfileIdFalta de controle de acesso aos arquivos
Plataformas de emissão de bilhetesticketIdOs usuários acessam os tíquetes de outros usuários
Aplicativos SaaS multilocatáriostenantIdVazamentos de dados entre locatários

Os invasores geralmente enumeram IDs previsíveis, tentam IDs sequenciais ou reproduzem solicitações autenticadas com parâmetros modificados.

Como os invasores exploram o IDOR (exemplos seguros e controlados)

Abaixo estão exemplos de ilustrações seguras mostrando padrões vulneráveis típicos e suas contrapartes seguras. Essas explorações não são prejudiciais; elas modelam erros comuns para ajudar os desenvolvedores a reconhecer padrões inseguros.

Exemplo 1: IDOR em Node.js / Express

javascript

// Exemplo vulnerável: confiar na ID fornecida pelo usuário

app.get('/api/user/profile', (req, res) => {

const userId = req.query.id;

db.users.findById(userId).then(user => {

res.json(user);

});

});

// ✅ Exemplo seguro: impor autorização

app.get('/api/user/profile', (req, res) => {

const authenticatedId = req.user.id;

db.users.findById(authenticatedId).then(user => {

Se (!user) return res.status(404).json({ error: "User not found" });

res.json({ id: user.id, email: user.email, role: user.role });

});

});

Exemplo 2: Um padrão comum em Python / Flask

python

#❌ Inseguro: sem validação de propriedade

@app.get("/invoice")

def get_invoice():

invoice_id = request.args.get("id")

return get_invoice_by_id(invoice_id)

#✅ Secure: verificação de permissão adicionada

@app.get("/invoice")

def get_invoice_secure():

invoice_id = request.args.get("id")

user_id = session["user_id"]

invoice = get_invoice_by_id(invoice_id)

se invoice.owner_id != user_id:

return {"error": "Unauthorized"}, 403

devolver fatura

Exemplo 3: Defesa combinada de back-end e front-end (Java + React)

Java (Spring Boot)

java

// ❌ Falta de verificação de autorização

@GetMapping("/orders")

public Order getOrder(@RequestParam String orderId) {

return orderRepository.findById(orderId);

}

// ✅ Implementação segura

@GetMapping("/orders")

público ResponseEntity getOrder(

@RequestParam String orderId,

Principal principal) {

Order order = orderRepository.findById(orderId);

Se (!order.getUser().equals(principal.getName())) {

return ResponseEntity.status(HttpStatus.FORBIDDEN)

.body(Collections.singletonMap("error", "Access denied"));

}

return ResponseEntity.ok(order);

}

Solicitação segura no lado do React

javascript

função assíncrona fetchOrder(orderId) {

const res = await fetch(/orders?orderId=${orderId}, {

cabeçalhos: { "Authorization": Bearer ${localStorage.getItem("token")} }

});

Se (!res.ok) lançar um novo erro ("Não autorizado ou não encontrado");

retornar res.json();

}

Detecção de vulnerabilidades do IDOR: Abordagens práticas para desenvolvedores

Encontrar a IDOR geralmente é mais difícil do que explorá-la. Ao contrário das vulnerabilidades de injeção, a IDOR nem sempre produz erros técnicos óbvios - seus sintomas são lógicos e comportamentais.

As técnicas comuns de detecção incluem:

  1. Fuzzing diferencial (teste de várias IDs)
  2. Teste de repetição (captura → modificação → repetição)
  3. Troca de função multiusuário
  4. Enumeração de parâmetros

Pseudocódigo de fuzzing seguro:

python

Exemplo simples de fuzzing seguro

ids = ["1001", "1002", "1003"]

para i em ids:

res = client.get(f"/api/user/profile?id={i}")

print(i, res.status_code, len(res.text))

Prevenção de IDOR: práticas recomendadas que os desenvolvedores devem seguir

A prevenção de IDOR não se trata de ofuscação - trata-se de autorizaçãoO desempenho do servidor foi consistente.

Nunca confie nos identificadores de objeto do cliente

Todos os parâmetros são modificáveis. Até mesmo IDs criptografadas podem ser adulteradas.

Aplicar autorização no lado do servidor em cada solicitação

Use modelos reconhecidos de controle de acesso:

  • RBAC (Controle de acesso baseado em função)
  • ABAC (Controle de acesso baseado em atributos)
  • ACLs (Listas de controle de acesso)
  • Política como código sistemas como OPA

Recursos de autoridade:

PortSwigger Web Security Academy: https://portswigger.net/web-security/access-control

Prefira identificadores não enumeráveis

Os UUIDs reduzem, mas não eliminam, o risco de IDOR.

Validar os limites dos locatários em ambientes com vários locatários

O IDOR entre locatários é uma das formas mais graves e onerosas.

Use uma camada de back-end para front-end (BFF)

Um BFF pode centralizar a lógica de autorização, reduzindo as inconsistências entre os clientes.

Exemplos avançados adicionais

Exemplo 4: API Go com falta de autorização

ir

// Manipulador vulnerável

func GetDocument(w http.ResponseWriter, r *http.Request) {

id := r.URL.Query().Get("id")

doc := db.FindDocument(id)

json.NewEncoder(w).Encode(doc)

}

// ✅ Com validação de propriedade

func GetDocumentSecure(w http.ResponseWriter, r *http.Request) {

id := r.URL.Query().Get("id")

user := r.Context().Value("user").(string)

doc := db.FindDocument(id)

if doc.Owner != user {

http.Error(w, "Unauthorized", http.StatusForbidden)

retorno

}

json.NewEncoder(w).Encode(doc)

}

Exemplo 5: pontos de extremidade GraphQL e autorização de objeto

javascript

// ❌ Resolvedor vulnerável

const resolvers = {

Query: {

order: (_, { id }) => db.getOrder(id),

}

};

// ✅ Resolvedor seguro com verificação de propriedade

const resolversSecure = {

Query: {

order: (_, { id }, context) => {

const order = db.getOrder(id);

Se (order.owner !== context.user.id) {

lançar um novo erro ("Acesso negado");

}

ordem de devolução;

}

}

};

Exemplo 6: Acesso seguro em Rust (Actix Web)

ferrugem

// ❌ Vulnerável

async fn get_ticket(path: web::Path) -> impl Responder {

let id = path.into_inner();

let ticket = db::find_ticket(&id);

web::Json(ticket)

}

// ✅ Versão segura

async fn get_ticket_secure(

path: web::Path,

usuário: LoggedInUser

) -> impl Responder {

let id = path.into_inner();

let ticket = db::find_ticket(&id);

if ticket.owner != user.id {

return HttpResponse::Forbidden().json("Acesso negado");

}

HttpResponse::Ok().json(ticket)

}

Automatizando a detecção de IDOR: Por que as ferramentas tradicionais têm dificuldades

A maioria dos scanners de vulnerabilidade tradicionais não consegue detectar a IDOR de forma confiável porque a IDOR exige duas coisas que os scanners tradicionalmente não conseguem fazer:

  1. Consciência da lógica de negócios
  2. Teste contextual com vários usuários

As ferramentas de varredura que dependem exclusivamente da detecção baseada em assinatura ou de solicitações de usuário único geralmente não detectam o IDOR por completo, especialmente em APIs.

Como a Penligent ajuda a identificar o IDOR automaticamente

É aqui que PenligenteA Penligent, uma plataforma de testes de penetração orientada por IA, oferece uma vantagem exclusiva. Ao contrário dos scanners convencionais, a Penligent realiza:

  • Simulação automática para vários usuários
  • Inferência de parâmetros entre objetos
  • Reconhecimento inteligente de padrões de identificação
  • Análise diferencial comportamental
  • Fuzzing de IA que se adapta com base nas respostas observadas

Uma amostra da saída de detecção segura e anônima da Penligent:

vbnet

`Potencial IDOR detectado:Ponto final: /orders?id=1002Observed behavior:

  • O usuário A recebeu o pedido #1003 (de propriedade do usuário B) Risco: acesso não autorizado aos dados de outro usuário`

Esse tipo de insight é difícil de obter apenas com ferramentas estáticas ou revisão manual.

Reduzindo os riscos de IDOR em CI/CD com a Penligent

A Penligent se integra naturalmente aos pipelines de CI/CD e oferece cobertura contínua:

  • Descoberta automática de API e rota
  • Inferência de matriz de permissão em tempo real
  • Varredura de ambientes de preparação e de produção
  • Geração automática de sequências de PoC seguras e reproduzíveis

Isso reduz:

  • Pontos cegos da lógica de negócios
  • Exposição a vários locatários
  • Riscos regulatórios (GDPR, HIPAA, SOC2)

Conclusão: A IDOR é simples, mas devastadora - e evitável

A IDOR continua sendo uma das formas mais comuns e prejudiciais de vulnerabilidades de controle de acesso. Como ela se oculta na lógica de negócios, muitas vezes passa despercebida pelas ferramentas tradicionais. Ao aplicar verificações de autorização consistentes, usar identificadores não previsíveis, validar limites de locatários e adotar plataformas de testes automatizados como a Penligent, as organizações podem reduzir drasticamente o risco de exposição de dados em grande escala.

A IDOR não pode ser totalmente eliminada por acaso ou por boas intenções - ela exige controle de acesso estruturado, princípios de engenharia consistentes e testes contínuos.

Compartilhe a postagem:
Publicações relacionadas