Shared CI runner exposes private state across jobs
A job reaches a previous job's private filesystem or image material despite the runner's promised isolation.
Candidate CWE: CWE-668
Test hypothesis#
Use two owned fixture jobs on a disposable runner. Create one known synthetic marker or private fixture image in the first context; test only that predetermined resource from the restricted second job. Compare a fresh isolated runner and record cache/mount/pull policy.
Evidence required#
Runner/executor version, job identities, host/mount or image boundary, marker result and clean-runner comparison. Prove the promised isolation and the lower-trust job's attainable scheduling conditions.
Rule out false positives#
Deliberately shared cache data, identical trust domains, an intentionally preinstalled public image, or a marker made public by the fixture itself.
Playbook and command references#
- GitLab pipelines: contribution, job token and runner boundaries — Trace GitLab execution context, included configuration, downstream inputs, job-token permissions and runner reuse using private synthetic fixtures.
- Container and Kubernetes isolation — Test RBAC, workload identity, admission, networking and host exposure as separate enforcement layers.
Find the associated command snippets
Referenced by these target playbooks#
Report checklist#
- Capture the affected version, configuration, identities, and object ownership.
- Preserve a valid baseline and a negative control.
- Reproduce the forbidden data access, action, or state change on controlled fixtures.
- Explain the intended security rule and why the observed behavior violates it.
- State prerequisites, uncertainty, cleanup, and the smallest demonstrated impact.
Conditional ATT&CK mapping#
No direct ATT&CK mapping selected. Record the weakness and demonstrated impact without forcing an adversary-behavior classification. See the mapping guide.