Matriz de Riscos¶
Este documento consolida os riscos do projeto Quorum (quorum-sec-scan, v0.2.3) — uma ferramenta CLI/Docker de consensus security scanning — organizados por categoria (Técnicos, Negócio, Segurança, Operação, Infraestrutura, Financeiro, Legal). Para cada risco há ID, descrição, probabilidade, impacto, severidade (calculada por matriz), mitigação, owner e status. O foco está em riscos reais e verificáveis no código: dependência de versões/saídas dos scanners externos, supply chain, indisponibilidade da OSV.dev, crosswalk desatualizado/ilustrativo, falsos negativos por mount/config errados, envelhecimento do banco do Grype e bus factor de manutenção OSS.
Referências de código verificadas para este documento:
README.md,DESIGN.md(§6 correlação, §7 alias, §8 crosswalk, §9 consenso, §12 supply chain, §14 riscos),internal/orchestrator/orchestrator.go,action.yml,.github/workflows/release.yml. Cross-link interno: 01 — Visão Geral.Escopo (N/A explícito). O Quorum é CLI/Docker only: não há frontend web, banco de dados relacional, API REST HTTP, autenticação/contas de usuário nem IA/LLM. Por isso, classes inteiras de risco típicas de aplicações server-side — injeção em endpoints HTTP, vazamento de PII em banco, comprometimento de sessão/autenticação, DDoS de serviço, custo de cloud de runtime — são tratadas como N/A com justificativa técnica (ver §9 Riscos N/A). Os riscos catalogados refletem a arquitetura as-is: um orquestrador stateless que faz shell-out para scanners OSS e roda em pipelines de CI/CD.
1. Metodologia¶
1.1 Escalas¶
Probabilidade (P) — chance de o risco se materializar no horizonte de ~12 meses de operação:
| Nível | Rótulo | Critério |
|---|---|---|
| 1 | Rara | Improvável; depende de evento externo incomum |
| 2 | Baixa | Pode ocorrer, mas não é esperado |
| 3 | Média | Plausível dentro do ciclo normal de uso |
| 4 | Alta | Esperado ocorrer ao menos uma vez |
| 5 | Quase certa | Recorrente / contínuo por natureza |
Impacto (I) — consequência caso o risco se materialize:
| Nível | Rótulo | Critério |
|---|---|---|
| 1 | Insignificante | Cosmético; sem efeito no resultado do scan |
| 2 | Menor | Degradação localizada; contornável |
| 3 | Moderado | Falha parcial; resultado menos confiável, mas detectável |
| 4 | Grave | Falso negativo silencioso ou gate incorreto em CI |
| 5 | Crítico | Comprometimento de supply chain / decisão de segurança errada em produção |
1.2 Severidade (matriz P × I)¶
A severidade é o produto P × I, classificado em faixas:
| Faixa (P×I) | Severidade | Ação esperada |
|---|---|---|
| 1–4 | 🟢 Baixa | Aceitar / monitorar |
| 5–9 | 🟡 Média | Mitigar quando viável; revisar periodicamente |
| 10–14 | 🟠 Alta | Mitigação ativa exigida; owner nomeado |
| 15–25 | 🔴 Crítica | Mitigação prioritária; bloqueia "pronto para produção" |
1.3 Matriz de calor (heatmap textual)¶
Cada célula lista os IDs de risco cuja combinação (P, I) cai ali. Veja o catálogo nas seções 2–8.
IMPACTO →
1(Insig) 2(Menor) 3(Moder) 4(Grave) 5(Crítico)
P 5 ┃ · · T-01 T-02,O-01 ·
R 4 ┃ · T-06 S-03,O-02 T-03,T-04,S-04 S-01
O 3 ┃ · N-02 T-05,N-01 S-02,I-01,O-03 S-05,L-01
B 2 ┃ · F-02 L-02,I-02 F-01 I-03
. 1 ┃ · · · N-03 ·
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Legenda severidade: 🟢 baixa(≤4) 🟡 média(5–9) 🟠 alta(10–14) 🔴 crítica(≥15)
quadrantChart
title Risco — Probabilidade x Impacto
x-axis "Impacto baixo" --> "Impacto alto"
y-axis "Prob. baixa" --> "Prob. alta"
quadrant-1 "Crítico (mitigar já)"
quadrant-2 "Monitorar prob."
quadrant-3 "Aceitar / monitorar"
quadrant-4 "Mitigar impacto"
"T-02 saída scanner": [0.78, 0.92]
"T-03 crosswalk ilustrativo": [0.80, 0.80]
"T-04 falso negativo merge": [0.78, 0.80]
"S-01 supply chain scanners": [0.95, 0.80]
"S-04 mount errado": [0.80, 0.78]
"S-05 grype DB velho": [0.80, 0.62]
"O-01 0 findings = seguro": [0.92, 0.95]
"S-02 não verificar assinatura": [0.78, 0.60]
"T-01 OSV indisponível": [0.55, 0.90]
"I-03 GHCR/Actions outage": [0.78, 0.35]
"L-01 bus factor OSS": [0.62, 0.58]
2. Riscos Técnicos¶
Relacionados a corretude do produto, dependências de saída dos scanners, correlação e consenso.
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| T-01 | OSV.dev indisponível ou lenta durante a resolução de aliases (CVE↔GHSA). Sem resolução, o mesmo bug reportado como GHSA-… (Grype) e CVE-… (Trivy) pode virar dois findings e quebrar o consenso. |
3 | 5 | 🟠 15→Alta (cap. faixa) | Degradação graciosa já implementada (DESIGN.md §7): falha de rede ⇒ usa o id como veio, nunca derruba o scan. Cache local (~/.cache/quorum/aliases.json) reduz dependência. --offline desliga OSV deterministicamente. Aliases finding-local (Grype relatedVulnerabilities) cobrem parte dos casos sem rede. |
Core / Alias | Mitigado (residual: under-merge de VULN sob rede ruim) |
| T-02 | Mudança de formato de saída de um scanner externo (Trivy/Grype/Checkov/KICS/Dockle/Kubescape muda JSON/SARIF entre versões), quebrando o parser do adapter e produzindo findings ausentes ou malformados. | 5 | 4 | 🔴 20 Crítica | Teste de contrato obrigatório por adapter contra fixtures versionadas da saída real (internal/adapter/testdata, DESIGN.md §5); o teste quebra antes da produção. Pinagem de versão de scanner na imagem :full. Renovar fixtures a cada bump de versão. |
Adapters | Mitigado (detecção em CI) |
| T-03 | Crosswalk ilustrativo / desatualizado. Os números AVD/CKV e UUIDs de KICS em crosswalk/aws.yaml são explicitamente ilustrativos do formato (README.md, DESIGN.md §8). IDs incorretos ⇒ regras não casam ⇒ misconfig equivalente fica isolado (sem consenso). |
4 | 4 | 🔴 16 Crítica | Regra "na dúvida, não una": controle sem mapeamento fica unmapped, nunca chutado (DESIGN.md §6) — falha é segura (false split). Conferir IDs contra catálogos oficiais antes de produção. Crosswalk plugável via --crosswalk permite override pelo usuário. Cobertura inicial top-50 S3/IAM. |
Crosswalk / Conteúdo | Aberto (conteúdo a validar p/ prod) |
| T-04 | Falso merge (over-merge) em MISCONFIG. Por limitação conhecida, MISCONFIG correlaciona por basename(file) + resourceType + canonicalControl; dois recursos distintos do mesmo tipo com o mesmo controle no mesmo arquivo podem fundir-se (README.md "Known limitations"). |
4 | 4 | 🔴 16 Crítica | Princípio de design false split > false merge mitiga o inverso (não funde por padrão), mas este caso específico é trade-off aceito e documentado. Identidade por-recurso rastreada para release futuro. | Core / Correlate | Aberto (limitação documentada) |
| T-05 | Confiança (confidence) mal calibrada. A fórmula pondera nº de engines (log), diversidade de categoria, severidade e confirmação autoritativa (DESIGN.md §9); pesos fixos podem priorizar mal em domínios específicos. |
3 | 3 | 🟡 9 Média | Score determinístico e auditável; detectedBy/detectionCount expostos no relatório para o humano reavaliar. Contagem bruta deliberadamente não é confiança. Pesos versionáveis. |
Consensus | Monitorar |
| T-06 | Timeout por scanner / probe de versão mal dimensionados. Probe default 60s (defaultProbeTime) e --timeout 5m; em runner lento/saturado um scanner saudável pode ser marcado unavailable/timeout. |
4 | 2 | 🟡 8 Média | Probe já generoso (60s) e distingue timeout/killed(OOM)/não-instalado com mensagens acionáveis (orchestrator.go, runOne). ProbeTime/PerScannerTime configuráveis. Status sempre reportado (transparência). |
Orchestrator | Mitigado |
3. Riscos de Negócio¶
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| N-01 | Proposta de valor não compreendida ("é só mais um wrapper de scanner"). O diferencial é a camada de correlação + consenso, não a detecção. | 3 | 3 | 🟡 9 Média | Posicionamento claro na doc: "não é mais um scanner" (README.md, 01 — Visão Geral). Exemplo de detectionCount/confidence no topo do README. |
Produto / Docs | Mitigado |
| N-02 | Baixa adoção por atrito de instalação de múltiplos scanners. | 3 | 2 | 🟡 6 Média | Imagem :full self-contained (todos os scanners bundled) + GitHub Action composite (uses:) elimina instalação. Modo :slim para quem já tem scanners no PATH. |
Distribuição | Mitigado |
| N-03 | Concorrência / sobreposição com plataformas SaaS de ASPM. | 1 | 4 | 🟢 4 Baixa | Nicho deliberado: leve, plugável, CLI/Docker, sem lock-in, sem painel/daemon. Complementa (gera SARIF p/ GitHub code scanning / DefectDojo) em vez de competir. | Produto | Aceitar |
4. Riscos de Segurança¶
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| S-01 | Comprometimento de supply chain via binários de scanner embutidos na imagem :full. Os binários fazem parte do trust boundary do usuário; houve incidente de supply chain em Actions de scanners em 2026 (DESIGN.md §12). |
4 | 5 | 🔴 20 Crítica | Pinar cada ferramenta por digest/SHA, não tag mutável; validar checksum no build. Imagens/binários do Quorum assinados keyless com cosign (OIDC) + atestação SLSA build-provenance verificável (README.md, release.yml). Action composite cosign-verifica a imagem :full antes de rodar (action.yml). |
Supply chain / Release | Mitigado (recomenda-se pin por digest dos scanners) |
| S-02 | Usuário não verifica a assinatura/atestação antes de rodar a imagem/binário, aceitando artefato adulterado. | 3 | 4 | 🟠 12 Alta | Comandos cosign verify e gh attestation verify documentados no README; tag móvel v0 recomenda pin por @<sha> em produção. Verificação default no Action composite. |
Docs / Release | Mitigado (ação fica com o usuário) |
| S-03 | Vazamento de segredos via campo Raw (payload original do scanner preservado no Finding) caso a saída do scanner inclua segredos detectados (TypeSecret). |
4 | 3 | 🟠 12 Alta | --min-severity e baseline para filtrar; relatório é artefato controlado pelo usuário (CLI/Docker, sem upload automático para terceiros além do destino escolhido). Tratar artefatos SARIF/JSON como sensíveis nos pipelines. |
Core / Docs | Aberto (orientação a reforçar) |
| S-04 | Bind mount malformado ⇒ falso negativo. -v "%cd%/work" (sem :) monta /work vazio e reporta 0 findings para tudo — um falso negativo, não atestado de segurança (README.md). |
4 | 4 | 🔴 16 Crítica | Aviso explícito e exemplos por shell (cmd/PowerShell/bash) no README. Status por scanner (ran/skipped/unavailable) e o lema "0 findings is not proof of safety" ajudam a detectar (scanners rodaram mas 0 findings em base não-trivial é suspeito). |
Docs / Orchestrator | Mitigado parcialmente (detecção indireta) |
| S-05 | Banco de vulnerabilidades do Grype envelhecendo. A imagem :full traz o grype DB pré-cacheado; sem atualização, CVEs recentes deixam de ser detectados (falso negativo). |
3 | 5 | 🔴 15 Crítica | DB pré-cacheado garante funcionamento offline/determinístico, mas deve ser revalidado a cada release de imagem. Em ambiente com rede, Grype pode atualizar o DB. Reconstruir/republicar :full periodicamente. Documentar a data do DP empacotado. |
Release / Distribuição | Aberto (cadência de rebuild a definir) |
5. Riscos de Operação¶
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| O-01 | "0 findings" interpretado como "está seguro" quando, na verdade, nenhum scanner rodou (ausente, OOM, timeout, alvo errado). | 5 | 4 | 🔴 20 Crítica | Parte central do produto: status por scanner em todo relatório e o lema "0 findings is not proof of safety" (orchestrator.go ScannerRun, DESIGN.md §14). Resumo no stderr. |
Orchestrator / Docs | Mitigado |
| O-02 | Scanner ausente no modo :slim (orquestrador chama scanners do PATH) ⇒ cobertura reduzida silenciosamente. |
4 | 3 | 🟠 12 Alta | Scanner ausente vira unavailable e é pulado — o scan nunca falha só por isso, mas o status é reportado. list-scanners mostra o registrado. Imagem :full evita o problema. |
Orchestrator | Mitigado |
| O-03 | Configuração de gate errada (--fail-on/--min-severity) deixa passar risco real ou barra builds indevidamente; confusão de exit codes (1 gate vs 2 erro). |
3 | 4 | 🟠 12 Alta | Exit codes documentados (0 ok / 1 gate / 2 erro). Baseline .quorumignore por fingerprint com supressões sempre logadas. Exemplos de CI prontos em examples/ci/. |
Docs / CLI | Mitigado |
6. Riscos de Infraestrutura¶
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| I-01 | OOM / runner sem memória mata o probe ou o scanner (vários scanners pesados lançados em paralelo no fan-out). | 3 | 4 | 🟠 12 Alta | killedSignal detecta signal: killed e emite mensagem acionável ("likely OOM — increase container memory") (orchestrator.go). --scanners permite escopar o pool. Probe generoso de 60s. |
Orchestrator / Infra | Mitigado |
| I-02 | :full é linux/amd64 apenas (sem arm64); usuários em arm precisam do :slim (amd64+arm64) ou binário nativo. |
2 | 3 | 🟡 6 Média | Trade-off documentado: :full amd64 (todos scanners), :slim multiarch (README.md tabela de tags). Binários nativos via GoReleaser para várias plataformas. |
Distribuição | Aceitar (documentado) |
| I-03 | Indisponibilidade do GHCR / GitHub Actions afeta release e pull da imagem. | 2 | 4 | 🟡 8 Média | Imagens são cacheáveis; binários nativos como alternativa de distribuição. CI/CD via PR para main; release por tag semver restrita (v[0-9]+.[0-9]+.[0-9]+). |
Release / Infra | Aceitar (dependência de plataforma) |
7. Riscos Financeiros¶
O Quorum é OSS, CLI/Docker, sem serviço persistente nem cloud de runtime próprio, o que limita drasticamente a exposição financeira (sem custo de infra de produção, sem cobrança por uso).
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| F-01 | Custo de minutos de CI / armazenamento de pacotes no provedor (GitHub Actions/GHCR) cresce com matriz de build (multi-arch, multi-scanner). | 2 | 4 | 🟡 8 Média | Release acionado só por tag semver (não em todo push); :full restrito a amd64 reduz matriz; caches de build. |
Release / Infra | Mitigar |
| F-02 | Custo de manutenção / tempo de mantenedores (esforço, não desembolso direto) para acompanhar versões de 6 scanners + crosswalk. | 2 | 2 | 🟢 4 Baixa | Adapters plugáveis (isolam mudança); testes de contrato; crosswalk incremental top-50. Relacionado a L-01 (bus factor). | Manutenção | Monitorar |
8. Riscos Legais¶
| ID | Descrição | P | I | Sev | Mitigação | Owner | Status |
|---|---|---|---|---|---|---|---|
| L-01 | Bus factor / sustentabilidade da manutenção OSS. Dependência de poucos mantenedores e de 6 projetos OSS externos (qualquer um pode arquivar — cf. tfsec absorvido pelo Trivy, Terrascan arquivado nov/2025, DESIGN.md §2). |
3 | 5 | 🔴 15 Crítica | Arquitetura de adapters plugáveis: trocar um scanner morto = trocar um adapter, sem tocar no core (DESIGN.md §1). Escopo deliberadamente exclui ferramentas mortas/redundantes. Contribuições externas viabilizadas pela interface estável. |
Manutenção / Comunidade | Aberto (risco estrutural de OSS) |
| L-02 | Conformidade de licenças dos binários embutidos na imagem :full (cada scanner distribuído tem sua licença). |
2 | 3 | 🟡 6 Média | Auditar licença de cada binário distribuído na imagem (DESIGN.md §14). Projeto sob Apache-2.0; :slim não redistribui binários de terceiros. |
Legal / Release | Aberto (auditoria recomendada) |
9. Riscos N/A (por arquitetura)¶
Itens comuns em templates enterprise que não se aplicam ao Quorum, com justificativa técnica. Onde fizer sentido, há uma Proposta futura claramente separada.
| Categoria de risco (template) | Status | Justificativa |
|---|---|---|
| Injeção/OWASP em endpoints HTTP, CSRF, XSS | N/A | Não há frontend web nem API REST HTTP. O Quorum é um binário CLI / imagem Docker stateless. |
| Vazamento de PII em banco de dados | N/A | Não há banco de dados relacional. O único estado persistente é o cache de aliases em ~/.cache/quorum/aliases.json (IDs públicos de vuln, sem PII). |
| Comprometimento de autenticação/sessão/contas | N/A | Não há autenticação nem contas de usuário. Autorização é a do shell/CI onde o binário roda. |
| Alucinação / prompt injection / custo de tokens de IA | N/A | Não há IA/LLM no produto. Correlação e consenso são determinísticos (funções puras dos dados normalizados). |
| DDoS / disponibilidade de serviço online | N/A | Não há serviço/daemon exposto. A única chamada de saída (OSV.dev) é opcional e degrada graciosamente. |
| Custo de cloud de runtime / autoscaling | N/A | Sem cloud de runtime próprio; executa no CI/host do usuário. |
| Risco de runtime security (stream Falco/Tetragon) | N/A hoje | Modelo de stream fora de escopo. Proposta futura: módulo de runtime separado (roadmap README.md/DESIGN.md §13). |
10. Riscos críticos — visão consolidada¶
flowchart LR
subgraph criticos["🔴 Severidade Crítica (≥15)"]
T02["T-02 formato de saída do scanner muda"]
T03["T-03 crosswalk ilustrativo"]
T04["T-04 over-merge MISCONFIG"]
S01["S-01 supply chain dos scanners"]
S04["S-04 mount errado = 0 findings"]
S05["S-05 grype DB envelhecendo"]
O01["O-01 '0 findings' = seguro"]
L01["L-01 bus factor OSS"]
end
T02 --> contrato["Testes de contrato + fixtures versionadas"]
T03 --> nomatch["Regra do não-match (unmapped)"]
T04 --> futuro["Identidade per-recurso (futuro)"]
S01 --> cosign["cosign + SLSA + pin por digest"]
S04 --> status["Status por scanner + lema 0!=seguro"]
S05 --> rebuild["Rebuild/republish periódico do :full"]
O01 --> status
L01 --> adapters["Adapters plugáveis"]
11. Plano de tratamento (checklist acionável)¶
Prioridade pelos riscos 🔴/🟠. Itens marcam o que falta consolidar para "pronto para produção".
- [ ] T-03 / crosswalk: validar todos os IDs AVD/CKV e UUIDs de KICS contra catálogos oficiais antes de uso em produção.
- [ ] T-02: garantir cobertura de teste de contrato para os 6 adapters e revisar fixtures a cada bump de versão de scanner.
- [ ] S-01: converter referências de scanner na imagem
:fullde tag para@sha256:<digest>imutável. - [ ] S-05: definir cadência de rebuild/republish da
:fulle documentar a data do grype DB empacotado. - [ ] S-02: reforçar no README/CI a verificação cosign/SLSA e o pin do Action por
@<sha>. - [ ] S-03: orientar tratamento de SARIF/JSON como artefato sensível quando houver
TypeSecret. - [ ] O-01 / S-04: considerar warning automático quando todos os scanners rodaram (
ran) mas o total de findings é 0 em alvo não-trivial. - [ ] L-02: executar auditoria de licenças dos binários redistribuídos na
:full. - [ ] L-01: documentar processo de contribuição/substituição de adapter para reduzir bus factor.
- [ ] T-04: acompanhar implementação de identidade por-recurso para MISCONFIG.
12. Reavaliação¶
- Gatilhos de reavaliação: bump de versão de qualquer scanner; nova release de imagem/binário; mudança no esquema da OSV.dev; arquivamento/descontinuação de um scanner OSS; incidente de supply chain.
- Cadência sugerida: revisão da matriz a cada release semver (
v[0-9]+.[0-9]+.[0-9]+) e auditoria completa trimestral. - Owner do documento: mantenedor(es) do
quorum-sec-scan.
Premissas¶
- Versão. Documento alinhado à v0.2.3; severidades, mitigações e status refletem o código lido no momento da redação (
README.md,DESIGN.md,internal/orchestrator/orchestrator.go,action.yml,.github/workflows/release.yml). - Escopo de produto. O Quorum é CLI/Docker only (sem frontend web, banco relacional, API REST HTTP, autenticação/contas ou IA/LLM). Riscos correspondentes a esses componentes são N/A por decisão de arquitetura (ver §9).
- Escalas P/I/severidade são uma convenção deste documento (matriz 5×5, faixas de produto
P×I), não um artefato presente no código. Os valores numéricos de P e I são estimativas qualitativas dos mantenedores, não medições. - Caps de faixa. Quando
P×Iexcede 14, a severidade é "Crítica"; T-01 (15) é apresentado como Alta→limítrofe por já estar mitigado em código (degradação graciosa), refletindo o risco residual, não o bruto. - Catálogos ilustrativos. Os IDs AVD/CKV e UUIDs de KICS do crosswalk de exemplo são ilustrativos do formato e devem ser conferidos contra os catálogos oficiais antes de produção (T-03), conforme nota explícita no
README.mdeDESIGN.md§8. - Owners citados são papéis/áreas (Core, Adapters, Orchestrator, Crosswalk, Release/Distribuição, Docs, Manutenção/Comunidade, Legal), não pessoas nomeadas — o repositório não define um RACI formal.
- Dependência opcional de rede. A resolução de aliases via OSV.dev é opcional; o scan conclui sem conectividade (
--offlinea desativa). Isso fundamenta o status "mitigado" de T-01. - Cadeia de suprimentos como fronteira de confiança. Binários de scanner embutidos na
:fullintegram o trust boundary do usuário; a recomendação de pin por digest (S-01) ainda não está confirmada como aplicada noDockerfile(gap — ver retorno estruturado).