Compila e Reza? - Segurança e Qualidade na Prática: O Papel do SAST, DAST e Testes Automatizados no Ciclo de Vida do Software Moderno
Fundamentação: O que são SAST e DAST - e por que "rezar" não é estratégia
Antes de instalar qualquer ferramenta, é preciso entender exatamente o que cada uma faz - e, mais importante, o que ela não faz. SAST e DAST não são a mesma coisa e não são opcionais uma em relação à outra. Tratá-las como intercambiáveis é o primeiro erro de quem está tentando parar de apagar incêndio.
SAST - Static Application Security Testing
SAST analisa o código-fonte, bytecode ou binário sem executar a aplicação. Ele lê o texto do seu código e procura padrões que denunciam vulnerabilidades conhecidas: SQL Injection hardcoded, senha em plain text, uso inseguro de função criptográfica, input sem sanitização.
Ferramentas de referência: SonarQube, Semgrep, Snyk Code, CodeQL.
Pense em SAST como um revisor obcecado por segurança que lê cada linha antes de qualquer coisa ir ao ar. Ele não precisa ver o sistema rodando - só precisa do código na tela.
Origem do termo: A OWASP classifica SAST como técnica de "white-box testing": o analisador tem acesso total ao código-fonte, à estrutura interna e à lógica da aplicação. É o oposto direto do DAST, que opera como "black-box".
DAST - Dynamic Application Security Testing
DAST ataca a aplicação em execução, simulando o comportamento de um agente externo malicioso - como um pentester faria de verdade. Ele não lê uma linha de código: manda requisição HTTP, tenta injeção, manipula token, explora endpoint não documentado e observa a resposta.
Ferramentas de referência: OWASP ZAP (open-source), Burp Suite, Acunetix.
Se SAST é o revisor de texto, DAST é o invasor simulado testando cada fechadura da casa, uma por uma.
| Dimensão | SAST | DAST |
|---|---|---|
| Perspectiva | White-box (com acesso ao código) | Black-box (sem acesso ao código) |
| Quando executa | Antes do build / no commit | Após o deploy em ambiente de teste |
| O que detecta | Vulnerabilidades no código, más práticas, segredos expostos | Vulnerabilidades em runtime: XSS, CSRF, falhas de autenticação, headers inseguros |
| Ponto cego | Não detecta problemas de configuração de infraestrutura | Não detecta vulnerabilidades em código não exposto pela interface |
| Velocidade | Segundos a poucos minutos por scan incremental | Minutos a horas (varredura completa) |
| Exemplos de ferramentas | SonarQube, Semgrep, Snyk Code, CodeQL | OWASP ZAP, Burp Suite, Acunetix |
Onde cada um entra na esteira de CI/CD
A pergunta que importa não é "o que cada ferramenta faz", é em que momento ela entra. Rodar DAST sem um ambiente de staging dedicado, por exemplo, gera ruído em escala industrial e pode até derrubar produção sem querer.
A topologia recomendada para uma startup em crescimento:
// CI/CD pipeline - visão de segurança
Fase 1: Commit / PR → SAST + Secret Scan
Fase 2: Build & Unit Tests → SCA (dependências)
Fase 3: Staging Deploy → DAST + E2E
Fase 4: Gate de Qualidade → Quality Gate
Fase 5: Produção → RASP / WAF
O SAST na fase de commit barra vulnerabilidade óbvia antes de entrar na branch principal - o custo de correção aqui é praticamente zero. O SCA (Software Composition Analysis), uma variante do SAST focada em dependências de terceiros (npm, PyPI, Maven), entra junto ao build para caçar pacote com CVE conhecida. O DAST só faz sentido em staging, onde a aplicação roda de verdade sem colocar usuário real em risco.
Reparem: em nenhum ponto desse pipeline existe a fase "cruzar os dedos". Isso não é acidente.
Sinergia: Testes automatizados como primeira linha de defesa
Existe um equívoco recorrente em times que adotam segurança tarde demais: achar que SAST e DAST substituem uma suíte de testes sólida. Não substituem. Se o código chega quebrado para o scanner de segurança, a ferramenta vai apontar problema demais para priorizar - e o time afoga em alerta antes mesmo de começar a corrigir o que importa.
A analogia certa é a de uma fortaleza: você não começa pela catapulta (DAST). Começa pelo fosso (testes unitários), depois pelas muralhas (testes de integração), e só então posiciona sentinelas nas torres (SAST). A catapulta simulada (DAST) entra por último, para validar se a fortaleza resiste a um ataque real.
A pirâmide de testes como fundação de segurança
Testes Unitários - a base
Validam a lógica de cada função isoladamente. Do ponto de vista de segurança, garantem que funções de validação, sanitização e autenticação se comportam exatamente como esperado. Um teste que confirma que sanitizeInput() rejeita <script> é a defesa mais barata que existe contra XSS. (rápido · barato · granular)
Testes de Integração - as muralhas
Verificam como componentes interagem - API com banco, serviço de autenticação com módulo de sessões. Expõem falha de segurança que só aparece na fronteira entre sistemas: token que não expira, permissão que vaza entre contextos, dado sensível trafegando sem criptografia entre microserviços. (médio · contextual · sistêmico)
Testes E2E - a experiência do usuário malicioso
Simulam fluxos completos do ponto de vista de quem usa (ou abusa d)o sistema. É aqui que se testa o fluxo inteiro de reset de senha, sessões concorrentes, ou se um usuário comum chega ao painel admin só manipulando a URL. Playwright e Cypress com cenários de segurança cobrem o que teste unitário nunca alcançaria. (lento · abrangente · realista)
SAST / DAST - as sentinelas especializadas
Entram depois, quando o código já passou pelo crivo lógico e funcional. Aí sim focam no que fazem de melhor: identificar padrão de vulnerabilidade que humano nenhum notaria - algoritmo criptográfico obsoleto, endpoint sem rate limiting. (especializado · complementar)
Cobertura de código não é métrica de vaidade
Time imaturo em qualidade trata cobertura de código como número bonito para o slide de retrospectiva. Time maduro entende cobertura como declaração de risco: cada linha sem teste é uma linha onde pode existir uma vulnerabilidade que nenhum scanner vai detectar com confiança, porque nem o comportamento esperado está documentado.
"A security tool can only find bugs in code that humans understand. Tests document what the code is supposed to do - without that context, automated tools are guessing."
- Gene Kim et al., The DevOps Handbook, 2nd edition
A recomendação prática não é perseguir 100% de cobertura no dia 1 (isso paralisa o time) - é definir coverage gates por domínio crítico: autenticação e autorização com cobertura mínima de 90%; pagamentos e dados pessoais, o mesmo patamar. O resto cresce de forma iterativa.
O custo real de corrigir bugs tarde
O IBM Systems Sciences Institute publicou um dado que virou referência: o custo de corrigir um defeito cresce exponencialmente conforme avança no ciclo de desenvolvimento. Bug pego em teste unitário custa uma fração do mesmo bug pego em produção.
| Fase de Descoberta | Custo Relativo de Correção |
|---|---|
| Teste unitário | 1× |
| Teste integração | 2-5× |
| SAST no CI | 5-10× |
| Teste E2E / DAST | 10-20× |
| Produção | 50-100× |
Custo relativo de correção por fase de descoberta (baseado em IBM Systems Sciences Institute / NIST)
Análise Crítica: Velocidade comercial vs. segurança - e por que "depois a gente arruma" é a pior frase do dicionário de startup
Chegamos à parte que consultor evita escrever porque não tem resposta confortável. Startup em hipercrescimento sofre pressão real para entregar. Produto quer feature. Investidor quer crescimento. Cliente corporativo quer a integração prometida para o demo da próxima semana. E o tech lead olha para o pipeline com SAST e DAST configurados e pensa: "e esses 200 falsos positivos que o SonarQube jogou na minha cara ontem?"
O problema real dos falsos positivos
Ferramenta de SAST é notoriamente ruidosa, sobretudo nas primeiras semanas. O SonarQube vai marcar MD5 usado para gerar hash de avatar como "Critical Security Hotspot" - mesmo sabendo que esse uso específico não exige resistência a colisão. O Semgrep vai reclamar de um padrão de SQL que na verdade passa por ORM com parametrização automática.
O problema não é o falso positivo isolado. É a fadiga de alerta: quando o time começa a ignorar tudo porque tem ruído demais, ele ignora junto o alerta real. É o efeito manada - só que o lobo, dessa vez, existe.
Antipadrão perigoso: Configurar o SAST para "quebrar o build" em qualquer alerta, sem antes triar e calibrar as regras, é o jeito mais rápido de fazer o time desabilitar a ferramenta em silêncio. Comece em modo aviso (warning), não bloqueio (blocking).
A abordagem pragmática: segurança incremental, não segurança perfeita
A resposta ao dilema velocidade-vs-segurança não é binária. Não é "resolve tudo antes do deploy" nem "deixa pra depois". É risco gerenciado com dívida técnica explícita - e documentada, não escondida debaixo do tapete.
Na prática, três movimentos:
Estabeleça um baseline e evolua a partir dele. Na primeira semana com SAST, rode o scan mas não bloqueie nada. Classifique o que existe, separe falso positivo de vulnerabilidade legítima, crie supressão justificada para o ruído. Daí em diante, só alerta novo (introduzido em PR novo) bloqueia pipeline. Isso evita herdar a dívida técnica histórica inteira como barreira ao progresso.
Implemente um Security Champions Program. Um engenheiro por squad como referência de segurança - não especialista, apenas alguém que mantém a conversa viva - tem impacto maior que qualquer ferramenta isolada. Modelo documentado pela OWASP, distribui responsabilidade sem criar gargalo central.
Defina o que é release-blocker. Nem toda vulnerabilidade pesa igual. CVSS 9+ em produção? Para tudo. SQL Injection em endpoint autenticado interno? Sprint dedicado. Hash fraco em funcionalidade de baixo risco? Backlog com prazo. Essa categorização explícita é o que permite ao time seguir entregando sem fingir que segurança não existe.
Existe cenário onde vale a pena pular essas etapas?
A resposta curta: tecnicamente, não. Estrategicamente, às vezes - por um prazo curto e sob condição clara.
Do ponto de vista técnico, nunca é aceitável "pular" segurança. Você não elimina o risco, só adia o momento em que ele explode. Vulnerabilidade não descoberta em staging que chega à produção não some por isso. Ela espera.
Do ponto de vista estratégico, existe um único cenário em que uma startup pode operar temporariamente sem DAST completo: quando ainda não há staging estável, o produto não trata dado sensível e não há usuário externo exposto. Isso raramente dura mais de 60 dias numa startup que está crescendo de verdade.
O que nunca é negociável, em nenhum estágio: rodar em produção sem varredura mínima de dependências (SCA) e sem teste unitário nos módulos de autenticação. O custo de um incidente de vazamento - LGPD, reputação, churn - supera em ordens de grandeza qualquer ganho de velocidade obtido ao pular essas checagens.
"Agora a gente cresce, depois a gente arruma" é a frase que abre praticamente todo post-mortem de incidente de segurança que já foi publicado.
O que as referências dizem sobre isso
O NIST SP 800-218 (Secure Software Development Framework), de 2022, estabelece que segurança deve estar integrada em cada fase do desenvolvimento, com ênfase em automação de teste de segurança como prática padrão - não opcional, não luxo de empresa grande.
A Snyk's State of Open Source Security de 2023 mostrou que 44% das empresas sofreram incidente de segurança ligado diretamente a uma dependência de código aberto vulnerável que já era conhecida no momento do deploy - mas sem SCA configurado para pegar. O problema não era falta de tecnologia. Era ausência de processo.
"Security is not a feature. It is a quality attribute. And like performance or reliability, it cannot be bolted on after the fact."
- OWASP DevSecOps Guideline, 2023
Um roadmap para a startup deste caso
Para a startup que contratou este consultor, a recomendação não é implantar tudo de uma vez. É sequenciar por impacto de risco:
| Horizonte | Ação | Impacto esperado |
|---|---|---|
| Semanas 1-2 | Snyk ou Dependabot no repositório principal (SCA) | Elimina dependência com CVE crítica de imediato |
| Semanas 2-4 | Semgrep no CI com regras padrão de segurança (modo warning) | Baseline de SAST sem bloquear deploy ainda |
| Mês 2 | Cobertura mínima de testes unitários em auth/pagamentos (≥80%) | Reduz bug e falso negativo nos scanners |
| Mês 3 | OWASP ZAP em pipeline de staging (CI completo) | DAST automatizado sem impacto em produção |
| Mês 4+ | Quality Gates configurados (SAST bloqueia novo alerta crítico) | Segurança como parte da definição de "done" |
Princípio central: Segurança não é projeto com data de término. É prática de engenharia que cresce junto com o produto. O objetivo não é "segurança perfeita" - é tornar o custo do ataque maior que o benefício esperado pelo atacante, de forma sistemática e mensurável.
Conclusão
SAST e DAST não são a mesma coisa; são complementares e pertencem a momentos diferentes da esteira. Teste automatizado não é o oposto de segurança - é sua precondição. E pressão por velocidade comercial não é desculpa para ignorar vulnerabilidade: é justamente o contexto em que o processo de segurança precisa ser simples, automatizado e integrado ao fluxo, não um checkpoint manual que ninguém quer rodar.
A startup que sofre com bug em produção e vazamento de dado não precisa de mais ferramenta. Precisa de sequência, priorização e cultura. SAST no commit, teste cobrindo módulo crítico, DAST em staging, e um time que entende que segurança não é projeto com data de término - é prática de engenharia que cresce junto com o produto.
Comments
No comments yet. Start the discussion.