Skip to content

Insecure direct object references (IDOR)

Introdução

O IDOR ocorre quando nossa aplicação não valida corretamente os inputs que vem do usuário, permitindo acesso a funções, objetos ou informações na qual o usuário atualmente logado não deveria ter acesso.

Cenário Vulnerável

Imagine que temos uma tela onde o usuário logado pode ver as informações do seu próprio perfil.

Ao inspecionar as chamadas de API, vemos a seguinte request que busca os dados para montar a página:

GET /user/profile/1 HTTP/2
Host: my-api.company.com.br

E no código, vemos algo assim:

public ActionResult GetUserProfile(int userId)
{
var profile = db.UserProfiles.FirstOrDefault(p => p.Id == userId);
return View(profile);
}

A pergunta que fica é:

O que aconteceria se um atacante fizesse um request para /user/profile/2?

Por acaso os dados da conta 2 seriam entregues? E este usuário deveria ter acesso a estes dados?

Quando manipulamos as requisições e trocamos informações por outros que levariam a informações na qual não deveríamos ter acesso, temos um problema de IDOR.

Riscos

Exposição de Dados Confidenciais

Os atacantes podem obter acesso a informações particulares do usuário, registros financeiros, propriedade intelectual ou outros dados confidenciais.

Escalonamento de Privilégios

Os atacantes podem elevar privilégios para modificar dados, realizar transações não autorizadas ou obter acesso administrativo.

Danos à Reputação

Ataques IDOR bem-sucedidos podem corroer a confiança do cliente e levar a reações legais e regulatórias.

Como Mitigar

Procure por todas as operações na qual existam INPUTs de usuários, tais como APIs, URLs com parâmetros em query strings ou no path, corpo de requests, etc.

Nestas operações, procure por IDs ou qualquer outro parâmetro que poderia levar a outro usuário ou informação no sistema, tais como:

  • IDs de entidades (UserId, AddressId, etc)
  • Caminhos de Arquivos (fatura-123.pdf, /users/photo/123, etc)

Em cada um destes parâmetros, troque as informações por de outros arquivos ou IDs que pertençam a outros usuários na qual você não deveria ter acesso. Caso consiga acessar, temos uma vulnerabilidade e necessitamos corrigir.

Para a correção, implemente uma verificação se o usuário logado de fato pode fazer a operação sobre aquele recurso. Em caso de não poder, retorne um erro 403 Forbidden.

Referências