Skip to content

[static-analysis] Report - 2026-10-25Β #71826

Closed

Description

@github-actions

Analysis Summary

  • Tools Used: zizmor, poutine, actionlint, runner-guard, syft, grype, yamllint, shellcheck
  • Total Findings: 21,964
  • Workflows Scanned: 348
  • Workflows Affected: 348 (every workflow carries at least one low-severity zizmor finding)

Findings by Tool

Tool Total Critical High Medium Low
zizmor (security) 19,130 0 5 12,615 6,510
poutine (supply chain) 29 0 0 1 0 (28 informational)
actionlint (linting) 176 - - - -
runner-guard (taint analysis) 25 0 6 19 0
syft (SBOM inventory) 12 images / 3,947 packages - - - -
grype (container CVEs) 2,587 67 631 767 153 (+868 negligible, 101 unknown)
yamllint (yaml linting) 0 - - - -
shellcheck (shell linting) 17 - - - -

Clustered Findings by Tool and Type

Zizmor Security Findings

Issue Type Severity Count Affected Workflows
secrets-outside-env Medium 12,539 340
self-repository Low 3,095 348
undocumented-permissions Low 2,813 348
adhoc-packages Low 560 294
artipacked Medium 75 73
template-injection Low/Info 42 44
dangerous-triggers High 3 ai-moderator.lock.yml, q.lock.yml, squad.lock.yml
unpinned-images High 1 smoke-service-ports.lock.yml
bot-conditions High 1 squad.lock.yml
secrets-inherit Medium 1 1 workflow
Zizmor trend notes
  • dangerous-triggers (High, issue_comment flagged as a fundamentally insecure trigger) is unchanged, 4th consecutive day since first appearing 2026-10-22. All 3 workflows gate real execution behind an activation/actor check, so impact is architecturally mitigated, but the rule still fires on the trigger itself.
  • unpinned-images (smoke-service-ports.lock.yml) and bot-conditions (squad.lock.yml) have now been open 26+ consecutive days with no dedicated fix issue filed.
  • The obfuscation rule (39 findings across 31 workflows as of 2026-10-24) disappeared entirely in today's scan (0/0). Unconfirmed whether this is a genuine fix or a ruleset/signature change β€” worth a quick check before celebrating.
  • secrets-outside-env is high-volume but Medium severity; it fires on every ${{ secrets.X }} reference not wrapped in a dedicated GitHub Actions environment: block β€” see the Fix Suggestion below.

Poutine Supply Chain Findings

Issue Type Severity Count Affected Workflows
github_action_from_unverified_creator_used Informational 28 28
pr_runs_on_self_hosted Medium 1 smoke-copilot-arm.lock.yml (likely false positive β€” ubuntu-24.04-arm is a GitHub-hosted runner)

Actionlint Linting Issues

Issue Type Count Affected Workflows
expression: property not defined on needs-context object 161 39
shellcheck (embedded) 15 4
Actionlint expression breakdown

All 161 expression errors share one root cause: generated conclusion-job expressions reference needs.<job>.outputs.{missing_tool, noop, report_incomplete, report_failed_jobs} properties that aren't declared on the compiler-generated needs-context object type for those jobs.

Missing property Count
missing_tool 70
report_incomplete 35
noop 35
report_failed_jobs 21

The 15 embedded shellcheck findings (SC2034/SC2041/SC2254) are a new cluster today, on a shared "Fetch additional refs" step, across daily-safeoutputs-git-simulator.lock.yml and smoke-update-cross-repo-pr.lock.yml (each appearing twice β€” likely two near-identical jobs) and smoke-claude.lock.yml.

Syft SBOM Inventory

Image Packages
ghcr.io/oraios/serena:1.7.0 1,678
ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.70 346
ghcr.io/github/gh-aw-mcpg:v0.4.37 290
ghcr.io/github/gh-aw-firewall/agent:0.28.70 586
ghcr.io/github/gh-aw-firewall/api-proxy:0.28.70 193
ghcr.io/xberg-io/xberg:1.3.6 169
grafana/mcp-grafana:1.1.0-alpine 178
ghcr.io/github/gh-aw-node 178
node:lts-alpine 165
ghcr.io/github/github-mcp-server:v2.0.3 41
ghcr.io/github/gh-aw-firewall/router:0.28.70 60
ghcr.io/github/gh-aw-firewall/squid:0.28.70 63

github-mcp-server image bumped v2.0.2 β†’ v2.0.3 since the 2026-10-24 scan (digest changed, package count unchanged at 41). All other 11 image digests are unchanged.

Runner-Guard Taint Analysis Findings

Runner-Guard Score: not reported in this scan's output (no score/grade line present in compile-output.txt).

Rule ID Name Severity Affected Workflows
RGS-005 Excessive Permissions on Untrusted Trigger Medium ai-moderator.lock.yml, agentic-workqueue.yml, agentic_commands.yml, q.lock.yml, squad.lock.yml (19 findings)
RGS-018 Suspicious Payload Execution Pattern High daily-workflow-security-model.lock.yml, daily-work-queue-formal-verification.lock.yml, credentials-check.yml, smoke-test-tools.lock.yml, super-linter.lock.yml (5 findings)
RGS-012 Secret Exfiltration via Outbound HTTP Request High github-remote-mcp-auth-test.lock.yml (1 finding)

Issues created this run: 0. Every Critical/High runner-guard finding was directly re-verified via issue_read (GitHub search_issues/list_issues remain blocked by an "integrity policy" filter in this environment, confirmed again today) and dedups to an already-closed issue:

Workflow Rule Closed Issue Resolution
daily-workflow-security-model.lock.yml RGS-018 #68606 not_planned β€” checksum-verified pinned download, reviewed false positive (2026-10-14)
daily-work-queue-formal-verification.lock.yml RGS-018 #68607 not_planned β€” same pattern (2026-10-14)
credentials-check.yml RGS-018 #68608 not_planned β€” same pattern (2026-10-14)
smoke-test-tools.lock.yml RGS-018 #71350 not_planned β€” Pi-engine "Execute Pi CLI" harness shape, reviewed false positive (2026-10-23)
super-linter.lock.yml RGS-018 #71351 not_planned β€” same Pi-engine pattern (2026-10-23)
github-remote-mcp-auth-test.lock.yml RGS-012 #55652 completed β€” suppression PR #55686 merged 2026-08-25, but the finding still fires (suppression not honored by the scanner)

Resolved since last scan: video-analyzer.lock.yml's RGS-018 finding is gone β€” its companion issue #71352 was closed (not_planned) on 2026-10-24, and the finding no longer appears, dropping RGS-018 from 6 to 5.

Grype Container Vulnerability Findings

All 12 images were planned and completed successfully (0 failed, 0 incomplete).

Image (pinned reference) Scan Status Finding Count
ghcr.io/oraios/serena:1.7.0 completed 1,573
ghcr.io/xberg-io/xberg:1.3.6 completed 390
ghcr.io/github/gh-aw-firewall/agent:0.28.70 completed 323
grafana/mcp-grafana:1.1.0-alpine completed 72
ghcr.io/github/gh-aw-mcpg:v0.4.37 completed 67
node:lts-alpine completed 56
ghcr.io/github/github-mcp-server:v2.0.3 completed 34
ghcr.io/github/gh-aw-firewall/router:0.28.70 completed 18
ghcr.io/github/gh-aw-firewall/api-proxy:0.28.70 completed 17
ghcr.io/github/gh-aw-firewall/squid:0.28.70 completed 16
ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.70 completed 13
ghcr.io/github/gh-aw-node completed 8
Notable unique Critical CVEs (fixable, highest-value targets)
CVE/Advisory Package Image(s) Fix available
CVE-2026-10536, 11856, 18924, 19931, 8924, 8926, 8927, 9079 curl / libcurl4t64 xberg, serena yes, upstream patch versions published
CVE-2026-63073, 75803 openssl / libssl3 / libcrypto3 grafana, serena, github-mcp-server yes
CVE-2026-109618 / 109619 php8.5-common / php8.5-gd / php8.5-intl gh-aw-firewall/agent yes, 8.5.4-0ubuntu1.5
CVE-2026-19445 python serena yes
CVE-2026-111497 brotli-libs api-proxy, cli-proxy, squid, mcpg, gh-aw-node unconfirmed
CVE-2026-56857 / 78663 docker-cli gh-aw-mcpg unconfirmed
CVE-2026-6653 libxml2 xberg unconfirmed
CVE-2026-52490 libtiff6 xberg unconfirmed
GHSA-332p / 5x8w / 8g5g / v9pv / w889 pillow serena yes
GHSA-6q48 certifi serena yes
GHSA-ffc3 pyjwt serena yes
GO-2026-6612 golang.org/x/net, Go stdlib grafana, gh-aw-mcpg yes

Most of these (curl, openssl, python, pyjwt, pillow, certifi, Go stdlib/x/net) already have a published fixed version β€” these are the cheapest wins since they just need an image/dependency bump rather than a code change. ghcr.io/oraios/serena, ghcr.io/xberg-io/xberg, and grafana/mcp-grafana are third-party images gh-aw depends on, so a version bump (not a code fix) is the lever available for those.

Yamllint YAML Linting Findings

No findings (0/0) β€” clean, consistent with recent scans.

Shellcheck Shell Linting Findings

Code Count Affected Workflows
SC2254 5 daily-safeoutputs-git-simulator.lock.yml (x2), smoke-update-cross-repo-pr.lock.yml (x2), smoke-claude.lock.yml
SC2034 5 same step/workflows as above
SC2041 3 daily-safeoutputs-git-simulator.lock.yml (x2), smoke-claude.lock.yml
SC2086 2 daily-hippo-learn, hippo-embed
SC1003 2 sergo.lock.yml

New today: a cluster of SC2034/SC2041/SC2254 findings on a shared "Fetch additional refs" step, newly surfacing in daily-safeoutputs-git-simulator.lock.yml, smoke-claude.lock.yml, and smoke-update-cross-repo-pr.lock.yml. This mirrors the embedded shellcheck findings reported by actionlint above β€” same codes, same step β€” suggesting a single shared script/template is the common cause. Not yet root-caused.

Top Priority Issues

1. zizmor dangerous-triggers + bot-conditions (High) on command/bot workflows

  • Tool: zizmor
  • Count: 4 (3 dangerous-triggers + 1 bot-conditions)
  • Severity: High
  • Affected: ai-moderator.lock.yml, q.lock.yml, squad.lock.yml
  • Description: issue_comment is flagged as a fundamentally insecure trigger; squad.lock.yml additionally has a spoofable bot-actor check.
  • Impact: All 3 gate real execution behind an activation job checking actor/author association, so impact is architecturally mitigated β€” but zizmor flags the trigger/check pattern regardless of downstream gating. Open since 2026-10-22 (dangerous-triggers) with no fix issue filed yet.
  • Reference: (docs.zizmor.sh/redacted), (docs.zizmor.sh/redacted)

2. zizmor unpinned-images (High), 26+ days open

  • Tool: zizmor
  • Count: 1
  • Severity: High
  • Affected: smoke-service-ports.lock.yml
  • Description: Unpinned image reference in a services: block.
  • Impact: Longest-standing open High finding in this repo with no tracking issue.
  • Reference: (docs.zizmor.sh/redacted)

3. zizmor secrets-outside-env (Medium, highest volume)

  • Tool: zizmor
  • Count: 12,539
  • Severity: Medium
  • Affected: 340 of 348 workflows
  • Description: ${{ secrets.X }} referenced outside a dedicated GitHub Actions environment: block.
  • Impact: Low per-instance risk but dominates the total finding count by volume. See fix suggestion below.
  • Reference: (docs.zizmor.sh/redacted)

4. grype Critical CVEs with available fixes

  • Tool: grype
  • Count: 67 critical findings, ~26 unique CVE/advisory IDs
  • Severity: Critical
  • Affected: ghcr.io/oraios/serena:1.7.0, ghcr.io/xberg-io/xberg:1.3.6, ghcr.io/github/gh-aw-firewall/agent:0.28.70, grafana/mcp-grafana, ghcr.io/github/gh-aw-mcpg, ghcr.io/github/github-mcp-server
  • Description: Known CVEs in base-image packages, most with a fixed version already published upstream (curl, openssl, python, pyjwt, pillow, certifi, Go stdlib/x/net).
  • Impact: serena/xberg/grafana are third-party images gh-aw depends on; for images gh-aw controls directly (firewall, mcpg, github-mcp-server) a version bump is the actionable fix.

Fix Suggestion for zizmor secrets-outside-env (highest-volume finding)

Issue: Secrets referenced in run:/with:/env: outside a dedicated GitHub Actions environment: block
Severity: Medium
Affected Workflows: 340 of 348 workflows (12,539 occurrences)

Prompt to Copilot Agent:

You are fixing a security hygiene finding identified by zizmor.

Vulnerability: secrets-outside-env
Rule: secrets-outside-env - (docs.zizmor.sh/redacted)

Current Issue:
A step references `${{ secrets.SOME_TOKEN }}` (directly, or via `env:`/`with:`)
in a job that does not declare a dedicated `environment:` block. Without an
environment, GitHub does not enforce environment-level protection rules
(required reviewers, wait timers, deployment branch restrictions) around
secret access, and the secret is available to every step in the job rather
than being scoped.

Required Fix:
1. For each affected job, add an `environment:` key naming a dedicated
   GitHub Actions environment for that job (create the environment in repo
   settings if it does not exist, with appropriate protection rules).
2. This repository generates workflows from Markdown via `gh aw compile` --
   fix the root cause once in the Go compiler template/generator that emits
   the job, not by hand-editing each `.lock.yml`. Hand-editing a generated
   file will be overwritten the next time `make recompile` runs.
3. Re-run `gh aw compile` (or `make recompile`) and confirm the zizmor
   `secrets-outside-env` count drops across all regenerated workflows.

Example:
Before:
```yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: curl -H "Authorization: Bearer ${{ secrets.DEPLOY_TOKEN }}" ...
```

After:
```yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - run: curl -H "Authorization: Bearer ${{ secrets.DEPLOY_TOKEN }}" ...
```

Please apply this fix at the compiler-template level that generates agent/
safe-outputs jobs referencing secrets, since the 12,539 occurrences span 340
auto-generated workflow files rather than being hand-authored per file.

Historical Trends

  • Previous Scan: 2026-10-24
  • Total Findings Then: 21,949
  • Total Findings Now: 21,964
  • Change: +15 (+0.07%)

New Issues

  • No new issue types. A new (currently unattributed) shellcheck/actionlint-shellcheck cluster surfaced on a shared "Fetch additional refs" step in 3 workflows (daily-safeoutputs-git-simulator.lock.yml, smoke-claude.lock.yml, smoke-update-cross-repo-pr.lock.yml).

Resolved Issues

Long-standing open items (no fix issue yet)

Recommendations

  1. Immediate: Investigate the new shellcheck/actionlint cluster on the shared "Fetch additional refs" step (3 workflows) before it spreads further.
  2. Short-term: File a tracking issue for zizmor dangerous-triggers/bot-conditions (3 workflows) and the 26+ day-old unpinned-images finding β€” neither has a dedicated fix issue yet.
  3. Short-term: Bump base images/dependencies with already-published fixes for the grype Critical CVEs (curl, openssl, pillow, certifi, pyjwt, Go stdlib/x/net) in the images gh-aw controls directly (firewall, mcpg, github-mcp-server).
  4. Long-term: Fix the actionlint expression property-gap at the compiler-template level (needs-context object type for safe-outputs conclusion jobs), and apply the secrets-outside-env β†’ environment: fix broadly since it affects 340 of 348 workflows.
  5. Prevention: Investigate why the RGS-012 runner-guard:ignore suppression on github-remote-mcp-auth-test.lock.yml is not honored by the scanner despite being present in the source β€” this may affect every other suppression comment in the repo.

Next Steps

  • Root-cause the new "Fetch additional refs" shellcheck/actionlint cluster (3 workflows)
  • File a tracking issue for zizmor dangerous-triggers/bot-conditions and the 26+ day-old unpinned-images finding
  • Bump images/dependencies for grype Critical CVEs with available fixes
  • Apply the secrets-outside-env β†’ environment: fix at the compiler-template level
  • Fix the actionlint needs-context expression property gap (161 occurrences, 39 workflows)
  • Investigate why the RGS-012 runner-guard:ignore suppression isn't honored by the scanner
  • Confirm whether the zizmor obfuscation rule's disappearance is a genuine fix

References:

Generated by πŸ“Š Static Analysis Report Β· claude Β· agent Β· ~223 AIC Β· βŒ– ~1 AIC Β· ⊞ 4.7K Β· β—·

  • expires on Oct 31, 2026, 9:28 PM UTC-08:00

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions