Um guia rápido sobre injeção LDAP
1 de junho de 2023
0 minutos de leituraO Lightweight Directory Access Protocol (LDAP) é um mecanismo de autenticação usado para proteger aplicações web. O LDAP é popular porque é leve e escala facilmente — características que agradam aos desenvolvedores, mas que também fazem com que os bancos de dados LDAP armazenem grandes quantidades de informações valiosas. Isso os torna alvos atraentes para atacantes.
As aplicações constroem consultas LDAP a partir de entradas do usuário para acessar e manipular as informações armazenadas nos bancos de dados LDAP. Idealmente, a aplicação deve validar e sanitizar as entradas do usuário. Porém, isso nem sempre acontece, deixando essas consultas vulneráveis a ataques de injeção LDAP.
Neste artigo, veremos como funciona a injeção LDAP, as possíveis consequências desse tipo de ataque e as diferentes maneiras de reforçar a segurança das aplicações contra ele.
Como funciona a injeção LDAP
As consultas LDAP usam predicados construídos com caracteres especiais — como aspas, asteriscos, colchetes e e-comercial — para controlar o significado da consulta. Esses caracteres especiais são chamados de metacaracteres. Em geral, essas entradas são sanitizadas e validadas antes da criação e do envio da consulta ao servidor. Porém, em um ambiente desprotegido, sem validação adequada das entradas, um atacante pode modificar os caracteres de controle e alterar o comportamento esperado da consulta.
Por exemplo, uma página de login solicita um USER e uma PASSWORD para autenticar o acesso a um banco de dados usando uma das implementações LDAP mais difundidas — o OpenLDAP. O servidor LDAP usa um filtro de pesquisa como o abaixo para confirmar que as credenciais de USER e PASSWORD fornecidas pelo usuário existem em uma lista de pares autorizados:
É importante observar que, por uma particularidade técnica das funções do Active Directory Application Mode (ADAM), não podemos dividir essa consulta de pesquisa em dois filtros, ou seja, usar o seguinte:
O OpenLDAP processaria apenas o primeiro filtro e ignoraria o segundo. Por isso, precisamos do operador AND (&), que garante que o filtro de pesquisa seja avaliado como TRUE quando inserimos as credenciais corretamente.
Assim, supondo que nosso par de usuário e senha exista no banco de dados, podemos nos autenticar com sucesso informando “jsmith” como usuário e “sec87pD02” como senha.
Porém, se um atacante souber apenas o nome de usuário jsmith, poderá inserir a seguinte string de ataque no campo USER da página de login:
Portanto, se não sanitizarmos a entrada do usuário antes de inseri-la na consulta de pesquisa LDAP resultante, a consulta ficaria assim:
Na prática, o atacante completou o primeiro filtro que será processado pelo servidor LDAP. Como o primeiro filtro, que usa o operador &, é avaliado como TRUE, o script ignora a senha incorreta no segundo filtro e concede acesso ao banco de dados.
O filtro de sintaxe LDAP, que consulta o diretório ativo, é um dos principais alvos dos atacantes. Agentes mal-intencionados podem usá-lo para enviar valores de string que manipulam o servidor LDAP e fazem com que ele execute consultas específicas e outras instruções LDAP. Assim, injetam comandos que exploram permissões inadequadas ou configurações incorretas no servidor LDAP. Permissões mal configuradas podem permitir que um atacante acesse o diretório LDAP e comprometa sua principal estrutura de dados: a árvore de informações do diretório. Os atacantes também podem modificar as instruções LDAP ou as aplicações web que as criam a partir das entradas do usuário.
Consequências dos ataques de injeção LDAP
A injeção LDAP é uma falha de segurança perigosa que pode permitir acesso não autorizado a aplicações e recursos, comprometendo as informações do diretório. Atacantes podem realizar ataques LDAP de diferentes maneiras, cada uma com consequências potencialmente graves.
Contornar medidas de autenticação
Um dos principais motivos para usar serviços de diretório é autorizar e autenticar usuários. O LDAP controla o acesso dos usuários a recursos e aplicações compatíveis. Para acessar uma aplicação ou um recurso, o usuário informa suas credenciais de login, como nome de usuário e senha, que o LDAP compara com os dados do diretório LDAP. Se as credenciais corresponderem, o usuário recebe autorização para acessar o recurso.
Os ataques LDAP costumam tentar contornar as verificações de senha. Agentes mal-intencionados criam uma injeção de código que faz a consulta terminar após o nome de usuário. Isso permite que os atacantes solicitem a autenticação LDAP ao servidor sem informar a senha correta. Por exemplo, um atacante pode usar os metacaracteres &, * ou | para contornar a autenticação.
Ataques de injeção LDAP para contornar o login podem ter consequências graves. Os atacantes podem obter acesso a contas de administrador, causando exposição de dados e violações de privacidade. Em última análise, esses ataques podem resultar no comprometimento total do sistema, danos à reputação e prejuízos financeiros decorrentes de processos, multas e perda de negócios.
Exposição de dados e recursos
A injeção LDAP pode permitir que atacantes divulguem, modifiquem, insiram ou excluam dados confidenciais — sobre hosts e usuários — representados na árvore LDAP. Os ataques de injeção LDAP afetam aplicações que usam filtros LDAP para disponibilizar recursos compartilhados.
Um agente mal-intencionado pode injetar código de filtro LDAP ou usar uma consulta LDAP para listar todos os recursos do diretório. Isso pode comprometer dados da empresa, inclusive informações confidenciais. Também pode levar a alterações no diretório, como exclusões ou inclusões. Depois de obter informações do diretório, um hacker pode usar dados confidenciais como moeda de troca em um ataque de ransomware.
Como reforçar a segurança das aplicações contra a injeção LDAP
A melhor maneira de evitar ataques de injeção LDAP é proteger nossas aplicações contra eles. Ao adotar as práticas recomendadas a seguir, podemos manter nossas aplicações seguras e reduzir a gravidade de qualquer possível ataque de injeção LDAP.
Valide e sanitize as entradas do usuário
A principal defesa contra ataques de injeção LDAP é validar e sanitizar as entradas. Nossa aplicação deve validar todas as entradas do usuário em uma consulta LDAP, incluindo parâmetros POST e GET, cookies e cabeçalhos HTTP. A aplicação também deve rejeitar qualquer entrada que pareça inválida. Se um campo exigir que o usuário informe um endereço de e-mail, por exemplo, você pode limitar a entrada a pontos (.), letras, números, arroba (@), sinais de mais (+), sublinhados (_) e hífens (-).
Em uma aplicação cliente-servidor, validar as entradas no lado do servidor é obrigatório. No lado do cliente, embora seja tecnicamente opcional, também é essencial. A validação no servidor impede que os usuários contornem a validação no cliente desativando o JavaScript, o que permitiria que um atacante vazasse bancos de dados e lesse ou modificasse dados. Quando as aplicações não validam as entradas do usuário, ficam vulneráveis a ataques de directory traversal, nos quais os atacantes podem ler arquivos arbitrários no servidor da aplicação.
Aplique o princípio do menor privilégio e a autorização de confiança zero ao acesso ao diretório
O princípio do menor privilégio (PoLP) é uma medida de segurança que limita os direitos de acesso dos usuários ao mínimo necessário para acessar um recurso pelo menor tempo possível. O PoLP garante que os usuários possam gravar, executar ou ler somente os recursos necessários para cumprir suas funções e responsabilidades. Isso garante a autorização de todas as consultas LDAP executadas no servidor LDAP. Para evitar a injeção LDAP, o PoLP restringe o acesso à conta LDAP que faz a vinculação ao diretório em uma aplicação.
Ao reduzir os privilégios das contas de vinculação LDAP, podemos limitar o impacto de qualquer ataque de injeção bem-sucedido. Com o modelo de confiança zero, também definimos e limitamos o período em que os administradores podem usar privilégios elevados. Além de usar senhas, considere integrar a autenticação multifator (MFA) ao LDAP. Com a MFA, os usuários LDAP precisam fornecer uma senha e um mecanismo adicional de verificação ao entrar em uma aplicação.
Escape variáveis ou a sintaxe LDAP
Outra maneira de prevenir ataques por consultas LDAP é usar funções fornecidas pelo framework e variáveis com caracteres de escape. Os atacantes podem explorar caracteres como &, *, ! e | para realizar ataques de injeção LDAP. Por isso, podemos sanitizar as entradas do usuário aplicando escape a esses caracteres especiais. A RFC 2254 traz orientações sobre como aplicar escape a valores de asserção na representação em string dos filtros de pesquisa LDAP.
Como prevenir a injeção LDAP
Os atacantes costumam se aproveitar de entradas não validadas para enganar o interpretador de consultas LDAP e fazê-lo executar consultas arbitrárias. Esse método altera a estrutura esperada da consulta LDAP, permitindo que o atacante obtenha acesso não autorizado a informações confidenciais dos usuários.
Para prevenir ataques de injeção LDAP, precisamos validar e sanitizar adequadamente as entradas, usar variáveis com caracteres de escape e aplicar as políticas de PoLP e autorização de confiança zero. Essas medidas ajudam a controlar o acesso às contas de vinculação LDAP e a minimizar os impactos de um ataque de injeção LDAP. Embora não seja possível eliminar todos os possíveis ataques de injeção LDAP, podemos adotar essas práticas recomendadas para manter nossas aplicações e os dados de seus usuários o mais seguros possível.



