Cross-repo artifact isolation is a storage path prefix over one shared credential, not an access boundary #15
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?
Why
Artifacts are "scoped per repository" only by a storage key prefix (
<prefix>/<scope>/artifacts/<run-id>/...), where the scope is read from therepositoryinput,GITHUB_REPOSITORY, orRASTER_ARTIFACTS_SCOPE, all set inside the CI job, while every repo shares one S3 credential. So any repo's workflow can set the scope to another repo and read its artifacts; therepositoryinput is the sanctioned way to do exactly that. On a shared runner pool this lets one repo read another repo's build artifacts. This mirrors the shared-cache isolation concern (cache-action #95) on the artifact plane.Current code
The download action exposes cross-repo reads:
The scope is whatever the job supplies, with no check that it matches the running repo:
The write side documents the override as the "isolation prefix" over the same shared
RASTER_ARTIFACTS_S3_*credentials:Suggested first PR
Treat the prefix as convenience, not a security boundary: document explicitly that cross-repo / cross-tenant isolation requires separate per-scope credentials (or a signed scope claim) at the storage backend, and gate the
repository/RASTER_ARTIFACTS_SCOPEoverride behind an opt-in so a plain job cannot silently read another repo's scope. Longer term, mint per-repo (or per-run) scoped credentials instead of one shared key.Found in the 2026-07-05 next-wave sweep; grounding re-verified at filing time.