🛠️ Atividades

🔒 Atividade 18: Segurança no Desenvolvimento e OWASP

Bem-vindo a mais uma etapa crítica da sua jornada na Engenharia de Software! Até aqui, aprendemos a modelar, testar, automatizar e containerizar sistemas. Mas de que adianta um sistema incrivelmente rápido, com CI/CD verde e rodando em Docker, se ele puder ser facilmente invadido por um hacker, vazando dados confidenciais dos usuários? 😱🔓

Hoje, mergulharemos no universo do DevSecOps e do Desenvolvimento Seguro (Secure by Design). Aprenderemos a analisar vulnerabilidades antes mesmo de escrevermos o código, utilizando a metodologia de modelagem de ameaças STRIDE e as diretrizes internacionais da OWASP.


🎯 Objetivo da Aula

Ao final desta atividade, você será capaz de:

  • Compreender a importância da segurança proativa no ciclo de desenvolvimento de software.
  • Aplicar a metodologia STRIDE para identificar ameaças na arquitetura do sistema.
  • Identificar as principais falhas do OWASP Top 10 (como Injection e Broken Authentication).
  • Implementar defesas de código e configurações seguras em Java 17 e Spring Boot.

🏢 O Cenário Prático (Seu Desafio)

Na TecProExpress, a segurança costumava ser vista como "problema do pessoal de redes" ou "algo para olhar depois que o software estiver pronto". Essa mentalidade cobrou seu preço: na semana passada, um motorista mal-intencionado conseguiu manipular o parâmetro id na URL da API e visualizou os dados pessoais de entrega e faturamento de outros clientes. Além disso, a tela de busca de fretes sofreu um ataque de injeção de SQL que quase apagou a tabela de produtos!

"Seu desafio como Engenheiro de Segurança de Aplicações (AppSec) é blindar a arquitetura da TecProExpress. Você conduzirá uma modelagem de ameaças STRIDE e programará mecanismos de proteção no Spring Boot para barrar ataques de injeção de código e vazamento de dados de autorização de forma definitiva."


🧠 Fundamentos: A Teoria Traduzida

1. A Metodologia STRIDE (Modelagem de Ameaças)

Criada pela Microsoft, serve para mapear o que pode dar errado em um sistema com base em seis pilares fundamentais:

  • Spoofing (Falsificação de identidade): Alguém fingindo ser outro usuário.
  • Tampering (Adulteração de dados): Modificar dados em trânsito ou no banco.
  • Repudiation (Repúdio): Um usuário alegar que não realizou uma ação por falta de logs auditáveis.
  • Information Disclosure (Vazamento de informações): Expor dados confidenciais a pessoas não autorizadas.
  • Denial of Service (Negação de Serviço): Derrubar o sistema por sobrecarga de requisições.
  • Elevation of Privilege (Elevação de privilégio): Um usuário comum executando funções de administrador.

2. OWASP Top 10

A Open Worldwide Application Security Project (OWASP) é uma fundação global sem fins lucrativos que mapeia e publica regularmente as 10 vulnerabilidades de segurança mais críticas e recorrentes em aplicações web no mundo todo.

📊 Vetores de Ataque Comuns vs Defesa Ativa


📖 Exemplo Guiado: Codificação Segura e Defesa Ativa

Vamos analisar um exemplo de código vulnerável em Spring Boot e como corrigi-lo imediatamente usando boas práticas de programação.

1. Evitando a Injeção de SQL (SQL Injection)

Cenário vulnerável (O que NÃO fazer): Concatenar strings diretamente na consulta SQL permite que o atacante envie comandos maliciosos na variável input.

// VULNERÁVEL! Permite SQL Injection
public List<Pedido> buscarPedidosPorCidade(String input) {
    String query = "SELECT * FROM pedidos WHERE cidade = '" + input + "'";
    return entityManager.createNativeQuery(query, Pedido.class).getResultList();
}

Se o atacante passar o valor Joinville' OR '1'='1, a query executará retornando todos os pedidos do banco de dados!

Cenário Seguro (Como implementar): Usar consultas parametrizadas (Prepared Statements) ou Spring Data JPA, que higienizam as entradas automaticamente.

// SEGURO! Parâmetros higienizados pelo JPA/Hibernate
public List<Pedido> buscarPedidosPorCidadeSeguro(String input) {
    String query = "SELECT p FROM Pedido p WHERE p.cidade = :cidade";
    return entityManager.createQuery(query, Pedido.class)
                        .setParameter("cidade", input)
                        .getResultList();
}

2. Proteção de Acesso com Spring Security

Configuração para restringir privilégios em endpoints sensíveis da API (Evitando elevação de privilégios e Broken Access Control):

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable()) // CSRF desabilitado apenas para fins didáticos de API
            .authorizeHttpRequests(auth -> auth
                // Endpoints públicos
                .requestMatchers("/api/public/**").permitAll()
                // Apenas motoristas autenticados podem ver entregas
                .requestMatchers("/api/entregas/**").hasRole("MOTORISTA")
                // Apenas gerentes podem deletar registros ou ver relatórios
                .requestMatchers("/api/admin/**").hasRole("GERENTE")
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults()); // Autenticação básica simples
        
        return http.build();
    }
}

🛠️ Prática Obrigatória 1: Matriz de Ameaças STRIDE

Cenário: Analisando a segurança do seu projeto de grupo.

  1. Crie uma tabela Markdown contendo uma análise de ameaças do seu sistema utilizando a metodologia STRIDE.
  2. Mapeie pelo menos 3 das 6 letras do STRIDE aplicadas ao seu projeto real.
  3. Preencha as colunas: Elemento do Sistema (ex: Tela de Login), Ameaça Identificada (ex: Usuário interceptar tráfego) e Mitigação Proposta (ex: Uso obrigatório de HTTPS e senhas salvas com Hash BCrypt).

🛠️ Prática Obrigatória 2: Higienização de Código

Cenário: Identificação e correção de falhas de segurança no código.

  1. Crie um arquivo Markdown demonstrando um trecho de código hipotético ou real do seu sistema que seja vulnerável a Injeção de SQL ou Falha de Autorização.
  2. Apresente, logo abaixo, a versão corrigida desse código (Refatoração de Segurança), explicando qual técnica foi aplicada para eliminar a vulnerabilidade.

📤 Instruções de Entrega (Microsoft Teams)

Após auditar e implementar as melhorias de segurança:

  1. Salve a sua matriz de ameaças e os trechos de código com o nome Atividade_18.md na pasta es-atv-18-seguranca-devsecops/ do seu repositório GitHub.
  2. Certifique-se de fazer o commit e push para o repositório público.
  3. Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.

💡 Checkpoint de Lógica

Importante:Reflexão Profissional: Suponha que seu sistema utilize criptografia reversível (como AES) para salvar as senhas dos usuários no banco de dados, em vez de um algoritmo de hash criptográfico não-reversível (como BCrypt ou PBKDF2). Se um invasor conseguir acesso de leitura à tabela de usuários, por que salvar senhas com criptografia AES é perigoso? O que o invasor precisaria obter para ler todas as senhas em texto puro? (Resposta: A criptografia AES é bidirecional (simétrica), o que significa que se houver a chave de criptografia, o dado pode ser totalmente descriptografado para texto original. Se o invasor acessar o banco de dados e obter a chave de descriptografia que geralmente fica salva no código ou nas variáveis de ambiente do servidor, ele conseguirá reverter todas as senhas. Algoritmos de Hash como o BCrypt são unidirecionais e usam a técnica de Salting, tornando matematicamente impossível reverter o hash de volta à senha original, garantindo proteção mesmo que o banco de dados seja roubado). 🛡️🔑🧠

📊 Rubrica Formativa de Avaliação

Critério de Avaliação Insuficiente (0% - 40%) Regular (41% - 70%) Excelente (71% - 100%)
Modelagem de Ameaças (STRIDE) Tabela STRIDE ausente ou sem relação com os módulos do sistema. Preenche 3 letras da matriz STRIDE mas com mitigações genéricas. Matriz de Ameaças STRIDE completa identificando vulnerabilidades reais de arquitetura e mitigação técnica sólida (ex: HTTPS, BCrypt, RBAC).
Refatoração de Segurança & Prepared Statements Não consegue identificar trechos vulneráveis a SQL Injection ou Broken Access Control. Identifica a vulnerabilidade mas refatora sem usar consultas parametrizadas. Demonstração impecável de código vulnerável vs. código refatorado seguro utilizando Prepared Statements/JPA e Spring Security RBAC.
Entrega no GitHub Entrega fora da pasta `es-atv-18-seguranca-devsecops/`. Arquivo entregue sem os blocos de código formatados. Submete `Atividade_18.md` com tabelas STRIDE e trechos de código limpos e documentados no repositório.
Copyright © 2026