SAST: análise estática de segurança no código

1. O que é SAST e por que desenvolvedores devem se importar

SAST (Static Application Security Testing) é uma técnica de teste de segurança que analisa o código-fonte, bytecode ou binários de uma aplicação sem executá-la. Diferentemente do DAST (Dynamic Application Security Testing), que testa a aplicação em execução, e do IAST (Interactive Application Security Testing), que combina elementos de ambos, o SAST examina o código estaticamente, identificando padrões inseguros antes mesmo da compilação.

O SAST é peça fundamental na estratégia "Shift Left" — mover a segurança para as fases iniciais do desenvolvimento. Quando um desenvolvedor descobre uma vulnerabilidade durante a codificação, o custo de correção é drasticamente menor do que se ela fosse encontrada em produção. Estudos indicam que corrigir um problema de segurança durante a implementação custa até 30 vezes menos do que corrigi-lo após o lançamento.

Para desenvolvedores, os benefícios são diretos:
- Detecção precoce: vulnerabilidades são encontradas enquanto o código ainda está sendo escrito
- Redução de custos: menos retrabalho e correções emergenciais
- Conformidade: ajuda a atender requisitos de padrões como OWASP Top 10, PCI-DSS e ISO 27001

2. Tipos de vulnerabilidades detectadas por ferramentas SAST

Ferramentas SAST são capazes de identificar uma ampla gama de vulnerabilidades. Vejamos as categorias mais comuns:

Injeção de código

// Exemplo de SQL Injection detectado por SAST
String query = "SELECT * FROM usuarios WHERE email = '" + email + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
// SAST alerta: uso de concatenação em query SQL
// Exemplo de XSS detectado por SAST
app.get("/busca", (req, res) => {
  const termo = req.query.q;
  res.send("<h1>Resultados para: " + termo + "</h1>");
  // SAST alerta: saída não sanitizada de entrada do usuário
});

Gerenciamento de segredos

# Exemplo de hardcoded credentials detectado por SAST
API_KEY = "sk-1234567890abcdef"
DB_PASSWORD = "senha_super_secreta"
# SAST alerta: credenciais hardcoded no código-fonte

Configurações inseguras

// Exemplo de criptografia fraca detectado por SAST
MessageDigest md = MessageDigest.getInstance("MD5");
// SAST alerta: MD5 é considerado inseguro para hash de senhas
# Exemplo de permissões inseguras
app.use(express.static('public'));
app.disable('x-powered-by');
# SAST alerta: falta de headers de segurança como Content-Security-Policy

3. Integração do SAST no fluxo de desenvolvimento

A integração do SAST em pipelines de CI/CD é essencial para automatizar a segurança. Aqui estão exemplos práticos:

GitHub Actions

name: SAST Scan
on:
  pull_request:
    branches: [main]

jobs:
  sast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Semgrep SAST
        uses: semgrep/semgrep-action@v1
        with:
          config: p/owasp-top-ten
          audit_on: push

GitLab CI

sast:
  stage: test
  script:
    - semgrep --config=auto --error .
  only:
    - merge_requests
  allow_failure: false  # Bloqueia merge se encontrar vulnerabilidades críticas

Estratégias de fail/pass: para pull requests, configure o bloqueio apenas para vulnerabilidades de severidade alta ou crítica. Vulnerabilidades médias podem gerar alertas sem bloquear, permitindo que a equipe priorize sem paralisar o desenvolvimento.

4. Escolhendo e configurando ferramentas SAST

Critérios de seleção

  • Linguagens suportadas: verifique se a ferramenta cobre as linguagens do seu stack
  • Taxa de falsos positivos: ferramentas com muitas regras genéricas podem gerar ruído
  • Licenciamento: open-source (Semgrep, SonarQube Community) vs. comercial (Checkmarx, Snyk Code)
  • Customização: capacidade de criar regras específicas para seu domínio

Exemplos práticos

Semgrep: ferramenta open-source com regras customizáveis

# Regra customizada para detectar debug em produção
rules:
  - id: no-debug-production
    patterns:
      - pattern: console.log(...)
      - pattern: print(...)
    message: "Remova logs de debug antes do deploy"
    languages: [javascript, python]
    severity: WARNING

SonarQube: análise contínua com qualidade de código e segurança

# Configuração de quality gates no SonarQube
sonar.exclusions=**/generated/**
sonar.security.sources=java,js,ts
sonar.security.auditors=owasp

5. Interpretando e tratando resultados do SAST

Como ler relatórios

Um relatório SAST típico contém:

Vulnerabilidade: SQL Injection
Severidade: CRÍTICA (CVSS 9.8)
CWE: CWE-89
Arquivo: src/dao/UsuarioDAO.java
Linha: 45
Código: String query = "SELECT * FROM usuarios WHERE id = " + id;
Sugestão: Use prepared statements ou consultas parametrizadas

Priorização de vulnerabilidades

Use a matriz de priorização:
- CVSS 9.0-10.0: Corrigir imediatamente (bloqueia merge)
- CVSS 7.0-8.9: Corrigir no mesmo sprint
- CVSS 4.0-6.9: Agendar para próximo sprint
- CVSS 0-3.9: Aceitar risco ou marcar como falso positivo

Estratégias de remediação

// Antes - vulnerável
String query = "SELECT * FROM usuarios WHERE id = " + id;

// Depois - corrigido
String query = "SELECT * FROM usuarios WHERE id = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, id);

6. Limitações e armadilhas comuns do SAST

Falsos positivos e negativos

Ferramentas SAST podem gerar falsos positivos quando não compreendem o contexto completo da aplicação. Por exemplo:

// Falso positivo comum: sanitização indireta
function getUser(id) {
  // SAST alerta: possível SQL Injection
  // Mas id já foi sanitizado pelo framework ORM
  return db.query("SELECT * FROM users WHERE id = ?", [id]);
}

Limitações em linguagens dinâmicas

JavaScript e Python, por serem dinamicamente tipados, apresentam desafios:

# Python: SAST pode não detectar injeção via eval()
user_input = request.form['code']
result = eval(user_input)  # SAST pode perder se eval estiver encapsulado

Cobertura incompleta

SAST não cobre:
- Vulnerabilidades em dependências de terceiros (use SCA - Software Composition Analysis)
- Configurações de runtime (use DAST)
- Lógica de negócio complexa (use code review manual)

7. SAST como parte de uma estratégia de segurança holística

Combinação com outras práticas

Uma estratégia completa de segurança para devs inclui:

Pipeline de Segurança Integrado:

1. SAST (análise estática) → durante commits e PRs
2. SCA (análise de dependências) → verificação de bibliotecas
3. DAST (testes dinâmicos) → em ambientes de staging
4. Code Review Manual → para lógica crítica
5. Pentest → antes de releases importantes

Criando uma cultura de segurança

  • Treinamento: workshops semanais sobre vulnerabilidades comuns
  • Automação de feedback: notificações no Slack/Discord quando SAST encontra issues
  • Métricas: acompanhe redução de vulnerabilidades ao longo do tempo
Métricas de sucesso:
- Vulnerabilidades críticas encontradas antes do merge: +40% no primeiro trimestre
- Tempo médio de correção (MTTR): de 7 dias para 2 dias
- Falsos positivos reportados: redução de 60% após customização de regras

Referências

  • Semgrep Documentation — Documentação oficial da ferramenta SAST open-source Semgrep, com guias de regras, integrações e exemplos práticos
  • SonarQube Security Analysis — Guia oficial sobre análise de segurança no SonarQube, incluindo regras OWASP e CWE
  • OWASP Static Analysis — Recurso da OWASP sobre análise estática, com boas práticas e ferramentas recomendadas
  • Snyk Code Documentation — Documentação oficial do Snyk Code para análise SAST, com exemplos de integração em CI/CD
  • GitLab SAST Documentation — Guia completo de implementação de SAST no GitLab CI, incluindo configuração de regras e análise de resultados
  • Checkmarx Documentation — Documentação técnica da ferramenta Checkmarx SAST, com guias de customização e integração
  • CWE - Common Weakness Enumeration — Catálogo oficial de fraquezas de software usado como base por ferramentas SAST para classificação de vulnerabilidades