Spaces:
Runtime error
Runtime error
File size: 3,544 Bytes
cd8bd0a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ---
title: "Supply-Chain Gates"
---
# Supply-Chain Gates (Fase 8 · Bloco A)
OmniRoute publica artefatos npm + Docker. Estes gates dão proveniência,
inventário (SBOM) e scan de CVE, todos OSS, plugados nos workflows de release.
Postura **advisory-first** — reportam agora, promovem a bloqueante depois do 1º
release verde.
| Gate | Ferramenta | Onde | Bloqueia? | Saída |
|---|---|---|---|---|
| SLSA provenance (npm) | `npm --provenance` (OIDC) | `npm-publish.yml` | só se publish falhar | badge npmjs / `npm audit signatures` |
| SBOM npm | `@cyclonedx/cyclonedx-npm` | `npm-publish.yml` | só se geração quebrar | asset do Release + artifact |
| SBOM imagem | `anchore/sbom-action` (syft) | `docker-publish.yml` (merge) | advisory | artifact CycloneDX |
| Trivy CVE (SARIF) | `aquasecurity/trivy-action` | `docker-publish.yml` (merge) | advisory | SARIF (HIGH+CRITICAL) → aba Security |
| Trivy CRITICAL gate | `aquasecurity/trivy-action` | `docker-publish.yml` (merge) | **bloqueante** | `exit-code: '1'` em CRITICAL fixável |
| osv vulnCount | `osv-scanner` (`check:vuln-ratchet --ratchet`) | `ci.yml` (`quality-extended`) | **bloqueante** | catraca `metrics.vulnCount` (direction:down) |
| OpenSSF Scorecard | `ossf/scorecard-action` | `scorecard.yml` (cron) | advisory | SARIF → Security + badge |
A catraca de CVE da imagem usa **dois passos** no `docker-publish.yml`: o passo
SARIF (`HIGH,CRITICAL`, `exit-code: 0`) mantém HIGH+CRITICAL visíveis na aba Security
sem bloquear; o passo *CRITICAL gate* (`severity: CRITICAL`, `ignore-unfixed: true`,
`exit-code: 1`) falha o release num CVE CRÍTICO **com fix disponível**. `ignore-unfixed`
evita travar o release por um CVE de base-image sem patch upstream.
## ⚠️ Variância de CVE (gates osv/Trivy bloqueantes)
osv e Trivy comparam as deps contra bancos de CVE que **crescem continuamente**. Um PR
que **não toca nenhuma dependência** pode subitamente ficar vermelho porque um CVE novo
foi divulgado numa dep já presente (osv: `vulnCount` medido > baseline; Trivy: um novo
CRITICAL fixável na imagem). **Isso é comportamento operacional ESPERADO de um gate de
CVE bloqueante, não uma regressão de produto.**
Quando osv ou Trivy ficam vermelhos por um CVE recém-divulgado, o remédio é:
1. **Bumpar a dep afetada** (preferível) — sobe a versão patcheada via `package.json`
`overrides` (deps transitivas) ou rebuild da imagem sobre uma base patcheada.
2. **Se não houver fix upstream:**
- **osv:** re-baseline `metrics.vulnCount` em `config/quality/quality-baseline.json`
(`npm run quality:ratchet -- --update` não cobre dedicated gates — edite o valor à
mão, `direction:down`) com uma nota de justificativa + issue de tracking.
- **Trivy:** adicione uma entrada em `.trivyignore` (CVE-ID por linha) com um comentário
de justificativa + issue de tracking. `ignore-unfixed: true` já cobre os CVEs sem
patch automaticamente.
Os dois gates **SKIP gracioso** (exit 0) quando a ferramenta está ausente ou a medição
falha (osv-scanner fora do PATH, osv.dev/rede inacessível, JSON inválido) — uma falha de
**medição** nunca bloqueia, só uma regressão **medida** bloqueia.
## Backlog: Scorecard advisory → bloqueante
Depois do 1º release verde com Scorecard reportando:
- Scorecard: catraca de score (congela o score medido; não pode cair).
Casa com os gates da Fase 7 (osv-scanner, gitleaks, actionlint+zizmor): zizmor
audita os próprios workflows; Scorecard mede a postura do repo no agregado.
|