--- 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.