Segurança no pipeline CI/CD significa tratar vulnerabilidades como defeitos de código — descobertos e corrigidos antes do deploy, não depois de um incidente. Essa abordagem, chamada de shift-left, move os controles de segurança para as etapas mais iniciais do ciclo de desenvolvimento, onde o custo de correção é entre 10 e 100 vezes menor do que em produção.

Por que o pipeline é uma superfície de ataque crítica

O pipeline CI/CD tem acesso privilegiado a praticamente tudo: repositório de código, credenciais de cloud, registry de containers, ambientes de staging e produção. Um atacante que compromete o pipeline não precisa explorar a aplicação — ele controla o processo que gera a aplicação. Os casos SolarWinds (2020) e 3CX (2023) demonstraram que código malicioso injetado na etapa de build pode ser assinado e distribuído como legítimo para milhares de clientes sem nenhum alarme. No SolarWinds, o artefato comprometido passou por verificação de assinatura e foi distribuído por canal oficial de atualização. No 3CX, uma dependência de terceiros contaminada foi suficiente para comprometer o instalador oficial assinado. Esses ataques de supply chain tornaram a segurança do pipeline uma prioridade equivalente à segurança da aplicação em si.

As quatro camadas de análise: SAST, SCA, DAST e IaC

Técnica O que analisa Quando executa Exemplos de ferramentas
SAST Código-fonte da aplicação (sem execução) Commit / Pull Request Semgrep, CodeQL, Checkmarx, SonarQube
SCA Dependências de terceiros (CVEs, licenças) Commit / Pull Request Snyk, OWASP Dependency-Check, Dependabot, Grype
DAST Aplicação em execução (staging) Após deploy em staging OWASP ZAP, Nuclei, Burp Suite Enterprise
IaC Scanning Infraestrutura como código (Terraform, K8s) Commit com mudança de infra Checkov, KICS, Terrascan, tfsec
Container Scanning Imagens Docker (OS packages, CVEs) Build da imagem, antes do push Trivy, Grype, Snyk Container
Secret Scanning Credenciais e tokens no código Primeiro job do pipeline Gitleaks, Trufflehog, GitHub Secret Scanning

SAST: encontrando o que você criou de errado

Static Application Security Testing lê o código sem executá-lo, construindo um modelo do fluxo de dados e do grafo de chamadas para detectar padrões inseguros. SAST encontra injeção SQL quando uma variável não sanitizada chega a uma query, XSS quando entrada do usuário é renderizada sem escaping, uso de algoritmos criptográficos obsoletos (MD5, DES), referências a funções perigosas (strcpy, eval, exec) e configurações hardcoded como credenciais no código. O ponto fraco do SAST é a taxa de falsos positivos — ferramentas mais antigas geram ruído que desacredita o processo. A solução é usar ferramentas baseadas em regras semânticas com baixo FP (Semgrep, CodeQL) e configurar um baseline na primeira execução: todo resultado existente é aceito como dívida técnica conhecida, e o gate bloqueia apenas novos achados introduzidos no PR em revisão.

SCA: o risco que você importou

Software Composition Analysis resolve um problema crescente: a maior parte do código de uma aplicação moderna não foi escrita pelo time — são bibliotecas open source. O npm de uma aplicação Node.js típica puxa 500 a 2.000 pacotes transitivos. SCA mapeia o grafo completo de dependências, cruza com bases de CVEs (NVD, GitHub Advisory Database, OSV) e sinaliza: qual pacote está vulnerável, qual versão corrige, e se existe uma versão compatível no grafo atual. Além de CVEs, SCA verifica licenças — uma dependência GPL em um produto proprietário pode gerar passivo jurídico significativo. A integração com o pipeline deve incluir monitoramento contínuo: uma dependência que era segura na semana passada pode ter um CVE publicado hoje, sem nenhuma mudança de código da sua parte.

DAST: confirmando o que ainda é explorável

Dynamic Application Security Testing age como um pesquisador de segurança externo: interage com a aplicação em execução, envia payloads maliciosos e observa o comportamento. DAST encontra o que SAST não encontra — falhas que emergem apenas em runtime, como configurações de servidor incorretas, headers de segurança ausentes (CSP, HSTS, X-Frame-Options), endpoints não documentados que escaparam da análise estática, e vulnerabilidades de lógica de negócio que dependem de sequências de requisições. O desafio do DAST em pipelines automatizados é o tempo de execução e a cobertura: um crawl completo pode levar horas. A solução prática é uma suite de testes DAST direcionada — executada contra os endpoints críticos definidos na especificação OpenAPI da aplicação — e uma varredura passiva ampla que não injeta payloads e por isso não causa efeitos colaterais em dados de teste.

Poisoned Pipeline Execution: o ataque ao próprio CI

Poisoned Pipeline Execution (PPE) é uma classe de ataques catalogada por pesquisadores da Cider Security em 2021. A premissa é simples: se um atacante pode modificar o arquivo de definição do workflow (como .github/workflows/ci.yml) em um contexto onde o pipeline tem acesso a secrets de produção, ele pode exfiltrar credenciais, modificar artefatos durante o build ou escalar privilégios para o registry e a cloud. Esse acesso pode vir de um PR externo (fork), de uma branch sem proteção, ou de uma dependência de action de terceiro comprometida. A mitigação exige múltiplos controles: workflows de PRs externos devem usar o evento pull_request (sem secrets de produção) em vez de pull_request_target; actions de terceiros devem ser fixadas por hash de commit imutável, não por tag semântica que pode ser reescrita silenciosamente; o GITHUB_TOKEN deve ter permissões mínimas declaradas explicitamente; e autenticação para cloud deve usar OIDC em vez de credenciais estáticas armazenadas em variáveis de ambiente.

Assinatura de artefatos e o framework SLSA

A resposta técnica aos ataques de supply chain é garantir provenance verificável — evidência criptográfica de que um artefato específico foi produzido por um processo específico a partir de um commit específico. O framework SLSA (Supply-chain Levels for Software Artifacts, pronunciado salsa), mantido pela Linux Foundation e apoiado por Google, GitHub e outros, define quatro níveis de maturidade. SLSA 1 exige provenance gerado automaticamente. SLSA 2 adiciona assinatura criptográfica da provenance. SLSA 3 requer que o build seja executado em infraestrutura controlada e auditável, e que a provenance seja gerada pelo próprio sistema de build de forma não-falsificável. SLSA 4 (ainda em desenvolvimento) adiciona builds herméticos e reproduzíveis. A implementação prática usa Sigstore — um projeto open source que oferece assinatura sem gerenciamento de chaves privadas, usando certificados efêmeros vinculados a identidades OIDC — e Cosign para assinar e verificar imagens de container. Com SLSA 3 + Cosign, um sistema de deploy pode recusar qualquer imagem cuja provenance assinada não bata com o repositório e commit esperados, tornando ataques como o do SolarWinds detectáveis antes da distribuição.

Least privilege nos runners: o princípio mais negligenciado

Runners de CI são máquinas com acesso privilegiado que executam código arbitrário a cada push. Apesar disso, a maioria das organizações concede a eles permissões amplas de cloud, registry e secrets. O modelo de least privilege para runners exige: (1) usar OIDC para autenticação cloud — o runner obtém um token temporário de escopo mínimo por job, sem credenciais persistentes; (2) separar ambientes por branch — runners de PRs externos não acessam secrets de staging, apenas runners de merges na branch principal o fazem; (3) isolar runners de produção em rede separada, sem rota de saída para a internet exceto endpoints específicos; (4) usar efêmeros — runners destruídos após cada job, sem estado persistente que possa ser comprometido entre execuções; (5) auditar regularmente as permissões de IAM atribuídas a cada role de runner com ferramentas como AWS IAM Access Analyzer ou GCP IAM Recommender.

Security gates: bloqueio sem paralisar o desenvolvimento

Um security gate é uma condição de parada que impede o avanço do pipeline quando um critério de segurança não é atendido. A implementação ingênua — bloquear qualquer CVE ou qualquer achado de SAST — paralisa o desenvolvimento no primeiro dia. A implementação eficaz usa três critérios: severidade (bloquear apenas crítico/alto com fix disponível), novidade (diff-based alerting: bloquear apenas achados introduzidos no PR, não dívida técnica histórica) e prazo (achados médios viram tickets com SLA de 30 dias, baixos entram no backlog trimestral). Esse modelo permite que o time avance sem acumular novas vulnerabilidades enquanto trata a dívida existente de forma estruturada. A métrica de acompanhamento é o MTTR por severidade — Mean Time to Remediate — que deve ser monitorada e reportada mensalmente para evidenciar maturidade do programa de segurança.

Referências normativas

A implementação de DevSecOps em ambientes regulados deve se alinhar a: OWASP DevSecOps Guideline (owasp.org/www-project-devsecops-guideline), que mapeia controles de segurança para cada fase do SDLC; NIST SSDF — Secure Software Development Framework (SP 800-218), referência do governo norte-americano adotada por contratos federais e crescentemente exigida em contratos enterprise no Brasil; SLSA (slsa.dev) para integridade da cadeia de suprimentos; e, no contexto brasileiro, a Resolução BCB 4.658 e a Resolução CVM 35/2021, que exigem gestão formal de riscos no ciclo de desenvolvimento de sistemas para instituições financeiras. O alinhamento com ISO 27001:2022 Anexo A.8 (Segurança de Ativos) e A.8.25–A.8.31 (Ciclo de vida de desenvolvimento seguro) é exigido em auditorias de certificação e em contratos com grandes corporações.

Perguntas frequentes

Qual a diferença entre SAST, DAST e SCA no contexto de CI/CD?
SAST analisa o código-fonte sem executar a aplicação, detectando falhas como injeção SQL e uso inseguro de criptografia diretamente no repositório. DAST interage com a aplicação em execução em staging, simulando ataques externos. SCA não analisa o código que você escreveu, mas as bibliotecas de terceiros que você usa: mapeia CVEs conhecidos, licenças problemáticas e dependências transitivas. As três abordagens são complementares — SAST encontra o que você criou de errado, SCA detecta o que você importou de errado, DAST confirma o que ainda é explorável em runtime.
Em que etapa do pipeline cada ferramenta deve ser executada?
SAST e SCA rodam no commit ou pull request, antes do merge para a branch principal. Secret scanning deve ser o primeiro job do pipeline. IaC scanning executa sempre que arquivos Terraform, CloudFormation, Helm ou Kubernetes são modificados. Container scanning atua no build da imagem Docker, antes do push para o registry. DAST vai para depois do deploy em staging, quando a aplicação está em execução e acessível — em uma URL de ambiente isolada, não em produção.
O que é um security gate e como configurá-lo sem travar o time?
Um security gate é uma condição de parada no pipeline que bloqueia o avanço quando um critério de segurança não é atendido. A configuração que não paralisa o desenvolvimento combina três critérios: severidade mínima (bloquear apenas crítico/alto com fix disponível), diff-based alerting (bloquear apenas achados novos introduzidos no PR, não dívida técnica existente) e prazo de remediação (achados médios viram tickets com SLA de 30 dias). Ferramentas como Semgrep, Snyk e GitHub Advanced Security suportam esse modelo nativamente.
O que é Poisoned Pipeline Execution e como mitigar?
Poisoned Pipeline Execution é um ataque onde um adversário injeta código malicioso no arquivo de definição do pipeline para exfiltrar secrets ou adulterar artefatos durante o build. Mitigação requer: nunca executar workflows de PRs externos com acesso a secrets de produção; fixar actions de terceiros por hash de commit imutável; usar OIDC em vez de credenciais estáticas; e aplicar permissões mínimas explícitas no GITHUB_TOKEN de cada job.
Como ataques de supply chain como SolarWinds e 3CX se relacionam com o pipeline?
O ataque à SolarWinds injetou código malicioso na etapa de compilação, gerando um artefato assinado e legítimo distribuído para 18.000 clientes. O caso 3CX comprometeu uma dependência de terceiros que contaminou o instalador oficial assinado. Ambos demonstram que a confiança no binário final não equivale à confiança no processo que o gerou. A resposta técnica é o framework SLSA com assinatura via Sigstore/Cosign: provenance verificável e builds herméticos tornam esses ataques detectáveis antes da distribuição.
Quais são as referências normativas para implementar DevSecOps?
As principais referências são: OWASP DevSecOps Guideline (controles por fase do SDLC), NIST SSDF SP 800-218 (práticas de desenvolvimento seguro), SLSA (integridade de supply chain), CIS Software Supply Chain Security Guide, e no Brasil as Resoluções BCB 4.658 e CVM 35/2021 para instituições reguladas. O alinhamento com ISO 27001:2022 Anexo A.8.25–A.8.31 é exigido em auditorias de certificação e contratos enterprise.

Como a Decripte implementa DevSecOps

A Decripte integra práticas de DevSecOps e AppSec em organizações de todos os portes — de MEIs que precisam de um pipeline seguro para suas APIs até enterprises com mais de 100.000 colaboradores gerenciando dezenas de produtos em produção. A implementação cobre a auditoria do pipeline existente, integração de ferramentas de SAST, SCA, DAST, IaC e container scanning, definição de security gates calibrados para a maturidade do time, adoção de SLSA e Sigstore para integridade de artefatos, e treinamento de equipes de desenvolvimento em práticas seguras. O resultado é medido em MTTR, redução de vulnerabilidades introduzidas por PR e conformidade com requisitos regulatórios. Conheça os planos de implementação ou comece com uma análise do seu pipeline no nível gratuito.