DEV Community

daniel jeong
daniel jeong

Posted on • Originally published at manoit.co.kr

Complete Guide to GitHub Actions 2026 Security Roadmap — Dependency Locking, Native Egress Firewall, and Scoped Secrets

Complete Guide to GitHub Actions 2026 Security Roadmap — Dependency Locking, Native Egress Firewall, and Scoped Secrets to Block Supply Chain Attacks

In March 2025, the tj-actions/changed-files supply chain attack compromised over 23,000 repositories. Attackers stole a PAT from reviewdog/action-setup, repointed all tj-actions version tags to malicious code, and exfiltrated CI/CD secrets — including credentials from Coinbase — through workflow logs. This incident exposed the structural vulnerabilities of the GitHub Actions ecosystem: mutable references causing non-deterministic execution, unrestricted network egress, and excessive secret inheritance.

In response, GitHub published its 2026 Security Roadmap — introducing workflow dependency locking, a Layer 7 native egress firewall, scoped secrets, policy-driven execution controls, Actions Data Stream, and OIDC custom property claims (GA as of April 2026). This guide provides a deep dive into each feature's architecture, practical implementation, and migration strategy.

The Structural Vulnerabilities Exposed by tj-actions

Understanding the 2026 security roadmap requires examining why such a large-scale supply chain attack was possible. The tj-actions attack chain progressed through five stages:

Stage Attack Action Exploited Vulnerability
1. Initial Compromise spotbugs/sonar-findbugs vulnerability exposed a contributor's PAT Long-lived tokens
2. Lateral Movement Stolen PAT used to access spotbugs/spotbugs repository Excessive token scope
3. Credential Theft Malicious workflows leaked additional PATs Unrestricted egress + secret exposure
4. Dependency Poisoning reviewdog/action-setup → tj-actions/eslint-changed-files cascading infection Mutable tag references + opaque transitive dependencies
5. Mass Propagation All tj-actions version tags repointed to malicious commit Runtime mutable tag resolution, 23,000+ repos affected

GitHub's security team summarized the pattern: "Vulnerabilities allow untrusted code execution, malicious workflows run without observability or control, compromised dependencies spread across thousands of repositories, over-permissioned credentials get exfiltrated via unrestricted network access." The 2026 roadmap is designed to break each link in this attack chain.

Workflow Dependency Locking — Deterministic Execution Like go.mod

The biggest security gap in GitHub Actions today is that dependencies are resolved at runtime using mutable references (tags, branches). Writing uses: actions/checkout@v4 means the commit pointed to by the v4 tag can change at any time. The tj-actions attack exploited exactly this vulnerability.

The New dependencies Section

GitHub introduces a dependencies: section in workflow YAML — the same concept as Go's go.mod + go.sum — that locks both direct and transitive dependencies using commit SHAs.

# .github/workflows/ci.yml — Dependency locking example
name: CI Pipeline
on: [push, pull_request]

# New dependencies section: all Actions locked to commit SHAs
dependencies:
  actions/checkout:
    version: v4.2.2
    sha: 11bd71901bbe5b1630ceea73d27597364c9af683
  actions/setup-node:
    version: v4.1.0
    sha: 39370e3970a6d050c480ffad4ff0ed4d3fdee5af
  # Transitive dependencies also automatically locked
  actions/cache:
    version: v4.2.0
    sha: d4323d4df104b026c6a166049fb557cb5d0bedfc

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4  # SHA auto-resolved from dependencies
      - uses: actions/setup-node@v4
        with:
          node-version: 22
Enter fullscreen mode Exit fullscreen mode

Three key characteristics define this feature. First, deterministic execution ensures every workflow runs the exact code that was reviewed. Second, dependency changes automatically appear in PR diffs, enabling reviewable updates. Third, hash mismatches halt execution before jobs run through preemptive blocking. The system transitively tracks nested dependencies inside composite actions, providing full visibility into previously opaque dependency chains.

Comparison Current (Tag References) New (Dependency Locking)
Reference method @v4 (mutable tag) Commit SHA pinned (immutable)
Transitive deps Opaque (runtime resolution) Full tree visibility
Change detection Impossible Auto-shown in PR diffs
Hash mismatch Runs without detection Halts before execution
Management tool Manual SHA pinning GitHub CLI auto-resolution/update

Timeline: Public preview within 3-6 months, GA within 6 months. Future plans include deprecating mutable references entirely in favor of immutable releases, creating a central enforcement point for detecting and blocking malicious code.

Native Egress Firewall — Blocking Data Exfiltration at Layer 7

In the tj-actions attack, stolen secrets were transmitted to attacker servers through unrestricted outbound network access. Currently, GitHub-hosted runners allow network access to all external destinations by default — once an attacker gains root, any data can be exfiltrated.

Layer 7 Firewall Outside the Runner VM

GitHub's native egress firewall operates outside the runner VM at Layer 7. This means even if an attacker gains root access inside the runner, the firewall cannot be bypassed. This is fundamentally different from third-party solutions (like StepSecurity Harden-Runner) that operate inside the runner.

# Egress firewall policy example (expected configuration)
egress-policy:
  mode: enforce  # monitor | enforce
  allowed-domains:
    - github.com
    - "*.githubusercontent.com"
    - registry.npmjs.org
    - pypi.org
    - files.pythonhosted.org
    - docker.io
    - "*.docker.io"
  blocked: all  # Block all traffic outside allowlist
  log-level: detailed  # Auto-correlate with workflow/job/step context
Enter fullscreen mode Exit fullscreen mode

The firewall operates in two modes. Monitor mode audits all outbound traffic, automatically correlating it with workflow run/job/step context and initiating commands. Enforce mode blocks traffic not explicitly permitted, with fine-grained control over domains/IP ranges, HTTP methods, and TLS/protocol requirements.

GitHub's recommended adoption path: Start with Monitor mode to observe real traffic patterns → Build allowlists from real data → Switch to Enforce mode with confidence.

Timeline: Public preview within 6-9 months. Future plans include process-level visibility, file system monitoring, and near real-time enforcement.

Scoped Secrets and Policy-Driven Execution Controls

Scoped Secrets — Applying the Principle of Least Privilege

Currently, GitHub Actions secrets inherit implicitly through repository/organization scope. In reusable workflows, secrets: inherit is the default, meaning all caller secrets flow into called workflows. This maximizes the blast radius in supply chain attacks like tj-actions.

Scoped secrets bind credentials to explicit execution contexts:

Scope Criteria Description Example
Repository/Organization Allow access only in specific repos/orgs Bind AWS keys to prod repo only
Branch/Environment Usable only in specific branches or Environments Production secrets on main branch only
Workflow ID/Path Access only from specific workflow files Only deploy.yml accesses cloud credentials
Trusted reusable workflows Only explicitly designated reusable workflows Only internal org deploy workflows allowed

A critical change: secrets no longer automatically inherit in reusable workflows. Instead of callers implicitly passing credentials, only explicitly scoped secrets are accessible. Additionally, write permission no longer includes secret management capability — this is separated into a dedicated custom role.

Policy-Driven Execution Controls — Ruleset Framework

GitHub extends its existing repository Rulesets framework to provide centralized policy-driven execution control over workflows themselves.

# Workflow execution policy example (Ruleset-based)
workflow-rules:
  # Actor Rules: who can trigger workflows
  actor-rules:
    workflow_dispatch:
      allowed: [maintainers, admin]  # Contributors can't manually trigger
    pull_request:
      allowed: [all]  # PR events allowed from all contributors

  # Event Rules: which events can execute workflows
  event-rules:
    blocked-events:
      - pull_request_target  # Block dangerous events
    trusted-automation:
      - github-actions[bot]
      - dependabot[bot]
      - copilot[bot]
Enter fullscreen mode Exit fullscreen mode

Actor Rules define who can trigger workflows, and Event Rules define which GitHub Actions events are allowed to execute. For example, blocking pull_request_target prevents external code from running in the base repo context with secret access. An Evaluate mode lets you monitor policy violations before enforcement.

OIDC Custom Claims GA and Artifact Attestations

OIDC Repository Custom Properties — GA April 2026

As of April 2, 2026, repository custom property claims in GitHub Actions OIDC tokens are generally available. Previously, cloud provider trust policies (AWS, Azure, GCP) could only be set based on repository names. Now, organization-level custom property values can be used as OIDC claims.

# AWS IAM trust policy — Using OIDC custom properties
# Group-based control instead of per-repository configuration
Statement:
  - Effect: Allow
    Action: sts:AssumeRoleWithWebIdentity
    Condition:
      StringEquals:
        # New: Category-based control via custom properties
        token.actions.githubusercontent.com:repository_properties.environment: production
        token.actions.githubusercontent.com:repository_properties.team: platform
        token.actions.githubusercontent.com:repository_properties.compliance_tier: sox
Enter fullscreen mode Exit fullscreen mode

The practical benefit: trust policies can be aligned with organizational governance models — environment type (production/staging/dev), team ownership, compliance tier — drastically reducing per-repository configuration overhead.

Artifact Attestations — SLSA Build Level 3

GitHub Artifact Attestations cryptographically bind build artifacts (container images, binaries) to source repositories and build workflows, achieving SLSA Build Level 3 security — providing unfalsifiable proof of software provenance and integrity.

# Artifact Attestation workflow
name: Build and Attest
on:
  push:
    tags: ['v*']

permissions:
  id-token: write       # OIDC token issuance
  attestations: write   # Attestation creation
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build container image
        run: docker build -t myapp:${{ github.ref_name }} .

      - name: Generate SLSA provenance attestation
        uses: actions/attest-build-provenance@v2
        with:
          subject-name: ghcr.io/${{ github.repository }}/myapp
          subject-digest: sha256:${{ steps.build.outputs.digest }}
          push-to-registry: true
Enter fullscreen mode Exit fullscreen mode

Combined with the Code-to-Cloud Traceability feature (GA January 2026), you can trace an artifact's entire lifecycle — build → store → deploy → production — and filter security alerts by production exposure context.

Actions Data Stream — Centralized Telemetry

Individual workflow logs aren't enough to assess organization-wide CI/CD security posture. Actions Data Stream streams near real-time workflow execution data from all repositories/organizations to centralized destinations.

Item Details
Supported destinations Amazon S3, Azure Event Hub, Azure Data Explorer
Streamed data Workflow/job execution, dependency resolution, Action usage patterns, network activity (future)
Delivery guarantee At-least-once, batched events, standardized schema
Use cases SIEM integration, anomaly detection, compliance auditing, cost analysis
Timeline Public preview 3-6 months, GA 6-9 months

Security Hardening Checklist — Apply Today

Even before the 2026 roadmap features reach GA, here are immediately actionable security measures:

# Hardened CI workflow template — apply now
name: Hardened CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

# 1. Global least privilege
permissions: {}  # Remove all default permissions

jobs:
  build:
    runs-on: ubuntu-latest
    # 2. Job-level minimum permissions
    permissions:
      contents: read
      id-token: write  # For OIDC
    steps:
      # 3. Pin Actions to commit SHA (not tags)
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # v4.2.2
        with:
          persist-credentials: false  # 4. Don't leave credentials in .git/config

      # 5. OIDC short-lived tokens for cloud auth (not long-lived keys)
      - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502
        with:
          role-to-assume: arn:aws:iam::123456789012:role/github-actions
          aws-region: us-east-1

      # 6. Pass secrets individually at step level
      - name: Deploy
        env:
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
        run: ./deploy.sh
Enter fullscreen mode Exit fullscreen mode
Priority Action Attack Blocked
P0 Global permissions: {} + job-level minimum Excessive permission abuse
P0 Third-party Action commit SHA pinning Tag repointing attacks (tj-actions type)
P0 Switch to OIDC short-lived tokens for cloud auth Long-lived credential theft
P1 Set persist-credentials: false .git/config credential exposure
P1 Organization-level default permissions read-only Default read-write abuse
P1 Enable Artifact Attestations Artifact tampering/provenance forgery
P2 Remove secrets: inherit, switch to explicit passing Excessive secret exposure
P2 Scan workflows with CodeQL Script injection, dangerous patterns
P2 Add zizmor static analysis Common Actions misconfigurations

Roadmap Timeline and Migration Strategy

Feature Public Preview Expected GA Impact
Workflow dependency locking Q2-Q3 2026 Q3-Q4 2026 High — workflow YAML changes
Policy-driven execution controls Q2-Q3 2026 Q3-Q4 2026 Medium — admin settings
Scoped secrets Q2-Q3 2026 Q3-Q4 2026 High — secret architecture redesign
Actions Data Stream Q2-Q3 2026 Q4 2026-Q1 2027 Low — observation only
Native egress firewall Q3-Q4 2026 H1 2027 High — network access review

Migration strategy: All features offer Evaluate/Monitor modes first, enabling gradual adoption. Start by enabling Actions Data Stream for visibility into current pipelines, apply dependency locking to critical repos first, then begin egress firewall in Monitor mode to understand traffic patterns before switching to Enforce mode.

Conclusion: The Era of Secure-by-Default CI/CD

The GitHub Actions 2026 Security Roadmap isn't just a feature update — it's a paradigm shift in CI/CD security. Until now, CI/CD security depended on individual workflow authors' diligence. The new roadmap implements secure-by-default at the platform level: dependency locking ensures deterministic execution, the egress firewall blocks data exfiltration at its source, and scoped secrets enforce the principle of least privilege.

Most importantly, all these features can be adopted gradually without redesigning existing architectures. Start today with SHA pinning, OIDC migration, and minimum permission settings. As roadmap features reach preview, apply them in Evaluate/Monitor mode. When the next supply chain attack hits, your pipeline will be ready.


AI Disclosure: This article was written by ManoIT's automated tech blog system using Claude (Anthropic) for research, writing, and verification. All facts were cross-referenced with official documentation.

Sources: GitHub Blog — Actions 2026 Security Roadmap · GitHub Changelog — April 2026 Updates · GitHub — SLSA Build Level 3 · Wiz — GitHub Actions Security Guide · Unit 42 — tj-actions Supply Chain Attack


Originally published at ManoIT Tech Blog.

Top comments (0)