CI artifact poisoning across a workflow trust boundary
A higher-trust workflow treats attacker-controlled test/build output as executable code or authoritative release input without adequate producer and content constraints.
Candidate CWE: CWE-829
Test hypothesis#
Follow artifact producer, run ID/repository association, selection criteria, extraction, and consumer. In an owned workflow pair, create a harmless marker artifact and observe whether the privileged consumer executes or publishes its controlled content. Also test that an artifact from the wrong run is rejected.
Evidence required#
Producer and consumer workflow revisions, artifact digest, selection rule, exact executed/packaged path, consumer identity, and rejected-control result. An attacker-created artifact alone does not prove a privileged consumer accepts it.
Rule out false positives#
Correct producer binding plus safe data-only parsing prevents the claimed effect; a generic artifact name is accompanied by strong run constraints; or the artifact never reaches an authoritative consumer.
Playbook and command references#
- 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.
- Dependencies: from advisory match to reachable impact — Separate composition, advisory matching, runtime reachability, and exploit prerequisites so dependency reports describe product impact.
- 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.
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#
- T1195.002 · Supply Chain Compromise: Compromise Software Supply Chain — Only if: A controlled release/update workflow accepts modified application code or a substituted compiled artifact before delivery to its final consumer; prove consumption in a lab. Not established by: Access to a build log, ability to upload an unused artifact, or an ordinary software vulnerability does not establish malicious software distribution.