
Quality gates: SAST, dependências e tratamento de vulnerabilidades
Objetivos desta aula
- Distinguir SAST de análise de dependências
- Criar gates de segurança com critérios explícitos
- Bloquear publicação quando um gate obrigatório falha
- Tratar falsos positivos com justificativa e prazo
- Manter ferramentas e regras atualizadas
Qualidade e segurança precisam de critérios executáveis. Um pipeline que apenas imprime alertas pode continuar publicando código vulnerável. Um quality gate define quais achados reprovam a execução, quem os avalia e quais evidências permitem uma exceção.
SAST examina o código sem executar o produto. Regras podem identificar construção insegura de consultas, uso perigoso de funções e outros padrões. O resultado depende da linguagem e do conjunto de regras; semgrep scan não comprova que toda entrada do usuário está protegida.
Análise de dependências olha outro risco: pacotes diretos e transitivos podem ter vulnerabilidades conhecidas. npm audit consulta avisos do ecossistema e usa o lockfile para mapear versões. Um código próprio sem alertas SAST ainda pode importar uma biblioteca comprometida.
Severidade não é contexto completo. Examine se o componente está em produção, se o caminho vulnerável é alcançável e se há correção disponível. Uma política inicial pode bloquear avisos de severidade alta ou crítica; documente a evolução para evitar que alertas sejam ignorados em massa.
Ferramentas também fazem parte da cadeia de confiança. O exemplo pressupõe Semgrep instalado na imagem do runner pelo processo aprovado da equipe, com versão registrada. As regras p/ci são remotas e exigem acesso à rede; em uso controlado, revise e versione um conjunto local.
Falha deve ser inequívoca: --error faz achados Semgrep reprovarem a execução e --strict trata avisos de configuração como falhas. Não acrescente || true para deixar o CI verde; indisponibilidade do scanner exige investigação, não aprovação silenciosa.
Exceção é uma decisão com prazo. Para um falso positivo, registre regra, trecho, justificativa, responsável e revisão futura. Para risco real sem correção imediata, estabeleça mitigação e vencimento; uma lista de exclusões sem dono vira dívida invisível.
O gate precisa proteger o destino. Exija o check de segurança antes do merge e faça o job de publicação depender dele com needs. Mantenha testes e scan de imagem como verificações adicionais: SAST e auditoria de pacotes não cobrem configuração de runtime nem substituem revisão humana.
Na prática
.github/workflows/seguranca.yml: gates separados por responsabilidade
yaml
name: seguranca
on: [pull_request, push]
permissions:
contents: read
jobs:
dependencias:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
# Primeiro verifique o lockfile sem executar scripts de instalação.
- run: npm ci --ignore-scripts
# Inclui dependências de desenvolvimento: elas também executam no CI.
- run: npm audit --audit-level=high
sast:
# Runner efêmero, isolado e exclusivo para código confiável interno.
# A imagem aprovada deve conter Semgrep com versão fixada e Python.
runs-on: [self-hosted, linux, semgrep-ephemeral]
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: semgrep --version
# Em produção, prefira regras locais revisadas e versionadas.
- run: semgrep scan --config p/ci --error --strict .Reproduzir a triagem sem aplicar correções cegamente
bash
# Execute no ambiente aprovado, com as mesmas versões usadas no CI.
# npm audit retorna código diferente de zero quando encontra riscos.
npm audit --json > audit.json
# Consulte cadeias de dependências antes de escolher uma atualização.
npm explain nome-do-pacote
# Para regras revisadas em .semgrep/, gere evidência local de SAST.
semgrep scan --config .semgrep/ --error --strict --json --output semgrep.json .
# Não aplique npm audit fix --force sem revisar mudanças e rodar testes.Por que isso importa
Gates independentes encontram classes diferentes de falhas e impedem que um alerta conhecido acompanhe o artefato até produção sem avaliação.
Erro comum
Usar || true em scanners obrigatórios ou executar npm audit fix --force sem avaliar mudanças incompatíveis.
Dica de produção
Fixe actions por SHA revisado, mantenha runners efêmeros e versione regras; exija que publicação aguarde todos os gates obrigatórios.
Alerta de segurança
Nunca execute PRs públicos não confiáveis em runners self-hosted com acesso interno; use runners hospedados isolados ou uma infraestrutura efêmera sem secrets e sem acesso à rede corporativa.
Pergunta de entrevista
Qual a diferença entre um alerta SAST e uma vulnerabilidade de dependência, e como você trataria uma exceção em cada caso?
Glossário
- SAST
- Análise estática de código para identificar padrões potencialmente inseguros.
- SCA
- Análise de componentes e dependências, incluindo vulnerabilidades conhecidas.
- quality gate
- Critério automatizado que permite ou impede avançar no fluxo de entrega.
- falso positivo
- Alerta que, após avaliação, não representa a falha indicada naquele contexto.
- dependência transitiva
- Pacote incluído indiretamente por outra dependência do projeto.
Conexão com o CloudShop
Bloquear o merge e a publicação do CloudShop quando SAST ou auditoria de dependências violarem a política definida.
Quiz da aula
1. Qual análise procura padrões inseguros no código próprio?
2. Qual é o problema de scanner || true em um gate obrigatório?
3. Como tratar um falso positivo de forma responsável?
Minhas anotações
Salvo automaticamente neste navegador.
