Aula 17 - Análise Estática (SAST) e Dinâmica (DAST) de Código 🔍
Objetivo Pedagógico
Objetivo: Estruturar pipelines automatizados de segurança integrando Análise Estática de Segurança de Aplicações (SAST) com Semgrep/SonarQube e Análise Dinâmica (DAST) com OWASP ZAP, compreendendo suas forças e limitações complementares.
📑 1. Fundamentos Teóricos & Análise Técnica
No paradigma DevSecOps, a segurança deixa de ser uma auditoria tardia que precede a entrada em produção e passa a ser integrada continuamente no ciclo de desenvolvimento (Shift-Left Security).
A detecção de vulnerabilidades apoia-se em duas metodologias complementares de análise: 1. Static Application Security Testing (SAST - Caixa Branca): - Inspeciona diretamente o código-fonte, árvores de sintaxe abstrata (AST) e fluxos de dados (Taint Analysis) sem a necessidade de executar a aplicação. - Vantagens: Identifica a linha exata da vulnerabilidade (ex: injeção SQL, segredos expostos, deserialização insegura) nos estágios iniciais de codificação. - Limitações: Não tem visibilidade sobre vulnerabilidades de ambiente de execução, configurações de servidor ou autenticação dinâmica; suscetível a taxas de falsos positivos.
- Dynamic Application Security Testing (DAST - Caixa Preta):
- Avalia a aplicação em execução a partir de uma perspectiva externa de ataque, enviando requisições maliciosas contra endpoints HTTP/REST.
- Vantagens: Valida se uma vulnerabilidade teórica é de fato explorável no ambiente real considerando middlewares, WAF e configurações de infraestrutura; taxa de falsos positivos extremamente baixa.
- Limitações: Não aponta a linha do código-fonte onde a correção deve ser aplicada; depende da cobertura dos crawlers para descobrir todas as rotas e estados de autenticação.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
Code["Código-Fonte (Git Push)"] --> SAST["SAST (Semgrep / Sonar): Varredura de AST & Taint Flow"]
SAST --> SASTReport["Relatório de Código: Linha X vulnerável a SQLi"]
Code --> Build["Build & Container Deploy (Staging)"]
Build --> DAST["DAST (OWASP ZAP): Ataques Ativos & Fuzzing HTTP"]
DAST --> DASTReport["Relatório de Runtime: Endpoint /api vulnerável a XSS"]
SASTReport & DASTReport --> Triage["Triagem Automatizada e Quality Gate"]
Triage --> Decision{"Vulnerabilidade Crítica Encontrada?"}
Decision -- Sim --> Block["Quebra Pipeline de CI/CD"]
Decision -- Não --> Prod["Libera Deploy Seguro"]
style Code fill:#e1f5fe,stroke:#01579b
style SAST fill:#fff3e0,stroke:#e65100
style DAST fill:#f3e5f5,stroke:#7b1fa2
style Block fill:#ffebee,stroke:#c62828
style Prod fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Taint Analysis (Análise de Mancha): Rastreamento do fluxo de dados não confiáveis provenientes de entradas de usuário (Sources) até pontos críticos de execução (Sinks). - Software Bill of Materials (SBOM): Inventário sistemático de componentes de terceiros gerado para análise de composição de software (SCA). - DAST Baseado em Contexto de Autenticação: Configuração de tokens JWT e sessões automatizadas para garantir que o scanner DAST acesse áreas restritas da aplicação. - Zero-Vulnerability Tolerance Gates: Regras corporativas de conformidade que barram builds com vulnerabilidades CVSS score superior a 7.0 (High/Critical).
🛠️ 2. Implementação Prática em Segurança de Aplicações (AppSec), SAST e DAST
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// semgrep_rule_sqli.yml (Regra Declarativa Semgrep para Bloqueio de SQL Injection)
rules:
- id: python-sqli-raw-format
languages: [python]
severity: ERROR
message: "Possível SQL Injection detectado: interpolação de strings em consultas de banco de dados!"
metadata:
cwe: "CWE-89: Improper Neutralization of Special Elements used in an SQL Command"
owasp: "A03:2021 - Injection"
patterns:
- pattern-either:
- pattern: $CURSOR.execute(f"SELECT ... {$VAR} ...")
- pattern: $CURSOR.execute("SELECT ... %s ..." % $VAR)
- pattern: $CURSOR.execute("SELECT ... {}".format($VAR))
- pattern-not: $CURSOR.execute("SELECT ...", (...))
fix: $CURSOR.execute("SELECT ... WHERE id = %s", ($VAR,))
💡 Análise Passo a Passo do Código
- Casamento Estrutural via AST: Identifica padrões de risco independentemente de quebras de linha ou espaçamento cosmético no código Python.
- Filtro Negativo (
pattern-not): Previne falsos positivos ignorando chamadas que utilizam parâmetros tipados (Prepared Statements). - Sugestão de Correção Automática (
fix): Permite que ferramentas de correção automática sugiram patches seguros diretamente no Pull Request do desenvolvedor.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto