Skip to content

[static-analysis] Report - 2026-08-09 #51520

Description

@github-actions

Analysis Summary

  • Tools Used: zizmor, poutine, actionlint, runner-guard, syft, grype, yamllint, shellcheck
  • Workflows Scanned: 284 (284 compiled successfully, 193 with warnings)
  • Static Findings (zizmor+poutine+actionlint+runner-guard+yamllint+shellcheck): 138
  • Container Vulnerability Findings (grype): 2,497 across 16 images
  • New GitHub Issues Created Today: 0 (see Runner-Guard Analysis)

Findings by Tool

Tool Total Critical High Medium Low
zizmor (security) 10 0 0 0 0 (9 note, 1 warning)
poutine (supply chain) 10 0 10 (error) 0 0
actionlint (linting) 6 - - - -
runner-guard (taint analysis) 121 0 111 10 0
syft (SBOM inventory) 16 images / 5,344 packages - - - -
grype (container CVEs) 2,497 112 705 1,070 247 (+294 negligible, 69 unknown)
yamllint (yaml linting) 0 - - - -
shellcheck (shell linting) 1 - - - -

Clustered Findings by Tool and Type

Zizmor Security Findings

Issue Type Severity Count Affected Workflows
github_action_from_unverified_creator_used note (info) 9 smoke-codex, daily-elixir-credo-snippet-audit, hippo-embed, super-linter, mcp-inspector, copilot-setup-steps.yml, link-check.yml (×2), dataflow-pr-discussion-dataset
pr_runs_on_self_hosted warning 1 smoke-copilot-arm

All 9 unverified-creator findings already carry a # zizmor: ignore[...] comment in source — these are acknowledged/accepted, shown for visibility only.

Poutine Supply Chain Findings

Issue Type Severity Count Affected Workflows
untrusted_checkout_exec error 10 smoke-workflow-call.lock.yml (5), smoke-workflow-call-with-inputs.lock.yml (5)

Unlike every other lock file that runs the same shared scripts (save_base_github_folders.sh, create_prompt_first.sh, etc.), these two files are missing the # poutine:ignore untrusted_checkout_exec comment that suppresses the finding elsewhere. See Fix Suggestion below.

Actionlint Linting Issues

Issue Type Count Affected Workflows
SC2016 (shellcheck-integration: expressions don't expand in single quotes) 6 daily-arxiv-researcher.lock.yml (×2), daily-code-metrics.lock.yml (×2), smoke-crush.lock.yml (×2)

Syft SBOM Inventory

16 container images / 5,344 packages
Image Packages
serena-mcp-server:sha-891c160 2,314
gh-aw-firewall/agent:0.27.44 532
gh-aw-firewall/cli-proxy:0.27.44 348
mcp/context7 329
gh-aw-mcpg:v0.4.8 286
grafana/mcp-grafana 252
mcp/memory 253
gh-aw-firewall/api-proxy:0.27.44 193
gh-aw-node 177
mcp/ast-grep:latest 186
mcp/arxiv-mcp-server 168
node:lts-alpine 165
gh-aw-firewall/squid:0.27.44 63
github-mcp-server:v1.8.0 40
python:alpine 38
open-ontologies:latest 10

Runner-Guard Taint Analysis Findings

No aggregate Runner-Guard Score/Grade was emitted in this run's output.

Rule ID Name Severity Count Affected Workflows
RGS-004 Comment-Triggered Workflow Without Author Authorization Check High 96* dev-hawk.lock.yml
RGS-012 Secret Exfiltration via Outbound HTTP Request High 10 daily-byok-ollama-test, daily-model-inventory (×3), docs-noob-tester, visual-regression-checker (×2)
RGS-018 Suspicious Payload Execution Pattern High 4 daily-byok-ollama-test, daily-cli-performance, daily-sentrux-report, smoke-claude
RGS-005 Excessive Permissions on Untrusted Trigger Medium 9 ai-moderator.lock.yml, agentic_commands.yml, q.lock.yml
RGS-019 Step Output Interpolated in run Block Medium 2 error-message-lint.yml, windows-cli-integration.yml

* RGS-004's 96 hits are one systemic finding — the scanner flags every step in dev-hawk.lock.yml's workflow_run-triggered job, not 96 distinct issues.

Issues created: none — see Runner-Guard Analysis.

Grype Container Vulnerability Findings

Critical/High findings by image
Image Critical High Packages
serena-mcp-server:sha-891c160 65 387 2,314
mcp/arxiv-mcp-server 16 115 168
mcp/context7 10 78 329
mcp/memory 8 60 253
grafana/mcp-grafana 7 19 252
mcp/ast-grep:latest 6 38 186
gh-aw-firewall/squid:0.27.44 0 14 63
github-mcp-server:v1.8.0 1 3 40
node:lts-alpine 1 6 165
open-ontologies:latest 1 2 10
gh-aw-mcpg / cli-proxy / api-proxy / agent / gh-aw-node / python:alpine 0 ≤6 each

serena-mcp-server:sha-891c160 alone accounts for 58% of all Critical findings and 55% of all High findings, driven by an outdated Debian/Node base layer (libc6, openssl, perl, node-undici, handlebars, golang runtime, etc. — sample CVEs: CVE-2026-5450, CVE-2025-55130, CVE-2026-31789, CVE-2026-33937). It is referenced by 24 workflows (see cache memory vulnerabilities/by-workflow.json).

Yamllint YAML Linting Findings

None — 0 findings across 284 files.

Shellcheck Shell Linting Findings

Code Count Affected Workflows
SC2015 (A && B || C is not if-then-else) 1 daily-vulnhunter-scan.lock.yml

Top Priority Issues

1. serena-mcp-server container image is critically out of date

  • Tool: grype
  • Count: 65 Critical + 387 High (452 of 2,497 total findings from one image)
  • Severity: Critical
  • Affected: 24 workflows referencing ghcr.io/github/serena-mcp-server:sha-891c160
  • Description: The pinned digest carries a Debian/Node base with dozens of unpatched CVEs (openssl, perl, libgnutls, node-undici, handlebars, golang toolchain).
  • Impact: Any workflow using this MCP server inherits its full vulnerable surface; a compromised dependency here has broad blast radius given how widely the image is reused.
  • Reference: https://github.com/oras-project/oras — track upstream serena-mcp-server releases and re-pin to a newer digest.

2. Poutine untrusted_checkout_exec unresolved in 2 smoke workflows

3. Runner-Guard findings recur despite closed tracking issues

  • Tool: runner-guard
  • Count: 111 High findings (RGS-004 ×96 in one job, RGS-012 ×10, RGS-018 ×4)
  • Severity: High
  • Affected: dev-hawk.lock.yml, daily-byok-ollama-test, daily-model-inventory, docs-noob-tester, visual-regression-checker, daily-cli-performance, daily-sentrux-report, smoke-claude
  • Description: Every one of these rule+file combinations matches a previously closed GitHub issue — closing the issue did not stop the finding from resurfacing, because runner-guard (unlike zizmor/poutine) has no inline ignore-comment mechanism.
  • Impact: Alert fatigue; genuine new findings risk being lost in a sea of re-flagged, already-triaged ones. Several appear to be false positives (see below).
  • Reference: https://github.com/Vigilant-LLC/runner-guard

Fix Suggestion for poutine untrusted_checkout_exec

Issue: Two generated smoke-test lock files execute shared gh-aw action scripts via bare bash without the # poutine:ignore untrusted_checkout_exec annotation used everywhere else.
Severity: Error
Affected Workflows: 2 workflows, 10 findings

Prompt to Copilot Agent:

You are fixing a recurring security lint finding from poutine.

**Vulnerability**: untrusted_checkout_exec — poutine flags `run: bash "$RUNNER_TEMP/gh-aw/actions/<script>.sh"`
steps that could theoretically execute code from an untrusted checkout.
**Rule**: untrusted_checkout_exec - https://github.com/boostsecurityio/poutine/blob/main/docs/rules/untrusted_checkout_exec.md

**Current Issue**:
`.github/workflows/smoke-workflow-call.lock.yml` and `.github/workflows/smoke-workflow-call-with-inputs.lock.yml`
each have 5 steps invoking shared scripts (save_base_github_folders.sh, log_runtime_features_summary.sh,
create_prompt_first.sh, validate_prompt_placeholders.sh, print_prompt_summary.sh) without the
`# poutine:ignore untrusted_checkout_exec` comment that every other generated lock file uses for the
identical scripts. This exact finding has been closed and reopened at least 5 times (#22608, #22248,
#26552, #48717, #51177) because the fix was never applied to the workflow_call code generation path.

**Required Fix**:
1. Locate the compiler code path that generates steps for the `workflow_call` trigger (search for the
   step names "Log runtime features", "Create prompt with built-in context", "Validate prompt
   placeholders", "Print prompt summary", or the literal "save_base_github_folders.sh").
2. Add the missing `# poutine:ignore untrusted_checkout_exec` comment line immediately before each
   `bash "${RUNNER_TEMP}/gh-aw/actions/*.sh"` invocation, matching the pattern already used by every
   other trigger path.

**Example**:
Before:
```yaml
      - name: Create prompt with built-in context
        env:
          GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
        run: |
          bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"

After:

      - name: Create prompt with built-in context
        env:
          GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
        run: |
          # poutine:ignore untrusted_checkout_exec
          bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh"
  1. Recompile all workflows and confirm both smoke-workflow-call lock files regenerate with the ignore
    comment on all 5 flagged steps.
  2. Do not hand-edit the .lock.yml files — fix the generator/template so this survives future compiles.

Please apply this fix to: smoke-workflow-call.lock.yml, smoke-workflow-call-with-inputs.lock.yml.


### Runner-Guard Analysis

Dedup check performed for every High/Critical runner-guard finding (rule ID + affected file), searching both open and closed issues:

| Rule + File | Existing Issue | Action Taken |
|---|---|---|
| RGS-004 — dev-hawk.lock.yml | #50189 (closed) | Skipped (per policy: closed issue → no recreate) |
| RGS-012 — daily-byok-ollama-test.lock.yml | #35652 (closed) | Skipped |
| RGS-012 — daily-model-inventory.lock.yml | #30079, #30776 (closed) | Skipped |
| RGS-012 — docs-noob-tester.lock.yml | #50190, #28488, #29462 (closed) | Skipped |
| RGS-012 — visual-regression-checker.lock.yml | #30947, #28626, #29462 (closed) | Skipped |
| RGS-018 — daily-byok-ollama-test.lock.yml | #35653 (closed) | Skipped |
| RGS-018 — daily-cli-performance.lock.yml | #47478 (closed) | Skipped |
| RGS-018 — daily-sentrux-report.lock.yml | #46532 (closed) | Skipped |
| RGS-018 — smoke-claude.lock.yml | #47477 (closed) | Skipped |

**No new issues created.** RGS-005 and RGS-019 findings are new (no prior issue found) but are Medium severity, below this workflow's Critical/High issue-creation threshold, so they're reported here only.

Notable likely false positives worth re-reviewing on the closed issues rather than reopening blind:
- **RGS-012** on docs-noob-tester, visual-regression-checker, and 2 of 3 daily-byok-ollama-test hits: the flagged `curl`/readiness-wait commands target `(localhost/redacted) (waiting for a locally-started dev server), not an external exfiltration endpoint.
- **RGS-012** on daily-model-inventory.lock.yml (×3): the flagged commands are unauthenticated GET requests to public model-catalog APIs (models.dev, Anthropic, Gemini) fetching pricing/catalog data, not posting secrets.
- **RGS-004** on dev-hawk.lock.yml: the `workflow_run` trigger is already gated by an explicit actor allowlist (`contains(fromJSON([...]), github.event.workflow_run.actor.login)`) rather than `author_association` — the control exists, just not in the exact shape the rule checks for.

### Historical Trends

No prior daily snapshot existed in `/tmp/gh-aw/cache-memory/security-scans/` before today, so no numeric day-over-day delta is available in cache. However, GitHub issue history confirms this report has run daily since at least 2026-06-30, and the same RGS-004/012/018 rule+file combinations have been opened and closed repeatedly over that period (e.g. RGS-018 in daily-byok-ollama-test.lock.yml: #35653; poutine untrusted_checkout_exec in smoke-workflow-call*: #22608 → #22248 → #26552 → #48717 → #51177) — none of the "fixes" durably suppressed the finding at the source.

#### New Issues
- RGS-005 (Excessive Permissions on Untrusted Trigger) in ai-moderator.lock.yml, agentic_commands.yml, q.lock.yml — first time this rule/file combination has appeared in title search of issue history.
- RGS-019 (Step Output Interpolated in run Block) in error-message-lint.yml, windows-cli-integration.yml — first appearance.

#### Resolved Issues
None confirmed resolved at the code level — all recurring findings above were "closed" as tracking issues but the underlying pattern persists in today's scan.

### Recommendations

1. **Immediate**: Re-pin or upgrade the `serena-mcp-server` image (65 Critical / 387 High CVEs) — it is the single largest source of container vulnerabilities across 24 workflows.
2. **Immediate**: Land the poutine `untrusted_checkout_exec` ignore-comment fix in the workflow_call code-generation path so it stops recurring after its 5th closure.
3. **Short-term**: Give runner-guard an inline suppression mechanism (comment or config allowlist) analogous to `zizmor: ignore[...]` / `# poutine:ignore ...`, so accepted-risk/false-positive findings don't resurface every day after their tracking issue is closed.
4. **Short-term**: Review the three RGS-012 "localhost curl" and "public API GET" flags for a scanner-side tuning opportunity (exclude loopback targets and known-public read-only API domains from the exfiltration heuristic).
5. **Long-term**: Fix the 6 SC2016 actionlint findings (single-quoted `$VAR` in heredocs) in daily-arxiv-researcher, daily-code-metrics, and smoke-crush.
6. **Long-term**: Consider tracking the 193 compiler warnings (template-separator-mid-line, missing GitHub-toolset permissions, `/tmp/` path references) in a lighter-weight lint pass separate from this security report.

### Next Steps

- [ ] Apply the poutine `untrusted_checkout_exec` fix to the workflow_call generator (see Fix Suggestion)
- [ ] Re-pin `serena-mcp-server` to a patched digest
- [ ] Evaluate RGS-012/RGS-004 false-positive candidates called out above and, if confirmed, suppress at the scanner-config level rather than by closing the tracking issue
- [ ] Fix the 6 actionlint SC2016 findings
- [ ] Fix the 1 shellcheck SC2015 finding in daily-vulnhunter-scan.lock.yml
- [ ] Consider adding a runner-guard inline-ignore mechanism to stop issue churn

> Generated by [📊 Static Analysis Report](https://github.com/github/gh-aw/actions/runs/31295669837) · agent · 180.5 AIC · ⌖ 39.3 AIC · ⊞ 5.8K · [◷](https://github.com/search?q=repo%3Agithub%2Fgh-aw+is%3Aissue+%22gh-aw-workflow-call-id%3A+github%2Fgh-aw%2Fstatic-analysis-report%22&type=issues)
> - [x] expires <!-- gh-aw-expires: 2026-08-16T05:31:26.956Z --> on Aug 15, 2026, 9:31 PM UTC-08:00

<!-- gh-aw-agentic-workflow: Static Analysis Report, engine: claude, model: agent, id: 31295669837, workflow_id: static-analysis-report, run: https://github.com/github/gh-aw/actions/runs/31295669837 -->

<!-- gh-aw-workflow-id: static-analysis-report -->
<!-- gh-aw-workflow-call-id: github/gh-aw/static-analysis-report -->

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions