Artifact cross-repo isolation must be enforced store-side, not in the action #19
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Requirement
Artifact cross-repo isolation must be enforced by the artifact store or broker, not by JavaScript running inside the workflow job.
The store component that fronts S3 must scope artifact reads and writes by a credential/token the CI job can never mint, widen, or replace. The trusted runner/forge/broker should validate the real run identity out of band and issue a repo-scoped, short-lived artifact credential/token for that run. This should mirror the Fjord repo-scoped token model used for flux runner registration: the job can at most present the token to the store; it cannot choose the repository scope or provide the trust anchor.
Concretely:
RASTER_ARTIFACTS_S3_*credential to arbitrary jobs.GITHUB_REPOSITORY, action inputs, or other job-controlled env.Evidence
Two action-side fixes were bypassed because the action runs inside the attacker's job and all env-based trust anchors are attacker-controlled:
GITHUB_REPOSITORYwas set to the victim repo and the shared credential readrasterstate/paragonartifacts, extractingVICTIM-SECRET: #16 (comment)RASTER_ARTIFACTS_SCOPE_PUBLIC_KEYwas also job-controlled; the attacker self-signed a victim-scope claim and again extractedVICTIM-SECRET: #18 (comment)Even a pinned in-action verifier would not be sufficient while the shared S3 credential is present in the job, because an attacker can bypass the action entirely and call S3 directly.
Coordination
This likely needs a coordinated change in the artifact-store/broker component and matching upload/download action wiring. The action repos should not claim #15 is closed until the store-side boundary is deployed and tests prove a job from repo A cannot read or write repo B's artifact prefix using any job-controlled env or direct S3 calls.