Skip to content

[static-analysis] RGS-012: Secret Exfiltration via Outbound HTTP Request in visual-regression-checker.lock.ymlΒ #30947

@github-actions

Description

@github-actions

🚨 Runner-Guard Security Finding

Rule: RGS-012 β€” Secret Exfiltration via Outbound HTTP Request
Severity: High
File: .github/workflows/visual-regression-checker.lock.yml
Lines: 406, 745

Description

A run: block contains outbound HTTP request commands (curl/wget/httpie/fetch) targeting a non-GitHub domain in a job context that has access to secrets or publishing capabilities. This pattern is a strong indicator of potential credential exfiltration β€” the primary objective of most GitHub Actions supply-chain attacks.

Attackers who achieve code execution in a CI runner (via expression injection, fork checkout, or compromised action) use outbound HTTP requests to exfiltrate stolen secrets to attacker-controlled infrastructure.

Affected File

visual-regression-checker.lock.yml β€” 8 occurrences

Flagged Pattern

Line 406 (wait for dev server):

- name: Wait for dev server
  run: |-
    for i in $(seq 1 30); do
      # HTTP request to local/external service
      ...
    done

Line 745 (Copilot CLI execution step β€” flagged due to proximity to secret access):

- name: Execute GitHub Copilot CLI
  # Has access to GITHUB_TOKEN, COPILOT_GITHUB_TOKEN, etc.

Impact

The combination of external HTTP requests with secret access in a workflow context is a high-confidence indicator of either:

  1. Active exploitation of another vulnerability in this workflow
  2. A pattern that could be exploited if the workflow is compromised

Even if the current HTTP calls are legitimate (e.g., checking if a dev server is running), the workflow's access to secrets combined with outbound HTTP capability creates a dangerous attack surface.

Remediation

  1. Review all outbound HTTP calls in visual-regression-checker.lock.yml to confirm they target only trusted, known domains.
  2. Restrict network access using a network firewall or egress-filter if available.
  3. Separate secret access from network operations: Structure the workflow so that steps with secret access don't share a job with steps making external HTTP calls, where possible.
  4. Pin external domains: If curl/wget must be used, document and allowlist the target domains.
# Document the intent clearly
- name: Check local dev server readiness
  # This step only connects to localhost:3000 β€” not external
  run: |-
    for i in $(seq 1 30); do
      curl --fail (localhost/redacted) && break || sleep 2
    done

Detected by runner-guard v2.6.0 β€” CI/CD source-to-sink vulnerability scanner
Workflow run: https://github.com/github/gh-aw/actions/runs/25538644099

Generated by Static Analysis Report Β· ● 438.8K Β· β—·

  • expires on May 15, 2026, 5:38 AM UTC

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions