Testes de Segurança: Protegendo o Software e o Ambiente contra Vulnerabilidades
No cenário digital atual, onde os dados são um ativo valioso e as ameaças cibernéticas são constantes, a segurança se tornou um aspecto não negociável da qualidade do software. Para o Engenheiro de Qualidade, ir além dos testes funcionais e de desempenho e mergulhar nos testes de segurança é fundamental para proteger o software, os usuários e os dados. Este módulo abordará como avaliar a segurança de aplicações e ambientes, identificando e explorando vulnerabilidades comuns.
Teste de Software e Segurança do Ambiente: Uma Visão Abrangente
A segurança é uma responsabilidade compartilhada e precisa ser abordada em múltiplas camadas:
- Segurança do Software (Aplicação): Foca em identificar vulnerabilidades no código da aplicação, na lógica de negócios, nas APIs e na interação com o usuário. Os testes aqui visam explorar falhas que podem levar a acesso não autorizado, manipulação de dados, negação de serviço, etc.
- Segurança do Ambiente (Infraestrutura): Refere-se à segurança dos servidores, redes, bancos de dados, contêineres, sistemas operacionais e outras infraestruturas onde o software é executado. O Q.A. deve ter um entendimento básico de como o ambiente impacta a segurança da aplicação e como vulnerabilidades de infraestrutura podem ser exploradas. Isso inclui configurações de firewall, gerenciamento de patches, políticas de acesso, etc.
O Q.A. pode atuar como um “hacker ético” (white-hat hacker), tentando quebrar o sistema de forma controlada para encontrar pontos fracos antes que atores mal-intencionados o façam.
O Projeto OWASP Top 10: Um Guia para Vulnerabilidades Comuns
O Open Web Application Security Project (OWASP) é uma comunidade online dedicada à segurança de software. O OWASP Top 10 é um documento de referência amplamente reconhecido que lista as dez vulnerabilidades de segurança mais críticas para aplicações web. Compreendê-lo é o ponto de partida para qualquer teste de segurança:
- Quebra de Controle de Acesso: Falhas que permitem que usuários acessem recursos ou funções que não deveriam.
- Falhas Criptográficas: Dados sensíveis expostos devido a falhas em criptografia.
- Injeção: Envio de dados não confiáveis para um interpretador.
- Design Inseguro: Falhas de segurança resultantes de escolhas inadequadas de design ou arquitetura.
- Configuração de Segurança Incorreta: Configurações padrão inseguras, permissões incorretas, etc.
- Componentes Vulneráveis e Desatualizados: Uso de bibliotecas, frameworks e outros módulos com vulnerabilidades conhecidas.
- Falhas de Identificação e Autenticação: Permite que atacantes comprometam identidades de usuários.
- Falhas de Integridade de Software e Dados: Quebra de integridade devido a atualizações sem validação, CI/CD inseguro.
- Falhas de Registro e Monitoramento de Segurança: Falta de logs ou monitoramento insuficiente, dificultando a detecção e resposta a ataques.
- Falsificação de Requisições do Lado do Servidor (SSRF): Aplicações podem ser induzidas a enviar requisições para destinos arbitrários.
Para cada item do OWASP Top 10, o Q.A. deve aprender as técnicas de teste correspondentes.
Ataques de Injeção: SQL / NoSQL / Command Injection
Os ataques de injeção são uma das vulnerabilidades mais comuns e perigosas:
- Ataque de Injeção SQL: Ocorre quando um atacante insere comandos SQL maliciosos em campos de entrada de uma aplicação. Se a aplicação não filtrar ou parametrizar corretamente essas entradas, o banco de dados executa os comandos, permitindo que o atacante visualize, altere ou delete dados, ou até mesmo obtenha acesso ao sistema.
- Teste: Tentar inserir
' OR 1=1 --
,' UNION SELECT ...
, etc., em campos de login, busca ou outros formulários.
- Teste: Tentar inserir
- Ataque de Injeção NoSQL: Similar à injeção SQL, mas direcionado a bancos de dados NoSQL. As técnicas variam de acordo com o tipo de banco de dados NoSQL, mas geralmente envolvem a manipulação de consultas JSON ou outros formatos de dados esperados pelo banco de dados.
- Teste: Tentar injetar operadores de consulta NoSQL (ex:
$ne
,$gt
em MongoDB) em campos de entrada.
- Teste: Tentar injetar operadores de consulta NoSQL (ex:
- Command Injection (Injeção de Comando): Ocorre quando uma aplicação executa comandos do sistema operacional com base em entradas do usuário sem validação adequada.
- Teste: Inserir comandos de sistema (ex:
& ls
,| cat /etc/passwd
) em campos que podem ser usados para executar comandos no servidor.
- Teste: Inserir comandos de sistema (ex:
Teste de Autenticação: Verificando a Identidade do Usuário
O Teste de Autenticação foca em como a aplicação verifica a identidade dos usuários:
- Quebra de Credenciais: Tentar adivinhar senhas (força bruta, dicionário), usar credenciais padrão ou fracas.
- Contornar a Autenticação: Tentar acessar áreas restritas sem login, manipular cookies de sessão.
- Autenticação de Múltiplos Fatores (MFA): Testar a implementação do MFA, garantir que é segura e que não pode ser contornada.
- Gerenciamento de Sessão Inadequado: Verificar se tokens de sessão são previsíveis, se não expiram corretamente ou se podem ser reutilizados após o logout.
- Captura de Credenciais: Verificar se credenciais são enviadas de forma segura (HTTPS).
Teste de Autorização: Verificando Permissões de Acesso
O Teste de Autorização garante que usuários autenticados só possam acessar os recursos e funcionalidades para os quais têm permissão:
- IDOR (Insecure Direct Object Reference): Tentar acessar recursos que pertencem a outros usuários ou entidades manipulando IDs em URLs ou parâmetros (ex: alterar
user_id=123
parauser_id=456
). - Bypassing Authorization: Tentar acessar URLs ou funcionalidades restritas a outros perfis (ex: um usuário comum tentando acessar uma tela de administrador).
- Privilege Escalation: Tentar elevar privilégios de usuário (ex: de usuário comum para administrador) através de manipulação de requisições ou falhas lógicas.
Explorando Vulnerabilidades: Técnicas e Ferramentas
A exploração de vulnerabilidades pode ser feita manualmente ou com ferramentas:
- Testes Manuais/Exploratórios: Usar proxy interceptador como OWASP ZAP ou Burp Suite Community Edition para inspecionar e manipular requisições HTTP, identificando possíveis falhas de segurança.
- Scanners de Vulnerabilidade (SAST/DAST):
- SAST (Static Application Security Testing): Analisa o código-fonte em busca de padrões de vulnerabilidade antes da execução (ex: SonarQube).
- DAST (Dynamic Application Security Testing): Testa a aplicação em execução, simulando ataques externos (ex: OWASP ZAP, Burp Suite, Tenable.io).
- Ferramentas de Pentest: Kali Linux, Nmap (para escaneamento de portas), sqlmap (para injeção SQL automatizada), entre outras.
- Análise de Configuração: Revisar arquivos de configuração do servidor, banco de dados e aplicação para identificar configurações inseguras ou senhas padrão.
Para o Q.A., o foco inicial deve ser em testes de segurança funcionais, utilizando proxies e entendendo os princípios do OWASP Top 10 para identificar as vulnerabilidades mais comuns e críticas.
Atividades: Para praticar testes de segurança e exploração de vulnerabilidades:
- Execute e Relate Diferentes Explorações de Vulnerabilidades e Testes de Segurança:
- Utilize uma aplicação propositalmente vulnerável (ex: OWASP Juice Shop, OWASP WebGoat, bWAPP, ou uma API de teste com vulnerabilidades conhecidas). Nunca pratique em aplicações reais de produção sem permissão explícita.
- Foque nos ataques de injeção: Tente realizar ataques de injeção SQL ou NoSQL em campos de formulário.
- Realize testes de autenticação:
- Tente acessar áreas restritas sem login.
- Tente usar senhas comuns ou senhas fracas.
- Se possível, tente manipular cookies de sessão após o login.
- Realize testes de autorização:
- Tente o ataque de IDOR (Insecure Direct Object Reference) manipulando IDs em URLs ou parâmetros para acessar dados ou recursos de outros usuários.
- Tente elevar privilégios (se o aplicativo tiver diferentes níveis de usuário, tente acessar funcionalidades de um perfil superior com um perfil de usuário comum).
- Utilize o OWASP ZAP ou Burp Suite Community Edition como proxy para interceptar, modificar e reenviar requisições, auxiliando na exploração dessas vulnerabilidades.
- Relate suas descobertas: Para cada vulnerabilidade encontrada, descreva o tipo de ataque, os passos para reproduzi-lo, o impacto potencial e, se possível, uma sugestão de mitigação. Crie um relatório de vulnerabilidades detalhado.
Qual a importância de realizar testes de segurança continuamente no ciclo de vida de desenvolvimento de software, em vez de apenas no final do projeto?