# Vulnerabilidade (computação)

Em segurança de computadores, uma vulnerabilidade ou falha de segurança é uma fraqueza que permite que um atacante reduza a garantia da informação (Integridade) de um sistema. Vulnerabilidade é a interseção de três elementos: uma suscetibilidade ou falha do sistema, acesso do atacante à falha e a capacidade do atacante de explorar a falha. Para explorar uma vulnerabilidade, uma atacante deve ter pelo menos uma ferramenta ou técnica aplicável que possa conectar a uma fraqueza do sistema. Desta forma, vulnerabilidade também é conhecida como superfície de ataque.

## Conceitos

Vulnerabilidade é definida como uma condição que, quando explorada por um atacante, pode resultar em uma violação de segurança. Exemplos de vulnerabilidades são falhas no projeto, na implementação ou na configuração de programas, serviços ou equipamentos de rede. Um ataque de exploração de vulnerabilidades ocorre quando um atacante, utilizando-se de uma vulnerabilidade, tenta executar ações maliciosas, como invadir um sistema, acessar informações confidenciais, disparar ataques contra outros computadores ou tornar um serviço inacessível.
Gerenciamento de vulnerabilidade é a prática cíclica de identificar, classificar, remediar e mitigar vulnerabilidades. Esta prática geralmente refere-se a vulnerabilidades de software nos sistemas de computador.
Esta mesma pode ser explorada em um determinado sistema ou serviço vulnerável que esteja rodando na máquina.
As vulnerabilidades mais exploradas nos dias de hoje, são as do tipo buffer overflow, que muitas vezes pode dar privilégios de administrador para o invasor, rodar códigos maliciosos remotamente, burlar particularidades de cada sistema, ataques de Negação de Serviços (DDoS), e acesso irrestrito ao sistema.
Além dessas, outra vulnerabilidade bastante recorrente nos sistemas é a enumeração de usuários. Essa vulnerabilidade será apresentada a seguir.

## Vulnerabilidade: enumeração de usuários

A enumeração de usuário é uma prática utilizada para identificar os usuários ativos em um determinado sistema. Geralmente ela é utilizada para viabilizar ataques de Força bruta. A constatação da vulnerabilidade se dá através da possibilidade de discernir entre usuário válidos e inválidos em uma aplicação. Existem várias falhas nas aplicações que permitem a exploração dos usuários, no entanto, esse tipo de falha é mais comum ser encontradas nos mecanismo de autenticação.
Comumente, um atacante irá interagir com o mecanismo de autenticação da aplicação na tentativa de identificar o comportamento do sistema em resposta às requisições efetuadas em diferentes cenários de autenticação, por exemplo, utilizando um usuário válido e outro inválido. Em alguns casos, as aplicações fornecem respostas que revelam se um determinado usuário existe na base de dados quando uma credencial inválida é utilizada na requisição de autenticação.
Os testes de enumeração de usuários valida se a aplicação fornece, direta ou indiretamente, alguma informação que permita a distinção entre usuários válidos de uma aplicação. Abaixo serão apresentadas algumas abordagens que podem ser utilizadas para nortear os testes no sentido de verificar a vulnerabilidade da aplicação quanto à segurança da informação.
Cenários de teste para a enumeração de usuários com base nas respostas das páginas
    Autenticação com um usuário válido e senha válida
       Registre a resposta fornecida pela aplicação quando um usuário válido e uma senha correta sejam utilizados no request da autenticação. Verifique o tamanho e a resposta do servidor;
    Autenticação com um usuário válido e senha inválida
       Nesse cenário, o tester deve utilizar um usuário válido e uma senha inválida e registrar a resposta de erro enviada pelo servidor para analisar o comportamento da aplicação para esse caso. Geralmente as aplicações apresentam mensagens como: “Falha na autenticação”; “Senha inválida”. Verifique o tamanho e a resposta do servidor
    Autenticação com um usuário inválido
       Nesse outro cenário, o tester deve utilizar um usuário inválido e senha inválida e registrar o response do servidor. Geralmente as aplicações apresentam mensagens como: “Usuário inválido”; “Login não encontrado”; “Conta inválida”. Verifique o tamanho e a resposta do servidor;
    Uma aplicação bem implementada deve retornar o mesmo tamanho e a mesma mensagem de erro para requisições de autenticação inválida. Caso o tester perceba que a aplicação apresenta tamanho e códigos de resposta diferentes para cenários de requisições mal sucedidas de autenticação, como nos cenários 2 e 3 acima, é indícios de vulnerabilidade na aplicação
       Exemplo de indicio de vulnerabilidade:
          Request: Usuário Válido / Senha Inválida
             Response: “Senha incorreta” (tamanho: 1500)
          Request: Usuário Inválido / Senha Inválida
             Response: “Usuário não encontrado” (tamanho: 1780)
    No exemplo acima é perceptível que no primeiro request a aplicação revela que o usuário é válido (portanto existente na base de dados) já que a resposta identifica que apenas a senha estava incorreta. O segundo response também revela claramente que o usuário requisitado não é válido. Com essas informações já é possível a um atacante interagir com a aplicação realizando requests com nomes variados de usuários para verificar qual deles a aplicação irá identificar como usuário válido (com base no response retornado).
Enumeração de usuários com base nos códigos de erros das páginas de login
Algumas aplicações web apresentam códigos de erros ou mensagens específicas que podem ser analisadas pelos atacantes;
Enumeração de usuários com base em URLs
Algumas aplicações web realizam redirecionamento de página quando falhas de autenticação acontecem. As URLs utilizadas para redirecionamentos podem ser analisadas para identificar os usuários válidos.
       Exemplo de indicio de vulnerabilidade:
          Usuário Válido / Senha Inválida:
             http:// www.teste.com/err.jsp?User=usuario&Error=0
          Usuário Inválido / Senha Inválida:
             http:// www.teste.com/err.jsp?User=usuario&Error=2
Enumeração de usuários com base nos códigos de respostas do servidor (Response Code)
Geralmente os servidores de aplicação, quando não são configurados de forma adequada, acabam apresentando mensagem de erro padrão para requisição recursos/diretórios. Esses response na maioria das vezes são:
    “403 Forbidden”, para indicar que o recurso existe, porém não há permissão suficiente para que a requisição possa acessá-lo;
    Ou
    “404 Not found”, para indicar que o recurso não existe.
Algumas aplicações são desenvolvidas utilizando princípios REST, permitindo assim que os recursos da aplicação, como a conta do usuário, possam ser associados à URLs. (Exemplo: A URL http:// www.teste.com.br/usuario01 faz referencia à conta do usuário 01). Dessa forma, um atacante pode utilizar os response code retornado pelo servidor para enumerar os usuários da aplicação.
       Exemplo de indicio de vulnerabilidade:
          Usuário Válido:
             Request: http:// www.teste.com/usuario01
                Response: 403 Forbidden
          Usuário Inválido:
             Request: http:// www.teste.com/usuario01
                Response: 404 Not Found
No primeiro caso o usuário existe mas a página não é exibida visto que o servidor responde com o código ”403 Forbidden”. Já no segundo caso, o código ”404 Not Found” indica que o usuário não existe na base da aplicação. Com essas informações é possível a enumeração dos usuários da aplicação por um atacante.
Nota: Nem sempre o servidor apresenta um response code 404 Not Found quando um recurso não existente for solicitado. Ao invés, ele responde com o response code 200 OK mas com um imagem que representa o erro. Para esses casos, um atacante atente associará a imagem de erro à um usuário não existente. Esse mesmo raciocínio pode ser utilizado para qualquer resposta enviado pelo servidor, bastando diferenciar qual tipo de resposta representa um usuário válido e qual representa um usuário inválido.
Enumeração de usuários com base nas funcionalidades de recuperação de senha
Aplicações que disponibilizam funcionalidades de recuperação de senhas, muitas vezes permitem que os usuários possam ser enumerados com base nas mensagens que apresentam:
       Exemplo de indicio de vulnerabilidade:
          Usuário Válido / Senha Inválida:
             Mensagem: “Sua nova senha foi enviada com sucesso para o email cadastrado”
          Usuário Inválido / Senha Inválida:
             Mensagem: “O email informado não foi encontrado”

## Ferramentas para exploração de vulnerabilidades

Existem ferramentas específicas para se explorar as vulnerabilidades, cada ferramenta para a sua respectiva vulnerabilidade a ser explorada (na maioria das vezes escritas em linguagem C e Assembly), essas ferramentas são chamadas de exploits.