feat: Add DigestUpsertRequest and LockEntity models
Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Mirror Thin Bundle Sign & Verify / mirror-sign (push) Has been cancelled

- Introduced DigestUpsertRequest for handling digest upsert requests with properties like ChannelId, Recipient, DigestKey, Events, and CollectUntil.
- Created LockEntity to represent a lightweight distributed lock entry with properties such as Id, TenantId, Resource, Owner, ExpiresAt, and CreatedAt.

feat: Implement ILockRepository interface and LockRepository class

- Defined ILockRepository interface with methods for acquiring and releasing locks.
- Implemented LockRepository class with methods to try acquiring a lock and releasing it, using SQL for upsert operations.

feat: Add SurfaceManifestPointer record for manifest pointers

- Introduced SurfaceManifestPointer to represent a minimal pointer to a Surface.FS manifest associated with an image digest.

feat: Create PolicySimulationInputLock and related validation logic

- Added PolicySimulationInputLock record to describe policy simulation inputs and expected digests.
- Implemented validation logic for policy simulation inputs, including checks for digest drift and shadow mode requirements.

test: Add unit tests for ReplayVerificationService and ReplayVerifier

- Created ReplayVerificationServiceTests to validate the behavior of the ReplayVerificationService under various scenarios.
- Developed ReplayVerifierTests to ensure the correctness of the ReplayVerifier logic.

test: Implement PolicySimulationInputLockValidatorTests

- Added tests for PolicySimulationInputLockValidator to verify the validation logic against expected inputs and conditions.

chore: Add cosign key example and signing scripts

- Included a placeholder cosign key example for development purposes.
- Added a script for signing Signals artifacts using cosign with support for both v2 and v3.

chore: Create script for uploading evidence to the evidence locker

- Developed a script to upload evidence to the evidence locker, ensuring required environment variables are set.
This commit is contained in:
StellaOps Bot
2025-12-03 07:51:50 +02:00
parent 37cba83708
commit e923880694
171 changed files with 6567 additions and 2952 deletions

View File

@@ -0,0 +1,70 @@
# Competitor Ingest Normalization (CM1)
## Purpose
Define how external SBOM/scan outputs (Syft, Trivy, Clair) are normalized into StellaOps schemas with deterministic ordering, provenance checks, and offline-ready adapters. Covers CM1CM10 in the 31-Nov-2025 findings advisory.
## Scope
- Import pipeline for external SBOM + vulnerability scan payloads.
- Adapter mappings, validation, provenance/signature verification, and fallback rules.
- Offline ingest kits (adapters + fixtures) and regression tests.
## Deliverables (CM tasks)
- CM1: Mapping tables per tool → StellaOps SBOM/scan schema; required/optional fields; deterministic sort rules.
- CM2: Signature/provenance verification policy (acceptable algorithms, trust roots, failure modes).
- CM3: Snapshot governance: versioning, freshness SLA, rollback plan for imported feeds.
- CM4: Anomaly regression suite (schema drift, nullables, encoding, ordering). Golden fixtures + hashes.
- CM5: Offline ingest kit: DSSE-signed adapters/mappings/fixtures with tool versions and hashes.
- CM6: Fallback hierarchy when data incomplete (signed SBOM → unsigned SBOM → scan → defaults) with explicit decision trace.
- CM7: Source transparency fields (tool name/version/hash, build metadata) persisted and surfaced.
- CM8: Benchmark parity plan with upstream tools (pinned versions, hash-logged runs).
- CM9: Coverage matrix by ecosystem; gap tracker.
- CM10: Retry/backoff/error taxonomy and deterministic diagnostics.
## Determinism & Validation
- Adapters must sort components and vulnerabilities deterministically (locale-invariant, stable keys).
- All mapping rules and fixtures carry BLAKE3/SHA256 hashes; adapters are pure functions (no network).
- Signature verification rejects unverifiable payloads; logs reason codes; can run offline using bundled trust roots.
## Adapter mapping skeleton (CM1)
- Tool coverage v0.1: Syft 1.0.x, Trivy 0.50.x, Clair 6.x (pin exact versions in fixtures).
- Mapping tables (CSV, checked in under `docs/modules/scanner/fixtures/competitor-adapters/`):
- component: external fields → `name`, `version`, `purl`, `type`, `hashes`, `licenses`, `evidenceRef`.
- vulnerability: `id`, `source`, `severity` (normalised), `cvss` (score/vector), `fixVersions`, `evidenceRef`.
- metadata: tool name/version/hash, scan timestamp (UTC), data source.
- Sorting: components by `purl``name``version`; vulns by `id``source``severityScore` desc → `cvss.vector`.
## Verification policy (CM2)
- Acceptable signatures: DSSE/COSE/JWS with SHA256/Ed25519/ECDSA; trust roots bundled in offline kit.
- Provenance check: require signer identity + hash match; if missing, mark provenance = `unknown` and apply fallback (CM6).
## Snapshot governance (CM3)
- Freshness budget: max age 7 days from `scanTimestamp`; reject older unless override flag set (logged).
- Versioning: stored as `snapshot_version` (semver) and `source_tool_hash`; rollback plan requires prior snapshot hash.
## Regression + fixtures (CM4/CM5)
- Fixtures under `docs/modules/scanner/fixtures/competitor-adapters/fixtures/` with golden hashes (BLAKE3/SHA256) and expected normalized output.
- CI step runs adapter → normalized → hash compare; offline, no network.
## Fallback hierarchy (CM6)
1) Signed SBOM w/ valid provenance → accepted.
2) Unsigned SBOM → accepted with `provenance=unknown`, warnings emitted.
3) Scan-only results → accepted with degraded confidence; policy lattice may penalize.
4) If all absent: reject with reason code `no_evidence`.
## Transparency & coverage (CM7CM9)
- Persist: `source.tool`, `source.version`, `source.hash`, `adapter.version`, `normalized_hash`.
- Coverage matrix maintained in `docs/modules/scanner/fixtures/competitor-adapters/coverage.csv` (ecosystem yes/no, notes).
- Bench parity (CM8): pin upstream versions; store run hashes/logs in fixtures folder.
## Error taxonomy (CM10)
- Retryable: network/unavailable (should not occur in offline mode), rate-limit, transient IO.
- Non-retryable: signature_invalid, schema_invalid, unsupported_version, no_evidence.
- All errors must carry deterministic reason codes and be logged in normalized output metadata.
## Open Items
- Decide minimal evidence set for accepting unsigned SBOMs (intermediate level before scan-only fallback).
- Confirm which hash (BLAKE3/SHA256) is canonical for adapter outputs.
## Links
- Sprint: `docs/implplan/SPRINT_0186_0001_0001_record_deterministic_execution.md` (CM1CM10)
- Advisory: `docs/product-advisories/31-Nov-2025 FINDINGS.md`

View File

@@ -0,0 +1,70 @@
# Scanner Standards Convergence Roadmap (SC1)
## Purpose
Define the concrete steps for adopting CVSS v4.0, CycloneDX 1.7 (incl. CBOM), and SLSA 1.2 across Scanner surfaces while keeping outputs deterministic and downgrade-friendly.
## Scope
- Scanner WebService + Worker + Replay bundles.
- Surface contracts, CLI outputs, and CAS artifacts.
- Downgrade adapters to CVSS v3.1, CDX 1.6, SLSA 1.0 (see SC4).
## Deliverables (tie to SC tasks)
- SC1: Roadmap with milestones, owners, and schema bump governance.
- SC2: Deterministic CDX 1.7 + CBOM contract (fields, ordering, evidence citations).
- SC3: SLSA Source Track capture fields for replay bundles (build-id, repo refs, provenance hooks).
- SC4: Mapping tables for downgrade adapters; deterministic mapping rules and hashes.
- SC5/SC8: Fixture set + determinism CI (stable ordering, seeded RNG, golden hashes).
- SC6: Binary ↔ source evidence alignment requirements (build-id, symbols, patch oracle) feeding policy/VEX.
- SC7: API/UI surfacing contract (filters, columns, pagination defaults) with deterministic ordering.
- SC9: Governance/RACI for schema bumps and adapter tables.
- SC10: Offline-kit parity: DSSE-signed schemas/mappings/fixtures, frozen bundle.
## Contracts & owners (v0.1)
- Schema leads: Scanner Guild (CDX 1.7/CBOM), Sbomer Guild (mapping), Policy Guild (severity/vectors), Ops Guild (offline kit).
- Canonical CDX 1.7/CBOM fields (min set):
- `metadata/component` (purl, hashes, evidence refs),
- `services` with CBOM channels (ingress/egress),
- `vulnerabilities[*].ratings[]` must carry CVSS v4 and v3.1 side-by-side; deterministic order: v4 first, then v3.1.
- Evidence citations: `properties["evidence:source"]`, `properties["evidence:proof-id"]`, `properties["evidence:hash"]`.
- SLSA Source Track (SC3):
- replay bundle fields: `source.repo`, `source.ref`, `build.id`, `build.invocation.hash`, `provenance.dsse` (hash), all required.
- Deterministic ordering rules (apply across SC2/SC5/SC8):
- sort components by `purl`, ties by `name`, then `version` (ordinal, case-insensitive);
- vulnerabilities sorted by `id`, then `source`, then severity score desc;
- timestamps UTC ISO-8601 without sub-ms; decimal rounding 4dp for ratios, 2dp for scores.
- Adapter tables (SC4): mapping CSVs checked in under `docs/modules/scanner/fixtures/adapters/` with BLAKE3 + SHA256 hashes; adapters are pure, no net.
## Fixtures (SC5/SC8)
- Add to `docs/modules/scanner/fixtures/cdx17-cbom/`:
- `sample-cdx17-cbom.json` (golden), `sample-cdx16-downgraded.json`, `hashes.txt` (BLAKE3, SHA256).
- Include CBOM ingress/egress example, CVSS v4 vector, SLSA Source Track fields, evidence properties.
- CI step: `dotnet test` hook runs deterministic serializer + hash assertion; env `DOTNET_DISABLE_BUILTIN_GRAPH=1`, fixed `TZ=UTC`, `LC_ALL=C`.
## Governance (SC1/SC9)
- Propose RACI: Product (A), Scanner TL (R), Sbomer TL (C), Policy TL (C), Ops (I).
- Schema bump flow: draft → review → freeze → DSSE-sign schemas + fixtures → publish hash list → lock downgrade adapters.
- Downgrade adapters cannot ship without approved mapping CSV + updated hashes.
## Offline (SC10)
- Offline kit must include: schemas, adapter CSVs, fixtures, hash list, DSSE envelope, tool versions (Syft/Trivy pinned) and their hashes.
- Bundle path: `out/offline/scanner-standards-kit-v1/`. DSSE envelope references manifest with all hashes.
## Milestones (proposed)
1) Schema draft freeze (CDX 1.7/CBOM + CVSS v4 fields) — owners: Scanner Guild, due T+5d.
2) Replay bundle field list for Source Track — owners: Scanner + Sbomer, due T+7d.
3) Determinism harness upgrade (CI + fixtures) — owners: QA + Scanner, due T+10d.
4) Downgrade adapter tables + hash tests — owners: Scanner, due T+12d.
5) Offline-kit bundle update & DSSE signing — owners: Ops, due T+14d.
## Determinism & Offline requirements
- Stable field ordering, culture-invariant formatting, UTC ISO-8601 timestamps.
- No network calls during conversion/adapters; fixed seeds for any RNG.
- All schemas/adapters/fixtures shipped in offline kit with DSSE envelope and recorded hashes.
## Open Items
- Confirm CBOM section subset required for policy engine (ingredients vs evidence-only).
- Decide default CVSS v4 vector precision and rounding rules.
## Links
- Sprint: `docs/implplan/SPRINT_0186_0001_0001_record_deterministic_execution.md` (tasks SC1SC10)
- Advisory: `docs/product-advisories/31-Nov-2025 FINDINGS.md`

View File

@@ -0,0 +1,4 @@
# Downgrade Adapters (SC4)
- Location for mapping CSVs converting CVSS v4→v3.1, CDX 1.7→1.6, SLSA 1.2→1.0.
- Each CSV must include BLAKE3 and SHA256 hash recorded in accompanying `hashes.txt`.
- Adapters are pure (no network); determinism enforced in CI.

View File

@@ -0,0 +1 @@
mapping-cdx17-to-cdx16.csv: BLAKE3=<TBD> SHA256=<TBD>

View File

@@ -0,0 +1,4 @@
# CDX 1.7 + CBOM Fixtures (SC2/SC5/SC8)
- Golden payloads: `sample-cdx17-cbom.json`, downgraded `sample-cdx16.json`, with `hashes.txt` (BLAKE3, SHA256).
- Must include CVSS v4 + v3.1 ratings, CBOM ingress/egress, evidence properties, SLSA Source Track fields.
- Used by determinism CI to assert stable ordering/hashes.

View File

@@ -0,0 +1,3 @@
# placeholder; compute BLAKE3 and SHA256 after schemas stabilize
sample-cdx17-cbom.json: BLAKE3=<TBD> SHA256=<TBD>
sample-cdx16.json: BLAKE3=<TBD> SHA256=<TBD>

View File

@@ -0,0 +1,41 @@
{
"bomFormat": "CycloneDX",
"specVersion": "1.7",
"serialNumber": "urn:uuid:00000000-0000-4000-8000-000000000001",
"version": 1,
"metadata": {
"timestamp": "2025-01-01T00:00:00Z",
"component": {
"type": "application",
"name": "demo-app",
"version": "1.0.0",
"purl": "pkg:demo/demo-app@1.0.0",
"hashes": [ { "alg": "SHA-256", "content": "d" } ],
"evidence": { "properties": [ { "name": "evidence:source", "value": "fixture" } ] }
},
"tools": [ { "vendor": "stellaops", "name": "scanner", "version": "0.0.0-fixture" } ]
},
"services": [
{
"name": "api",
"properties": [
{ "name": "cbom:ingress", "value": "https" },
{ "name": "cbom:egress", "value": "postgres" }
]
}
],
"components": [
{ "type": "library", "name": "lib-a", "version": "1.2.3", "purl": "pkg:demo/lib-a@1.2.3" },
{ "type": "library", "name": "lib-b", "version": "2.0.0", "purl": "pkg:demo/lib-b@2.0.0" }
],
"vulnerabilities": [
{
"id": "CVE-0000-0001",
"source": { "name": "NVD" },
"ratings": [
{ "source": { "name": "NVD" }, "method": "CVSSv4", "score": 8.0, "vector": "CVSS:4.0/AV:N/AC:L" },
{ "source": { "name": "NVD" }, "method": "CVSSv3.1", "score": 7.5, "vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" }
]
}
]
}

View File

@@ -0,0 +1,4 @@
# Competitor Adapters (CM1CM10)
- Place mapping CSVs for Syft/Trivy/Clair → StellaOps normalized schema.
- Store golden fixtures under `fixtures/` with expected normalized output + `hashes.txt` (BLAKE3, SHA256).
- Keep coverage matrix in `coverage.csv`; benchmark logs/hashes alongside fixtures.

View File

@@ -0,0 +1 @@
# Golden outputs for Syft/Trivy/Clair fixtures; fill after adapter code lands