Intermediário Aplicação e Código

Análise estática (SAST) — ferramentas, falsos positivos, integração no CI

SAST (Static Application Security Testing) examina o código-fonte — ou bytecode — sem executar a aplicação. É a primeira linha de defesa automatizada no ciclo de desenvolvimento: encontra problemas cedo, quando o custo de correção é baixo.

Como o SAST Funciona

A ferramenta percorre a árvore sintática do código e aplica regras que detectam padrões inseguros:

Código-fonte
    │
    ▼
Parser / AST (Abstract Syntax Tree)
    │
    ▼
Motor de regras (taint analysis, dataflow, pattern matching)
    │
    ▼
Relatório de achados (vulnerabilidade, linha, severidade)

Taint analysis rastreia dados de fontes não confiáveis (HTTP input) até sumidouros perigosos (query SQL, exec, eval). Se o dado chega sem sanitização, a ferramenta sinaliza.

Ferramentas Populares por Linguagem

LinguagemFerramenta gratuita/OSSFerramenta comercial
PythonBandit, SemgrepCheckmarx, Veracode
JavaScript/TSESLint security plugin, SemgrepSnyk Code
JavaSpotBugs + FindSecBugsSonarQube
GoGosec, Semgrep—
PHPPHPCS Security AuditSnyk Code
Multi-langSemgrepSonarQube, Checkmarx

Exemplo com Bandit (Python)

# Instalar
pip install bandit

# Escanear diretório
bandit -r ./src -ll

# Saída típica
>> Issue: [B608:hardcoded_sql_expressions] Possible SQL injection via string-based query construction.
   Severity: Medium   Confidence: Medium
   Location: src/db.py:42

Exemplo com Semgrep

# Instalar
pip install semgrep

# Rodar com ruleset de segurança
semgrep --config=p/owasp-top-ten ./src

# Saída
src/auth.py:87: ERROR: Use of MD5 for password hashing detected.

Falsos Positivos — Como Lidar

SAST tem taxa de falso positivo. Uma regra genérica pode acusar código seguro. Estratégias:

  1. Triagem por severidade — foque em HIGH/CRITICAL primeiro.
  2. Supressão comentada — marca o achado como aceito com justificativa no código:
result = hashlib.md5(data).hexdigest()  # nosec B324 — hash não criptográfico para cache
  1. Ajuste de regras — desabilite regras que geram ruído no contexto do projeto.
  2. Revisão humana — SAST aponta candidatos; dev confirma se é vulnerabilidade real.

Não suprima achados sem ler. Falso positivo mascarado pode esconder vulnerabilidade real.

Integração no CI/CD

O SAST deve rodar em todo pull request, bloqueando merge se encontrar achados críticos.

# .github/workflows/sast.yml
name: SAST

on: [pull_request]

jobs:
  bandit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Bandit
        run: |
          pip install bandit
          bandit -r ./src -ll --exit-zero-on-skipped -f json -o bandit-report.json
      - name: Upload report
        uses: actions/upload-artifact@v4
        with:
          name: bandit-report
          path: bandit-report.json

Para bloquear o merge em achados críticos, use --severity-level high e deixe o comando retornar código de saída não-zero.

Limites do SAST

  • Não detecta vulnerabilidades de runtime (race conditions, configuração de servidor).
  • Não testa fluxo de dados entre serviços (requer DAST ou análise manual).
  • Qualidade depende das regras: regras ruins = muito ruído ou muitas brechas.

SAST é complementar, não substitui revisão de código humana nem testes dinâmicos.