Poisoned Pipeline

Poisoned Pipeline / CI/CD matrix

CI/CD matrix

Pipeline-specific techniques, heat-mapped by how many catalogued incidents do that thing. Names follow the Common Threat Matrix for CI/CD Pipeline (Mercari Security Team, Mercari Security Team (Hiroki Suezawa), CODE BLUE 2021). The one-line descriptions are ours. A story is listed only when its write-up describes that behavior.

28 techniques
36 incidents mapped
9 with no named case

Mapped incidents:  0 1–2 3–4 5+ Dim cells are in the matrix and not yet tied to a case here. Praetorian's Gato write-up (AS24) is red-team research, not a victim incident, so it is not counted.

What is not on this page

A cicd-saas tag is not enough. WordPress plugin backdoors that only carry that tag are not mapped. TeamCity CVE-2024-27198 is a disclosure with a researcher proof, not a victim campaign in the sources read for this pass, so it is not a story. Cells with no case: C06, C09, C10, C13, C16, C18, C21, C25, C28.

C01 Supply chain compromise on CI/CD

A library, action, tool, or image the pipeline trusts is itself malicious.

C02 Valid account of the git host

A personal token, SSH key, password, or cookie for the git service is stolen and reused.

C03 Valid account of the CI/CD service

A CI token, session, or integrator OAuth credential is stolen and reused.

C04 Admin of the server hosting git

The machine or admin plane that hosts the git service is taken, not just a user account.

C05 Modify CI/CD configuration

A workflow, Job DSL, or publish config is changed so the pipeline runs attacker code.

C06 Inject code into IaC

Terraform or another IaC file is changed so the pipeline applies attacker infrastructure.

C07 Inject code into the build input

Source or the build tree is changed so the pipeline compiles attacker code.

C08 Inject a bad dependency

The build resolves a dependency the attacker controls.

C09 SSH to CI/CD pipelines

An attacker shells into a runner or pipeline host.

C10 Modify production configuration

Stolen credentials are used to change production configuration.

C11 Deploy a modified application or image

A trojanized build, package, or image is what ships.

C12 Compromise the CI/CD server

The build server, CI vendor production, or artifact service itself is taken.

C13 Implant a CI/CD runner image

A runner or agent image is replaced so later jobs start compromised.

C14 Take a deploy credential from the CI stage

A publish token or OIDC identity available to CI is stolen and used to release.

C15 Compromise another pipeline

Access from one CI system is used to reach a different pipeline.

C16 Add an approver with admin rights

An admin changes who can approve so a bad change looks reviewed.

C17 Bypass review

A change reaches the default branch or a publish job without the review the project thought it had.

C18 Reach a secret manager from another repo's CI

A job started by a different repository can read secrets it should not see.

C19 Modify CI/CD caches

A cache is poisoned, or a later job reads attacker-controlled cache contents.

C20 Dump environment variables in CI/CD

Secrets in the job environment are printed, posted, or scanned.

C21 Access cloud metadata from the runner

The job queries the cloud metadata service for a role credential.

C22 Read a credentials file on the runner

A file mounted into the job (keys, kubeconfig, cloud config) is read.

C23 Take credentials from the CI admin console

An admin session on the CI or artifact service reads stored customer secrets.

C24 Exploit a remote service from the pipeline

A CI job is used as the foothold to attack another service.

C25 Monorepo cross-folder credential

A job in one folder of a monorepo can read another folder's credentials.

C26 Exfiltrate production data

Stolen credentials are used to read production data, not only CI settings.

C27 Clone git repositories

Private repositories are listed and cloned with a stolen token.

C28 Denial of service of the pipeline

The CI/CD service itself is taken down.