GitLab job token crosses an unintended project boundary
A contribution-controlled job acquires access to a private receiving-project resource beyond the CI integration contract.
Candidate CWE: CWE-863
Test hypothesis#
Use two owned projects and one private synthetic artifact. Compare the same resource request from the intended job context and a disallowed controlled project/actor. Record receiving-project allowlist, feature visibility, fine-grained restrictions, and triggering-user permissions; do not assume allowlisting alone grants access.
Evidence required#
Pipeline and job IDs, source/receiving project IDs, trigger actor, exact canary and allowed/denied results, with token values redacted.
Rule out false positives#
Intentionally public artifacts, an expired token, a denied endpoint, or access deliberately granted to the triggering user and originating project.
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.
- CI and releases: trace untrusted input into privileged work — Audit workflow events, shell interpolation, untrusted builds, artifact consumers, and release identity as one privilege chain.
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.