June 3, 2026
Enumeração de Usuários e Exposição de Dados na Plataforma DevHub (algoritmoecafe.com)
Durante uma análise da plataforma DevHub, identifiquei uma falha que permitia a visualização de informações de outros usuários através de…
Lourenco Diogo
1 min read
Durante uma análise da plataforma DevHub, identifiquei uma falha que permitia a visualização de informações de outros usuários através de uma API pública.
A aplicação realizava uma requisição semelhante a:
GET /rest/v1/users?select=email,display_name&id=eq.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxGET /rest/v1/users?select=email,display_name&id=eq.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxO objetivo era retornar apenas os dados do usuário autenticado.
De forma simplificada, a consulta executada era equivalente a:
SELECT email, display_name
FROM users
WHERE id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';SELECT email, display_name
FROM users
WHERE id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';No entanto, alterando os parâmetros da requisição, era possível expandir a consulta e obter informações de múltiplos usuários cadastrados na plataforma.
A resposta continha dados de todos os usuários, como:
{
"id": "a1b2c3d4-e5f6-7890-abcd-123456789abc",
"email": "usuario@email.com",
"has_purchased_devhub": true,
"subscription_status": "active",
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-06-01T14:22:18Z",
"avatar_url": "https://tezdplhfnjewshtqkqon.supabase.co/avatar.png",
"display_name": "Usuario Exemplo",
"user_role": "member",
"email_notifications_enabled": true,
"last_seen_at": "2025-06-01T18:45:00Z",
"plan_type": "premium",
"subscription_id": "sub_xxxxxxxxxxxx",
"last_payment_date": "2025-05-20",
"current_period_end": "2025-06-20"
}{
"id": "a1b2c3d4-e5f6-7890-abcd-123456789abc",
"email": "usuario@email.com",
"has_purchased_devhub": true,
"subscription_status": "active",
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-06-01T14:22:18Z",
"avatar_url": "https://tezdplhfnjewshtqkqon.supabase.co/avatar.png",
"display_name": "Usuario Exemplo",
"user_role": "member",
"email_notifications_enabled": true,
"last_seen_at": "2025-06-01T18:45:00Z",
"plan_type": "premium",
"subscription_id": "sub_xxxxxxxxxxxx",
"last_payment_date": "2025-05-20",
"current_period_end": "2025-06-20"
}Com isso, era possível obter informações de todos os usuários cadastrados na plataforma.
Por que não é um SQLi?
À primeira vista, o comportamento pode lembrar um SQL Injection, já que a exploração resulta na obtenção de registros além daqueles originalmente previstos.
No entanto, não houve injeção de comandos SQL nem manipulação da consulta executada pelo banco de dados.
O banco continuava recebendo consultas válidas geradas pela própria API. O problema estava no fato de que a aplicação permitia consultas mais amplas do que deveria, expondo registros que não pertenciam ao usuário autenticado.
Em um SQL Injection clássico, o atacante altera a lógica da consulta através da injeção de comandos SQL, por exemplo:
SELECT email, display_name
FROM users
WHERE id = '123' OR 1=1;SELECT email, display_name
FROM users
WHERE id = '123' OR 1=1;Neste caso, a consulta não estava sendo injetada ou modificada dessa forma. A exposição ocorreu devido à forma como a API tratava os parâmetros recebidos e à ausência de restrições adequadas sobre quais registros poderiam ser retornados.
Por esse motivo, a falha se encaixa melhor como User Enumeration e Sensitive Information Disclosure, e não como SQL Injection.
Impacto
- Enumeração de usuários
- Exposição de endereços de e-mail
- Exposição de informações relacionadas a assinaturas
- Vazamento de metadados de contas
- Possibilidade de coleta massiva de informações da base de usuários
Correção
Consultas a dados de usuários devem ser limitadas ao escopo da conta autenticada. Informações sensíveis não devem ser retornadas sem validações adequadas de autorização, e mecanismos como Row Level Security (RLS) devem ser aplicados para impedir o acesso indevido a registros de terceiros.
Após o reporte, a falha aparenta ter sido corrigida e não foi mais observada durante verificações posteriores.
Classificação: User Enumeration / Sensitive Information Disclosure Severidade: Média