Back to Insights
Securing CI/CD Runners and Build Pipelines: Hardening GitHub Actions, GitLab CI, and Artifact Signing
Cybersecurity

Securing CI/CD Runners and Build Pipelines: Hardening GitHub Actions, GitLab CI, and Artifact Signing

12 min read

Your CI/CD runner has more production privileges than almost any human engineer. A single unpinned third-party GitHub Action or persistent build VM can hand an attacker your entire cloud deployment pipeline.

In a modern cloud-native enterprise, human engineers rarely SSH into production servers. Instead, code merges into a main branch and a CI/CD runner (GitHub Actions, GitLab CI, Jenkins, or Buildkite) assumes a privileged cloud role to provision infrastructure and deploy containers. Attackers know this: instead of fighting your production perimeter, they target the build pipeline where source code, secrets, and cloud deployment credentials converge.

Top 5 CI/CD Pipeline Attack Vectors & Defenses

Attack VectorHow Exploitation WorksMandatory Engineering Control
Mutable Third-Party Action TagsUpstream GitHub Action maintainer account is hijacked; tag @v4 is rewritten to dump runner memoryPin all third-party actions to full 40-char commit SHAs; allow-list verified actions at org level
pull_request_target InjectionWorkflow runs in privileged base repo context while checking out untrusted fork PR codeNever checkout or execute untrusted PR code inside pull_request_target workflows
Persistent Self-Hosted RunnersMalware from a test build stays resident on the runner VM and infects the next production releaseUse strictly ephemeral, single-use container/VM runners (Actions Runner Controller / Firecracker)
Long-Lived Cloud Credentials in SecretsStatic AWS/Azure keys stored in CI secrets are leaked via build logs or compromised dependenciesReplace static keys with OIDC Workload Federation scoped to protected branches & environments
Over-Privileged Default GITHUB_TOKENDefault workflow token has read/write access across repo contents, packages, and PRsSet default workflow permissions to read-only at the org level; grant write per job

Implementing SLSA Provenance & Cryptographic Artifact Signing

How does your production Kubernetes cluster know that a container image in your registry was actually built by your trusted CI/CD pipeline from reviewed source code—and not pushed directly by an attacker with stolen registry credentials? Implement Supply-chain Levels for Software Artifacts (SLSA) and Sigstore Cosign:

  1. Keyless Signing via OIDC (Cosign): At the end of a protected release build, the ephemeral runner signs the container image digest using a short-lived certificate tied to the workflow's OIDC identity and logs the signature in an immutable transparency log.
  2. Admission Verification: Kyverno or Policy Controller in your Kubernetes cluster verifies the cryptographic signature and provenance attestation before allowing any pod to start.
  3. Egress Filtering on Build Runners: Restrict outbound network traffic from CI runners to an explicit allow-list of package registries and cloud APIs, blocking unexpected outbound callbacks during build steps.

Lock Down Your Software Delivery Pipeline

We audit GitHub, GitLab, and enterprise CI/CD estates to eliminate Poisoned Pipeline Execution paths, migrate secrets to OIDC, and implement SLSA artifact provenance.

Kinematic Digital designs and operates enterprise cybersecurity programmes, from cloud posture and identity hardening to offensive validation. Explore our cybersecurity services and preemptive cybersecurity programme, or schedule an executive security briefing.

Frequently Asked Questions

Why are CI/CD runners a prime target for attackers?

CI/CD runners hold the keys to the kingdom: cloud deployment roles, production database migration credentials, package registry publishing tokens, and source code write access. Compromising one build runner allows an attacker to inject malicious code or pivot directly into production cloud accounts.

What is a Poisoned Pipeline Execution (PPE) attack?

An attack where an adversary with permission to open a pull request or modify a build script (such as .github/workflows/*.yml or .gitlab-ci.yml) alters the pipeline commands to exfiltrate CI secrets or execute arbitrary code on the build runner.

Why should GitHub Actions pin third-party actions to full commit SHAs?

Pinning an action to a mutable version tag like @v3 means if the upstream action maintainer's account is compromised (as happened in the tj-actions/changed-files supply-chain incident), the attacker can repoint @v3 to malicious code that steals secrets from every repository using it. A 40-character Git commit SHA is immutable.

How does OIDC replace static cloud secrets in CI/CD pipelines?

OpenID Connect (OIDC) federation allows GitHub Actions or GitLab CI to request a short-lived cloud token directly from AWS, Azure, or GCP scoped to a specific repository, branch, and environment—eliminating long-lived AWS_SECRET_ACCESS_KEY variables entirely.

Are self-hosted CI/CD runners safer than cloud-hosted runners?

Only if they are strictly ephemeral. Persistent self-hosted runners that reuse the same VM across builds allow malware or leftover files from one untrusted pull request to compromise subsequent production builds.

Sources and standards referenced

  1. CISA & NSA — Defending Continuous Integration / Continuous Delivery (CI/CD) Environments
  2. OWASP Top 10 CI/CD Security Risks
  3. SLSA — Supply-chain Levels for Software Artifacts
  4. GitHub Docs — Security Hardening for GitHub Actions
  5. NIST SP 800-204D — Software Supply Chain Security in DevSecOps

Tagged With:

CI/CD security
GitHub Actions
supply chain security
SLSA
OIDC
DevSecOps

Ready to Transform Your Digital Experience?

Let's discuss how Kinematic Digital can help you achieve your business goals.