Files
gstack/lib/cso/images/README.md
T
Garry TanandOpenAI Codex 4a3c6a8a3c v1.87.0.0 feat: add verified CSO audits and replayable repair bundles (#2852)
* feat(cso): add verified audits and replayable repair bundles

* fix(cso): harden qualification and setup boundaries

* fix(cso): assemble security canaries at runtime

* fix(cso): bound release proof and maintenance work

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): require complete evaluation reports

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): replay expired snapshots from supplied source

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(cso): synchronize DNS cancellation assertion

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* chore(ship): exempt repository owner from liveness proof

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(cso): make recheck retention overlap deterministic

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* chore: bump version and changelog (v1.85.0.0)

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): pass native release gates

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* chore: move release to v1.86.0.0

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): resolve rechecks by finding

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* chore: move release to v1.87.0.0

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): pass macOS and Windows release gates

Normalize BSD wc output, compare Windows paths by filesystem identity, preserve portable snapshot race coverage, and narrow POSIX-only Windows fixtures.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cso): harden native verification gates

* fix(cso): refine Windows native diagnostics

* test(cso): isolate Windows Git startup failure

* test(cso): stabilize Windows native diagnostics

* fix(cso): support hardened Git on Windows

* fix(cso): close final verification gaps

* test(cso): bound cold Docker fixture setup

* fix(cso): restore cross-platform free-suite gates

---------

Co-authored-by: OpenAI Codex <noreply@openai.com>
2026-09-14 15:14:58 -07:00

6.5 KiB

CSO runtime build and qualification

These recipes are trusted runtime inputs, not application Dockerfiles. The base and tool inputs are reviewed and pinned per native platform; the resulting gstack images are not yet published or qualified. runtime-catalog.json records all ten build-reviewed profiles and deliberately contains no executable image until the release gates have passed.

Trusted CI re-resolves each recorded source tag to its reviewed index digest, proves that the native manifest is a member of that index, inspects its native image configuration, and executes exact version probes without network access. It validates BASE_IMAGE (and Python's UV_IMAGE) as reviewed repository@sha256:<64 lowercase hex> references before building. Build each profile on Linux amd64 and arm64, record exact runtime and package-manager versions, generate an SBOM and provenance attestations, and verify those attestations before proposing a catalog change. The catalog records their digests, the source commit, and the qualification run. A tag, a successful image build, or an agent-provided qualified assertion is insufficient.

The Rails base additionally needs a compiler, SQLite and PostgreSQL development headers, and the exact Bundler version from its supported fixture matrix. Unsupported native libraries are prerequisites. The Python base includes pip; the separate uv image supplies the exact qualified uv executable.

The PostgreSQL sidecar is a separate qualified image. It runs as fixed uid/gid 10001, creates every validated synthetic Rails database from a read-only policy, and exposes PostgreSQL only on the reproduction group's loopback namespace. Qualification must prove readiness for every declared database before Rails is started and must rebuild a fresh sidecar for each before/after phase.

All recipes use the fixed /opt/cso/entrypoint, uid/gid 10001, and no application source. The runner must still impose network namespaces, seccomp, dropped capabilities, no-new-privileges, a read-only root, bounded tmpfs mounts, resource admission, disabled daemon logging, and a detached watchdog. The image's USER and ENTRYPOINT alone provide none of those guarantees.

Each application image also contains the compiled /opt/cso/preparation helper. Its reviewed version is recorded as cso-preparation: 1.0.0 in the image build inputs and runtime catalog. Qualification exercises its registry-broker forwarder, lock-bound archive manifest, and offline cache seeding before a digest can be promoted.

Application qualification also exercises the embedded /opt/cso/verifier against positive and deliberately failing assertions. This is independent of the cold-start and private held-out repair gates. PostgreSQL uses its separate multi-database and readiness qualification and cannot present application-only qualification fields.

The Bun image includes a reviewed /opt/cso/no-auto-install.toml. Canonical Bun start and test commands also pass --no-install and that exact config, so target execution cannot trigger Bun's runtime automatic installer. The earlier offline bun install phase still runs admitted lifecycle scripts with network disabled.

preparation.ts emits acquisition metadata and command descriptions. Acquisition containers receive that metadata and verified public archives only; project code, Gemfiles, hooks, and native extensions run in subsequent network-none containers. Registry host restrictions require the trusted runner's deny-by-default egress mechanism and redirect/DNS checks. Package-manager flags alone are insufficient.

Source references inspected for these contracts:

Version the catalog together with helper ABI 3. A rollback selects the previous compatible pair. Persisted reports remain readable independently of which runtime pair is active.

Pull requests run the native build-only matrix without registry publication. Protected main publishes staging images. A separate protected promotion workflow accepts exactly ten qualified-runtime.json statements from one successful main run, checks them against the reviewed build matrix, and emits an attested runtime-catalog.candidate.json. It verifies that attestation against the exact candidate bytes, source commit, protected-main ref, and promotion workflow identity. A previous-revision compare-and-swap then copies those exact bytes to a fresh branch and opens an ordinary review PR. The workflow never updates main directly. The catalog validator also recomputes the retained runtime-matrix digest; the complete release-gate statement digest remains a separate provenance field.

GHCR creates each new staging package private. After its bootstrap publication, a package administrator must make it public in GitHub's package settings before the workflow can continue; GitHub treats that visibility change as irreversible. Staging, native qualification, private qualification ingress, and catalog promotion all fail closed unless GitHub's package API reports public and a Docker client using a fresh config with empty auths pulls the exact platform digest. The protected workflows never treat their own GHCR login as evidence that users can acquire a promoted runtime.

Each application statement must attest successful containment, public-only acquisition, offline lifecycle work, cold start, positive and deliberately failing verifier assertions, watchdog cleanup, secret-canary checks, the accuracy gates, and a private held-out runtime-tested repair. Rails also requires both database modes and native extensions. PostgreSQL requires containment, cold start, multiple databases, readiness, watchdog cleanup, and secret canaries. Until a protected run produces all ten statements, the reviewed profiles remain visible to --doctor but target execution returns MISSING_QUALIFIED_RUNTIME.

The protected cso-runtime-release environment also defines CSO_QUALIFICATION_ACTOR, the service account allowed to send the cso-runtime-qualified repository dispatch. The ingress workflow verifies the actor, re-verifies each staged OCI provenance and SBOM attestation, normalizes the evidence to its own run identity, and validates the full matrix before it uploads cso-qualified-runtime-statements. Private assertion content never enters this repository or the artifact.