Pular para conteúdo

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.

  1. Dynamic Application Security Testing (DAST - Caixa Preta):
  2. Avalia a aplicação em execução a partir de uma perspectiva externa de ataque, enviando requisições maliciosas contra endpoints HTTP/REST.
  3. 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.
  4. 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

  1. Casamento Estrutural via AST: Identifica padrões de risco independentemente de quebras de linha ou espaçamento cosmético no código Python.
  2. Filtro Negativo (pattern-not): Previne falsos positivos ignorando chamadas que utilizam parâmetros tipados (Prepared Statements).
  3. 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