Pular para o conteúdo principal

🧪 Aplicação de Testes de Segurança ao Longo do Ciclo de Vida

🧭 Quando aplicar

Os testes de segurança acompanham a aplicação em todas as fases - não são uma etapa final, mas um ritmo contínuo de validação.
Desde a definição inicial de requisitos até à auditoria final, cada momento do ciclo de vida deve gerar evidência objetiva de que a aplicação está protegida contra falhas conhecidas e ameaças emergentes.

Fase SDLC / EventoAção de testesArtefacto/Evidência
EspecificaçãoDefinir requisitos de segurança testáveis e critérios de aceitaçãoMatriz de requisitos + Plano de testes
DesenvolvimentoExecutar SAST e linters; criar testes de regressãoRelatórios SAST + regressões
Pull requestExecutar SAST automático com comentários inlineLogs CI + SARIF
Build / CIExecutar SCA, SAST, IAST (se aplicável), gerar SBOMLogs pipeline + SBOM
StagingExecutar DAST autenticado e fuzzing de endpoints críticosRelatórios DAST + fuzzing
Pré-releaseValidar critérios de release e gerir exceçõesChecklist release
Pós-releaseFuzzing contínuo / IAST; monitorização dinâmicaAlertas + relatórios
AuditoriaRealizar PenTesting ofensivo baseado em riscoRelatório técnico de PenTest

👥 Quem executa cada ação

A responsabilidade pela qualidade dos testes é coletiva.
Cada papel contribui com uma perspetiva única, mas só em conjunto se obtém um processo de validação robusto e auditável.

PapelResponsabilidade
DevCorrigir findings, criar regressões automatizadas
QA/TestesExecutar DAST, fuzzing, validar critérios
AppSecDefinir estratégia, tuning de regras, gerir findings e exceções
DevOpsIntegrar scanners, gates e evidências no CI/CD
Gestão de ProdutoAprovar risco residual e decidir go/no-go
PenTesterValidar ofensivamente controlos e relatar impacto

📖 User Stories Reutilizáveis

As histórias seguintes transformam princípios em prática.
Cada US representa um controlo essencial, pensado para ser integrado diretamente no backlog da equipa e aplicado proporcionalmente ao risco da aplicação (L1–L3).


US-01 - Estratégia formal de testes por aplicação

A validação começa com planeamento.
Sem uma estratégia clara, a cobertura torna-se desigual e impossível de auditar.

Contexto.
Sem estratégia, a cobertura é desigual e difícil de auditar.

User Story

História.
Como AppSec, quero definir uma estratégia de testes de segurança por aplicação, para assegurar cobertura proporcional ao risco e rastreabilidade com requisitos do Cap. 02.

Critérios de aceitação (BDD).

  • Dado que a aplicação tem criticidade Lx
    Quando defino a estratégia
    Então os tipos de teste e gates ficam estabelecidos por L1–L3 e ligados a requisitos

Checklist.

  • Documento de estratégia versionado
  • Cobertura mínima por L1–L3 definida
  • Mapeamento Cap. 2 ⇄ testes publicado

Artefactos & evidências. Documento strategy-testing.md, matriz requisitos⇄testes.

Proporcionalidade por risco.

NívelObrigatório?Cobertura mínima
L1SimSAST + checklist
L2Sim+ DAST autenticado
L3Sim+ fuzzing/IAST + PenTest

Integração no SDLC.

FaseTriggerResponsávelSLA
PlaneamentoClassificação Lx / kick-offAppSecAté ao fim do 1.º sprint

US-02 - SAST obrigatório em Pull Request

Detetar cedo é sempre mais barato.
Executar SAST no momento do PR garante que vulnerabilidades nunca chegam à branch principal.

Contexto.
PRs sem SAST permitem que vulnerabilidades entrem cedo no código base.

User Story

História.
Como Dev, quero executar SAST automático no PR com comentários inline, para corrigir vulnerabilidades antes do merge.

Critérios de aceitação (BDD).

  • Dado que abro um PR
    Quando o pipeline corre SAST
    Então resultados aparecem inline e bloqueiam acima do threshold definido

Checklist.

  • Trigger em PR ativo
  • Relatório SARIF anexado
  • Threshold por Lx aplicado

Artefactos & evidências. Logs CI + SARIF.

Proporcionalidade por risco.

NívelPolítica de gate
L1Aviso
L2Bloqueio High/Critical
L3Bloqueio Medium+

Integração no SDLC.

FaseTriggerResponsávelSLA
Revisão de códigoAbertura de PRDev + DevOpsAntes do merge

US-03 - DAST autenticado em Staging

Muitas falhas críticas só se revelam após login.
Executar DAST autenticado em staging é o passo natural antes de promover uma release.

Contexto.
Muitas falhas surgem apenas autenticadas.

User Story

História.
Como QA, quero executar DAST autenticado em staging, para detetar vulnerabilidades exploráveis em runtime.

Critérios de aceitação (BDD).

  • Dado ambiente staging configurado
    Quando executo DAST autenticado
    Então relatórios são gerados e findings abertos no backlog

Checklist.

  • Login flow configurado
  • Scope definido
  • Relatório anexado à release

Artefactos & evidências. Relatórios DAST.

Proporcionalidade por risco.

NívelCobertura
L1Manual/exploratório
L2Automático autenticado
L3Automático + cobertura ampliada

Integração no SDLC.

FaseTriggerResponsávelSLA
StagingBuild/Deploy em stagingQAAntes da aprovação da release

US-04 - Gates de segurança no CI/CD

Sem gates, findings tornam-se meros relatórios ignorados.
Gates automáticos são a barreira que impede regressões graves de avançar.

Contexto.
Sem gates, findings não impedem regressões.

User Story

História.
Como DevOps, quero integrar gates automáticos no pipeline (SAST/SCA/IAST) com thresholds por Lx, para evitar builds inseguros.

Critérios de aceitação (BDD).

  • Dado um pipeline em execução
    Quando um finding excede o threshold Lx
    Então o job falha e a promoção é bloqueada até correção ou exceção aprovada

Checklist.

  • Pipelines versionados com gates declarados
  • Thresholds por Lx publicados
  • Logs exportados
  • Exceções aprovadas (L3: dupla aprovação)

Artefactos & evidências. Configuração ci.yml, relatórios e registo de exceções.

Proporcionalidade por risco.

NívelPolítica
L1Aviso
L2Bloqueio High/Critical
L3Bloqueio Medium+

Integração no SDLC.

FaseTriggerResponsávelSLA
CI/CDExecução pipelineDevOps + AppSecEm cada build

Detalhes de rastreabilidade (expandido):

  • Logs de cada execução com timestamp, commit, branch, ferramentas executadas, thresholds aplicados
  • Relatório de exceptions aprovadas (ficheiro JSON com PR, justificação, aprovador, data de expiração)
  • Métricas de gates: % bloqueios por severidade, taxa de override, tempo médio de remediação
  • Dashboard Prometheus/Grafana com série histórica de findings bloqueados vs permitidos
  • Integração com backlog para abertura automática de issues para findings bloqueados

US-05 - Regressões de segurança automatizadas

Corrigir não chega - é preciso garantir que a mesma falha não regressa.
Testes de regressão automatizados transformam cada correção numa proteção futura.

Contexto.
Falhas corrigidas voltam sem regressão automatizada.

User Story

História.
Como Dev, quero criar testes de regressão para findings corrigidos, para evitar reintrodução futura.

Critérios de aceitação (BDD).

  • Dado um finding resolvido
    Quando crio o teste de regressão
    Então ele falha se a vulnerabilidade regressar

Checklist.

  • Teste criado e versionado
  • Ligação ao finding original (ID)
  • Execução em builds futuros

Artefactos & evidências. Código de regressão + logs CI.

Proporcionalidade por risco.

NívelExigência
L1Casos críticos
L2Por falha conhecida
L3Cobertura obrigatória

Integração no SDLC.

FaseTriggerResponsávelSLA
Dev/CIFecho de findingDevNo PR de correção

US-06 - Fuzzing dirigido a APIs críticas

Testes convencionais não capturam todas as falhas.
O fuzzing, ao explorar entradas inesperadas, revela vulnerabilidades invisíveis a olho nu.

Contexto.
Entradas complexas revelam falhas não cobertas.

User Story

História.
Como QA, quero aplicar fuzzing a endpoints críticos, para detectar falhas invisíveis em testes convencionais.

Critérios de aceitação (BDD).

  • Dado endpoints críticos definidos
    Quando executo fuzzing
    Então anomalias são registadas com PoC mínima

Checklist.

  • Targets e perfis definidos
  • Ambiente isolado de teste
  • Relatório com casos reproduzíveis

Artefactos & evidências. Relatório de fuzzing + corpora.

Proporcionalidade por risco.

NívelCobertura
L1Opcional
L2Endpoints prioritários
L3Endpoints críticos obrigatórios

Integração no SDLC.

FaseTriggerResponsávelSLA
StagingRelease candidateQAAntes do go-live

US-07 - Critérios de release e aceitação de risco

Cada release é também uma decisão de risco.
Formalizar critérios e aceitar explicitamente o risco residual é parte da governação.

Contexto.
Lançamentos sem critérios claros diluem responsabilidade.

User Story

História.
Como Gestão de Produto, quero estabelecer critérios de aceitação de segurança por release e um processo de aceitação de risco residual, para decisões go/no-go informadas.

Critérios de aceitação (BDD).

  • Dado uma release pronta
    Quando verifico critérios e findings
    Então aprovo, atraso ou exceciono com prazo e compensações

Checklist.

  • Checklist preenchida
  • Findings críticos: 0 ou exceção formal
  • Justificação de risco registada

Artefactos & evidências. Checklist de release + registo de exceções.

Proporcionalidade por risco.

NívelPolítica
L1Checklist simples
L2Bloqueio High/Critical
L3Nenhum crítico sem exceção formal

Integração no SDLC.

FaseTriggerResponsávelSLA
Pré-releaseRelease candidateGestão + AppSecAté D-1 do go-live

Template de Checklist de Release (L3):

## 📋 Checklist de Release - v{VERSION}

**Release:** v2.3.0
**Data planeada:** YYYY-MM-DD
**Owner:** Product Manager X, AppSec Lead Y

| Critério | Status | Evidência | Observação |
|---|---|---|---|
| **Findings Críticos** | ✅ ZERO | Screenshot dashboard | Aceite se mitigação documentada |
| **SAST Thresholds** | ✅ OK | Build log #4521 | Bloqueio High/Critical não acionado |
| **DAST Cobertura** | ✅ 85% | Relatório DAST | Meta L3 = 80%+ |
| **Fuzzing endpoints críticos** | ✅ Completo | Log fuzzer noturno | 3 findings Low resolvidos |
| **Regressões** | ✅ PASS | CI #4521 | Nenhuma regressão detetada |
| **PenTest (se L3)** | ⚠️ Em curso | Relatório preliminar | Conclusão em +5d |
| **SCA cobertura** | ✅ 100% | SBOM + scanning | 0 CVE não mitigadas |
| **Documentação segurança** | ✅ Atualizada | Wiki link | Ameaças, controlos, mitigações |
| **Aprovação formal risco** | ⏳ Pendente | - | Aguarda AppSec + Produto |

**Risco residual aceite:**
- [X] 1 CVE Medium em dependência com patch disponível, mas adquirido em PR separado (até 2025-12-31)
- [X] Endpoint POST /admin/users sem DAST (acesso VPN, compensado por network policy)

**Aprovações:**
- AppSec Lead Y - aprovado em YYYY-MM-DD
- Product Manager X - aprovado em YYYY-MM-DD

US-08 - PenTesting ofensivo baseado em risco

Automação é fundamental, mas não suficiente.
O olhar humano ofensivo identifica cadeias de ataque que scanners nunca simulam.

Contexto.
Validação humana complementa automação.

User Story

História.
Como PenTester, quero validar ofensivamente a eficácia dos controlos, para detetar falhas exploráveis antes da produção.

Critérios de aceitação (BDD).

  • Dado âmbito baseado em risco
    Quando executo PenTest
    Então emito relatório com vetores, impacto e recomendações

Checklist.

  • âmbito definido e consentimento
  • Relatório com PoCs e severidade
  • Retest planeado para críticos

Artefactos & evidências. Relatório técnico PenTest + evidências.

Proporcionalidade por risco.

NívelExigência
L1Não aplicável
L2Ocasional por risco
L3Obrigatório pré-produção

Integração no SDLC.

FaseTriggerResponsávelSLA
Auditoria / Pré-produçãoJanela de auditoria ou L3 críticoPenTester + AppSecRelatório antes do go-live

US-09 - IAST com Instrumentação em Staging

DAST valida externamente, mas IAST oferece visibilidade interna de fluxos não sanitizados, chamadas inseguras e uso indevido de bibliotecas.
Essencial para L2/L3 de criticidade elevada.

Contexto.
DAST valida externamente, mas IAST oferece visibilidade interna.

User Story

História.
Como QA + AppSec, quero instrumentar a aplicação em staging com IAST para observar chamadas inseguras em tempo real durante testes, para correlacionar findings com contexto de execução real e reduzir falsos positivos.

Critérios de aceitação (BDD).

  • Dado que uma aplicação é instrumentada com agent IAST em staging
    Quando testes funcionais ou automáticos são executados
    Então findings são capturados com visibilidade total do stack (função, linha, parâmetro, valor)

  • Dado um finding de IAST observado

  • Quando é correlacionado com DAST/SAST

  • Então o resultado é priorizado como crítico/alto se confirmado em múltiplas camadas

Checklist.

  • Agent IAST instalado e configurado em staging
  • Cobertura de instrumentação de endpoints críticos validada
  • Performance da aplicação monitorizada (overhead <10% aceito)
  • Findings de IAST exportados em formato estruturado
  • Integração com ferramenta centralizada de findings (DefectDojo ou similar)
  • Dados sensíveis mascarados nos logs de IAST
  • Retest após correção de findings críticos agendado

Artefactos & evidências. Configuração de agent IAST (YAML/HCL versionado), relatórios IAST (JSON/XML), logs de performance, dashboard de correlação SAST↔DAST↔IAST, métricas de cobertura.

Proporcionalidade por risco.

NívelObrigatório?Ajustes
L1NãoOpcional, investigativo
L2RecomendadoEm endpoints críticos (autenticação, pagamento)
L3ObrigatórioCobertura total + correlação com DAST

Integração no SDLC.

FaseTriggerResponsávelSLA
StagingDeploy de candidato a releaseQA + AppSecAntes de aprovação formal

US-10 - Gestão Centralizada de Findings com Triagem e SLA

Findings dispersos em ferramentas isoladas criam redundância, ruído e falta de visibilidade.
Centralização com triagem formal, SLA e rastreabilidade é imperativa para governação.

Contexto.
Findings dispersos criam ruído e falta de visibilidade.

User Story

História.
Como AppSec + DevOps, quero centralizar todos os findings de SAST, DAST, IAST, SCA, fuzzing e testes manuais numa plataforma unificada com triagem por criticidade, estado e SLA, para garantir rastreabilidade completa e priorização eficaz.

Critérios de aceitação (BDD).

  • Dado que findings são produzidos por múltiplas ferramentas
    Quando são correlacionados na plataforma centralizada
    Então duplicados são consolidados e metadados unificados (CVE, CWE, CVSS, commit, módulo)

  • Dado um finding triado

  • Quando obtém estado (Aberto/Em investigação/Aceite/Corrigido/Validado)

  • Então SLA é associado e alertas disparados se excedido

  • Dado um finding corrigido

  • Quando validação ocorre

  • Então é marcado como Fechado e rastreabilidade de correção (commit, release) é registada

Checklist.

  • Plataforma centralizada deployada (DefectDojo, Vulcan, Security Hub, etc.)
  • Conectores para todas as ferramentas (SAST, DAST, IAST, SCA) configurados
  • Regras de deduplica e correlação ativas
  • Critérios de triagem documentados (CWE, OWASP, risco organizacional)
  • SLA definidos por severidade e Lx (Crítico: <24h, Alto: <7d, Médio: <30d)
  • Dashboard públicos com KPIs (findings abertos, taxa de resolução, tempo médio)
  • Integração com backlog (Jira/Azure Boards) para atribuição automática
  • Auditoria de exceções com dupla aprovação para L2/L3

Artefactos & evidências. Configuração plataforma centralizada versionada, regras de deduplica, dashboard de findings, SLA documento, logs de mudança de estado, relatórios mensais KPIs.

Proporcionalidade por risco.

NívelExigênciaDetalhes
L1Centralização simplesTriagem manual, SLA recomendado
L2Centralização com SLAEstados formais, alertas por exceção
L3Centralização + auditoriaSLA rigoroso, dupla aprovação, relatório mensal

Integração no SDLC.

FaseTriggerResponsávelSLA
ContínuaProdução de findingsAppSec + DevOpsEm tempo real

US-11 - Feedback Automático de Findings às Equipas

Findings não comunicados eficazmente são ignorados.
Feedback automático em canais onde os developers trabalham reduz fricção e acelera correção.

Contexto.
Findings não comunicados são ignorados.

User Story

História.
Como AppSec + DevOps, quero automatizar delivery de findings nos pontos de contacto das equipas (comentários em PR, notificações Slack, dashboards IDE), para assegurar visibilidade e acelerar remediação.

Critérios de aceitação (BDD).

  • Dado que SAST detecta uma vulnerabilidade num PR
    Quando o pipeline conclui
    Então comentário inline é publicado no PR com contexto (CWE, severidade, recomendação de fix)

  • Dado um finding crítico detetado

  • Quando é triado na plataforma centralizada

  • Então alerta é enviado a Slack/Teams para o team owner com urgência

  • Dado um developer a trabalhar

  • Quando IDE integrado com SonarQube/Semgrep está ativo

  • Então warnings aparecem em tempo real com sugestões de correção

Checklist.

  • Integração de comentários automáticos em PRs ativa (ex: GitHub Actions, GitLab CI)
  • Webhooks configurados para envio de notificações (Slack, Teams, Email)
  • Severidade e contexto incluídos em cada notificação
  • Evitar duplicação de notificações (coalescing de alerts)
  • Dashboard público de findings por projeto/team
  • Feedback de satisfação das equipas coletado (ex: "Muito útil", "Falso positivo")
  • Ajustes de rules baseado em feedback periodicamente (mensal/trimestral)

Artefactos & evidências. Configuração webhooks e integrações (YAML versionado), templates de comentários em PR, dashboard comunicação, feedback logs, relatório trimestral eficácia.

Proporcionalidade por risco.

NívelCanaisFrequência
L1Email/relatório semanalAgregado
L2PR comments + Slack diárioPor severidade
L3PR comments + Slack + IDE + dashboardReal-time críticos

Integração no SDLC.

FaseTriggerResponsávelSLA
ContínuaGeração/triagem de findingsAppSec + DevOps<15min para críticos

US-12 - Decisão Assistida para Findings de Testes de Segurança

Contexto.
Ferramentas de teste (SAST, DAST, IAST, fuzzing) reportam centenas de findings por build, bloqueando pipelines sem análise de contexto. Sem framework de decisão estruturado, equipas aceitam riscos "às cegas" ou fazem bypass de gates para cumprir deadlines, sem rastreabilidade.

User Story

História.
Como AppSec + DevOps, quero framework de decisão estruturado para findings de testes de segurança, para separar sugestão (ferramenta) de decisão (humano), documentar rationale com checklist C1 e escalar conflitos entre timeline e segurança.

Critérios de aceitação (BDD).

  • Dado que SAST reporta finding CRITICAL (SQL injection)
    Quando Developer analisa com checklist C1 (exploitabilidade, mitigações, remediação, negócio)
    Então decisão é documentada em template T1 (CORRIGIR/ACEITAR/SUPRIMIR/DEFER) com justificação rastreável
  • Dado finding HIGH em L3
    Quando DevOps propõe ACEITAR-risco mas AppSec discorda
    Então conflito é escalado com template T2 para CISO/Tech Lead, com resolução em SLA 4h
  • Dado decisão de CORRIGIR-IMEDIATO
    Quando correção é aplicada em PR
    Então revalidação confirma que finding desapareceu e nenhum novo finding CRITICAL foi introduzido
  • Dado métrica de decisão
    Quando revisão trimestral
    Então >95% findings CRITICAL/HIGH têm C1 documentado, tempo-de-decisão <4h, taxa de bloqueio <10%

Checklist.

  • Checklist C1 integrado em workflow de findings (4 perguntas: exploitabilidade, mitigações, remediação, negócio)
  • Template T1 de decisão (CORRIGIR/ACEITAR/SUPRIMIR/DEFER) com campos obrigatórios (Finding ID, análise C1, rationale, implementação, aprovador)
  • Template T2 de escalação para conflitos (Timeline vs. Segurança, FP disputes, Compensating controls)
  • Matriz de decisores por severidade (CRITICAL/HIGH/MEDIUM/LOW) × nível (L1/L2/L3)
  • SLA por severidade: 2h análise CRITICAL (L3), 4h HIGH, 8h MEDIUM, 24h LOW
  • Repositório de decisões em Git (decisoes/DEC-YYYY-MM-DD-XXX.md) linkado a Finding ID
  • Dashboard KPIs: % findings documentados, tempo-de-decisão, taxa bloqueio pipeline, taxa aceitação risco
  • Integração com plataforma centralizada (DefectDojo/Vulcan) para rastreabilidade

🧾 Artefactos & evidências.

  • Checklist C1 aplicado para cada finding CRITICAL/HIGH (exploitabilidade, mitigações, remediação, negócio)
  • Template T1 preenchido para cada decisão (CORRIGIR/ACEITAR/SUPRIMIR/DEFER com rationale)
  • Template T2 de escalação para conflitos documentado (Timeline vs. Segurança, resolução formal)
  • Matriz de decisores definida (quem decide por severidade × nível)
  • Repositório Git de decisões (decisoes/*.md) com linkagem Finding ID → PR → Commit
  • Dashboard de KPIs de decisão (cobertura C1, tempo-decisão, bloqueio, aceitação risco)
  • Logs de escalação com timestamps e resolução formal

⚖️ Proporcionalidade.

NívelObrigatório?Ajustes
L1RecomendadoChecklist simplificado para CRITICAL apenas, sem SLA rígido
L2SimChecklist C1 obrigatório para CRITICAL+HIGH, template T1, decisores definidos, SLA 4h HIGH
L3SimChecklist C1 para todos findings ≥MEDIUM, template T1+T2, escalação formal, SLA 2h CRITICAL

Integração no SDLC.

FaseTriggerResponsávelSLA
CI/CDFerramenta reporta findingDevOps + AppSec2h CRITICAL, 4h HIGH, 8h MEDIUM
DeployGate bloqueado por findingDevOpsDecisão com C1 antes de override
RevisãoTrimestralGRC + AppSecAnálise KPIs (cobertura, tempo-decisão)

Ligações úteis.
Addon 11 — Framework de Decisão para Findings
Addon 12 — Validação Empírica de Findings


US-13 - Validação Empírica de Exploitabilidade de Findings

Contexto.
Ferramentas reportam findings baseados em heurísticas, não em exploração empírica. Falsos positivos bloqueiam pipelines desnecessariamente; falsos negativos deixam vulnerabilidades em produção. Sem validação empírica, decisões são baseadas em "achismo" ("parece seguro") sem evidência.

User Story

História.
Como AppSec + DevOps, quero framework de validação empírica de findings, para testar exploitabilidade real com PoC reproduzível, documentar falsos positivos/negativos com evidência técnica, e otimizar configuração de ferramentas.

Critérios de aceitação (BDD).

  • Dado que SAST reporta SQL injection CRITICAL
    Quando DevOps executa teste T1 (code path analysis + payload test em staging)
    Então se exploitável, finding confirmado; se dead code ou validação bloqueia, marcado como FP com template S1
  • Dado DAST reporta XSS HIGH
    Quando executa teste T2 (reproduzir payload + testar bypasses WAF)
    Então se bypass funciona, finding confirmado; se WAF bloqueia todos payloads, marcado como mitigado com evidência
  • Dado fuzzing reporta crash com input >10KB
    Quando executa teste T4 (reproduzir crash + root cause analysis + testar RCE)
    Então se DoS confirmado, severidade ajustada; se apenas edge case handled, marcado como LOW
  • Dado incidente de produção (XSS explorado)
    Quando confirmo que SAST/DAST não detetaram
    Então registo FN com template S2 (Root Cause Analysis), ajusto ferramentas, adiciono teste de regressão
  • Dado métrica de qualidade
    Quando revisão mensal
    Então FP <20%, FN <5%, tempo-validação <4h (L2) ou <2h (L3)

Checklist.

  • Taxonomia T1-T5 definida (SAST, DAST, IAST, Fuzzing, Pentesting) com procedimentos de teste por tipo
  • Procedimentos de teste: T1 (code path + payload test), T2 (bypass WAF), T3 (PoC manual IAST), T4 (crash analysis), T5 (reprodução pentesting)
  • Template S1 de supressão FP com campos obrigatórios (Finding ID, análise técnica, evidência de teste, aprovador AppSec)
  • Template S2 de RCA para FN (vulnerabilidade não-detetada, root cause, correção de ferramenta, prevenção futura)
  • Repositório de PoCs versionado em Git (pocs/FINDING-ID-poc.py)
  • Staging environment isolado para testes de exploração (network segmentado, dados não-produção)
  • Dashboard de métricas qualidade: FP rate <20%, FN rate <5%, tempo-validação, cobertura testes
  • Integração com ferramentas para supressão automática de FP validados (comentários inline + whitelist)

🧾 Artefactos & evidências.

  • Taxonomia T1-T5 aplicada (SAST, DAST, IAST, Fuzzing, Pentesting com procedimentos específicos)
  • Testes de exploração executados em staging (T1: code path, T2: WAF bypass, T3: PoC IAST, T4: crash RCA, T5: reprodução pentesting)
  • Template S1 de supressão FP preenchido (Finding ID, razão técnica, evidência de teste não-exploitável)
  • Template S2 de RCA para FN documentado (vulnerabilidade missed, root cause, ajuste ferramenta)
  • Repositório de PoCs versionado em Git (pocs/*.py com payloads reproduzíveis)
  • Dashboard de métricas: FP rate <20%, FN rate <5%, tempo-validação <4h, confirmation rate >70%
  • Logs de testes de exploração com timestamps e evidência (screenshots, HTTP logs, crash dumps)

⚖️ Proporcionalidade.

NívelObrigatório?Ajustes
L1OpcionalTestes para CRITICAL apenas, sem exigência de tempo-validação
L2SimTestes T1-T5 para CRITICAL+HIGH, template S1 obrigatório, métricas FP <30%, tempo <4h
L3SimTestes T1-T5 para todos findings ≥MEDIUM, template S1+S2, métricas FP <20%, FN <5%, tempo <2h

Integração no SDLC.

FaseTriggerResponsávelSLA
CI/CDFerramenta reporta findingAppSec + DevOps4h HIGH (L2), 2h CRITICAL (L3)
StagingDeploy de nova versãoAppSecTestes T1-T5 antes de produção
RevisãoMensalAppSec + GRCAnálise métricas (FP, FN, cobertura)
IncidenteVulnerabilidade exploradaAppSec + CISORCA obrigatório com Template S2

Ligações úteis.
Addon 12 — Validação Empírica de Findings
Addon 11 — Framework de Decisão para Findings



US-14 - Validação humana da interpretação final dos resultados

Ferramentas podem correlacionar, priorizar e sugerir severidade — mas não substituem validação humana.
Esta US garante que a equipa não toma decisões (merge/release/aceitação) com base apenas em scoring automático ou agregação de resultados.

Contexto.
Resultados “plausíveis” ou bem priorizados podem estar errados, incompletos ou fora de contexto. Sem validação humana, aumenta o risco de falsos positivos/negativos e de decisões não auditáveis.

User Story

História.
Como AppSec, quero validar a interpretação final dos resultados de testes (severidade, exploitabilidade, prioridade e ação recomendada), para garantir que decisões de engenharia e governação se baseiam em evidência e contexto, e não apenas em correlação automática.

Critérios de aceitação (BDD).

  • Dado que um conjunto de testes (SAST/DAST/SCA/IAST/fuzzing) produziu findings
    Quando a triagem é concluída
    Então existe validação humana documentada para todos os findings acima do threshold definido para Lx

  • Dado que um finding é marcado como “falso positivo”, “mitigado” ou “aceite”
    Quando a decisão é registada
    Então existe racional técnico e evidência anexada que suporta a classificação

Checklist.

  • Triagem humana obrigatória para severidade ≥ threshold Lx
  • Racional registado (porque é crítico/alto/médio/baixo)
  • Evidência anexada (logs, PoC mínima, referências técnicas)
  • Falsos positivos com justificação e aprovação
  • Resultado final publicado (ex: backlog / plataforma central) com responsável identificado

Artefactos & evidências. Registo de triagem (ticket/nota), anexos técnicos, link para finding original e decisão final.

Proporcionalidade por risco.

NívelExigência
L1Triagem humana para High/Critical
L2Triagem humana para Medium+
L3Triagem humana para todos os findings acima de Low

Integração no SDLC.

FaseTriggerResponsávelSLA
CI/CD / StagingGeração de findingsAppSec + QAAntes de merge/release

US-15 - Reprodutibilidade de resultados críticos de testes de segurança

Sem reprodutibilidade não há auditoria fiável.
Esta US garante que qualquer finding relevante pode ser reexecutado de forma controlada, com contexto suficiente para validação independente.

Contexto.
Testes podem depender de configuração, seeds, estados de ambiente, versões de ferramentas e inputs dinâmicos. Resultados não reproduzíveis degradam governação e aumentam risco de decisões incorretas.

User Story

História.
Como QA/Testes, quero garantir que resultados críticos/altos de testes de segurança são reprodutíveis, para permitir validação independente, auditoria e correção eficaz sem ambiguidade.

Critérios de aceitação (BDD).

  • Dado que um finding Critical/High é detetado
    Quando é escalado para correção ou decisão
    Então existe um procedimento documentado que permite reproduzir o resultado em ambiente controlado

  • Dado que o finding depende de inputs dinâmicos (ex: fuzzing)
    Quando o teste é registado
    Então o input/corpus e o contexto (seed, versão, configuração) são preservados e versionados

Checklist.

  • Configuração do teste versionada (ruleset, flags, scope)
  • Versão da ferramenta registada (e.g., container digest)
  • Inputs relevantes preservados (request, payload, corpus, seed)
  • Ambiente de reprodução definido (staging/lab)
  • Procedimento de reprodução documentado (passo-a-passo)
  • Evidência do retest após correção (antes/depois)

Artefactos & evidências. Runbook de reprodução, ficheiros de input/corpus, logs antes/depois, identificação da versão de ferramenta e configuração.

Proporcionalidade por risco.

NívelExigência
L1Reprodutibilidade para Critical
L2Reprodutibilidade para High/Critical
L3Reprodutibilidade para Medium+ (e Critical/High obrigatórios)

Integração no SDLC.

FaseTriggerResponsávelSLA
Staging / Pré-releaseFinding ≥ thresholdQA + AppSecAntes de decisão go/no-go

US-16 - Separação formal entre sinal automático e decisão de bloqueio/override

Gates são necessários, mas não substituem governação.
Esta US garante que a decisão (bloquear, excecionar, promover) é sempre atribuída a um role humano e deixa evidência.

Contexto.
Sem separação clara, pipelines tornam-se “autoridade” e decisões de risco ficam implícitas, difíceis de auditar e fáceis de contornar informalmente.

User Story

História.
Como DevOps, quero separar formalmente o sinal automático (resultado de ferramentas) da decisão de bloqueio/override, para garantir que ações irreversíveis são controladas e auditáveis, com responsabilidade humana explícita.

Critérios de aceitação (BDD).

  • Dado que um gate falha por finding acima do threshold
    Quando a equipa pretende fazer override
    Então o override só é permitido com decisão humana documentada e validade temporal definida

  • Dado que um finding é marcado como exceção
    Quando a release é aprovada
    Então a evidência da decisão (quem, porquê, compensações, expiração) está registada e anexada à release

Checklist.

  • Gates definidos (o que é sinal vs o que é bloqueio)
  • Override apenas via mecanismo formal (PR/issue/workflow)
  • Decisor identificado (role e pessoa)
  • Justificação técnica e compensações registadas
  • Data de expiração obrigatória para exceções
  • Retest planeado antes do fim da expiração (L2/L3)

Artefactos & evidências. Registo de override/aceitação, evidência de compensações, expiração, ligação a release e findings.

Proporcionalidade por risco.

NívelExigência
L1Overrides permitidos com registo simples
L2Override exige aprovação AppSec + expiração
L3Override exige dupla aprovação (AppSec + Produto/Tech Lead) + expiração + retest obrigatório

Integração no SDLC.

FaseTriggerResponsávelSLA
CI/CD / Pré-releaseGate falhou ou exceção propostaDevOps + AppSecAntes do merge/release

US-17 - Avaliação crítica de cobertura real e limitações

Cobertura “boa” em métricas não significa segurança real.
Esta US introduz o controlo de processo que previne over-confidence e força documentação de lacunas.

Contexto.
Métricas automáticas (percentagens, checks verdes, contagem de testes) podem mascarar lacunas: endpoints fora de scope, fluxos autenticados não cobertos, caminhos raros, ameaças específicas sem teste.

User Story

História.
Como AppSec Lead, quero avaliar criticamente a cobertura real dos testes de segurança e documentar limitações, para evitar falsas garantias e assegurar que lacunas relevantes são conhecidas e tratadas.

Critérios de aceitação (BDD).

  • Dado um conjunto de testes executado para uma release
    Quando é produzido o sumário de validação
    Então existem métricas de cobertura interpretadas por humano e limitações explicitamente registadas

  • Dado que existem áreas fora de cobertura (ex: endpoints críticos não testados)
    Quando a release é aprovada
    Então existe plano de mitigação (teste adicional, controlo compensatório ou exceção formal)

Checklist.

  • Scope real documentado (o que foi testado vs não testado)
  • Cobertura por domínio (autenticação, autorização, inputs, APIs críticas)
  • Limitações registadas (porquê não cobriu)
  • Ameaças não cobertas identificadas (ligação a threat model quando aplicável)
  • Plano de mitigação por lacuna (owner + prazo)
  • Revisão e aprovação por role humano (AppSec/QA)

Artefactos & evidências. Relatório de cobertura comentado, list


📦 Artefactos esperados

Cada teste deixa um rasto tangível.
Estes artefactos são o que permite comprovar segurança perante auditorias ou clientes:

ArtefactoEvidência
Estratégia de testesDocumento versionado
Relatórios SAST/DAST/IASTSARIF / HTML
SBOMCycloneDX/SPDX
RegressõesCódigo + CI logs
Checklist de releaseDocumento PR final + assinaturas
Relatório PenTestPDF/MD + PoCs
Registo de exceçõesFerramenta GRC
Plataforma centralizada de findingsDefectDojo, Vulcan, ou similar
Webhooks e integrações de feedbackConfiguração YAML + logs notificações
Dashboard de KPIsPrometheus/Grafana + relatórios mensais

⚖️ Matriz de proporcionalidade L1–L3

A proporcionalidade evita tanto excesso como insuficiência.
O objetivo é calibrar testes de acordo com a criticidade da aplicação:

PráticaL1L2L3
SASTAvisoBloqueio High/CriticalBloqueio Medium+
DASTManualAutomático autenticadoAutomático + cobertura ampliada
IASTN/ARecomendado (críticos)Obrigatório (cobertura total)
FuzzingOpcionalEndpoints prioritáriosEndpoints críticos
RegressõesCasos críticosPor findingsObrigatório
PenTestingN/AOcasionalPré-produção obrigatório
Gestão findingsBacklog simplesCentralizado com SLACentralizado + auditoria
ReleaseChecklist simplesBloqueio High/CriticalNenhum crítico sem exceção

🏁 Recomendações finais

  • Testar cedo e sempre: integrar SAST no PR e regressões desde o 1.º sprint.
  • Validar runtime: DAST autenticado e fuzzing em staging são essenciais.
  • Ajustar ao risco: thresholds e políticas devem seguir L1–L3.
  • Evidência concreta: relatórios, SBOM e logs versionados são a base da auditoria.
  • Complementaridade: Pentesting humano desafia e confirma a automação.
  • Cultura contínua: testes não são fim, mas ciclo permanente de validação.