# 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](https://cwe.mitre.org/data/definitions/829.html)

## 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](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/modules/supply-chain-ci.html) — Audit workflow events, shell interpolation, untrusted builds, artifact consumers, and release identity as one privilege chain.
- [Dependencies: from advisory match to reachable impact](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/modules/dependency-reachability.html) — Separate composition, advisory matching, runtime reachability, and exploit prerequisites so dependency reports describe product impact.
- [GitLab pipelines: contribution, job token and runner boundaries](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/modules/gitlab-pipeline-boundaries.html) — Trace GitLab execution context, included configuration, downstream inputs, job-token permissions and runner reuse using private synthetic fixtures.

[Find the associated command snippets](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/commands.html?q=CI%20and%20releases%3A%20trace%20untrusted%20input%20into%20privileged%20work)

## Referenced by these target playbooks

[OSS & self-hosted](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/oss.html) · [Cloud & containers](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/cloud.html) · [Desktop & extensions](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/desktop.html) · [Mobile](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/mobile.html)

## 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](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/attack.html#T1195-002) — **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.

## Primary references

- [GitHub Security Lab: preventing pwn requests](https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/)
- [MITRE CWE-829](https://cwe.mitre.org/data/definitions/829.html)

[Back to the complete vulnerability catalog](https://bug-bounty-field-manual.kmahshooq.chatgpt.site/vulnerabilities.html)
