Repository navigation
Description
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_commentflagged 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) andbot-conditions(squad.lock.yml) have now been open 26+ consecutive days with no dedicated fix issue filed.- The
obfuscationrule (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-envis high-volume but Medium severity; it fires on every${{ secrets.X }}reference not wrapped in a dedicated GitHub Actionsenvironment: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_commentis 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 Actionsenvironment: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
- runner-guard RGS-018 on
video-analyzer.lock.ymlβ finding is gone (issue [static-analysis] RGS-018: Suspicious Payload Execution Pattern in video-analyzer.lock.ymlΒ #71352 closed 2026-10-24). - zizmor
obfuscationrule β 39 findings/31 workflows on 2026-10-24, 0/0 today. Unconfirmed cause (genuine fix vs. ruleset change).
Long-standing open items (no fix issue yet)
- zizmor
unpinned-images(smoke-service-ports.lock.yml) andbot-conditions(squad.lock.yml) β High severity, 26+ consecutive days open. - zizmor
dangerous-triggers(ai-moderator.lock.yml, q.lock.yml, squad.lock.yml) β High severity, open since 2026-10-22. - actionlint
expressionproperty-gap (missing_tool/report_incomplete/noop/report_failed_jobs on the needs-context object type) β 161 occurrences across 39 workflows, longstanding. - runner-guard RGS-012 on github-remote-mcp-auth-test.lock.yml β its inline
runner-guard:ignore RGS-012suppression comment is still not honored by the scanner, 2 months after the suppression PR (Suppress RGS-012 finding for pinned GitHub remote MCP handshake curlΒ #55686) merged. Tracked under Closes [static-analysis] RGS-012: Secret Exfiltration via Outbound HTTP Request in github-remote-mcp-auth-test.lock.ymlΒ #55652; the suppression mechanism itself may need a scanner-side fix.
Recommendations
- Immediate: Investigate the new shellcheck/actionlint cluster on the shared "Fetch additional refs" step (3 workflows) before it spreads further.
- Short-term: File a tracking issue for zizmor
dangerous-triggers/bot-conditions(3 workflows) and the 26+ day-oldunpinned-imagesfinding β neither has a dedicated fix issue yet. - 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).
- Long-term: Fix the actionlint
expressionproperty-gap at the compiler-template level (needs-context object type for safe-outputs conclusion jobs), and apply thesecrets-outside-envβenvironment:fix broadly since it affects 340 of 348 workflows. - Prevention: Investigate why the RGS-012
runner-guard:ignoresuppression ongithub-remote-mcp-auth-test.lock.ymlis 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-conditionsand the 26+ day-oldunpinned-imagesfinding - 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
expressionproperty gap (161 occurrences, 39 workflows) - Investigate why the RGS-012
runner-guard:ignoresuppression isn't honored by the scanner - Confirm whether the zizmor
obfuscationrule's disappearance is a genuine fix
References:
- This run: Β§40163103016
Generated by π Static Analysis Report Β· claude Β· agent Β· ~223 AIC Β· β ~1 AIC Β· β 4.7K Β· β·
- expires on Oct 31, 2026, 9:28 PM UTC-08:00
Activity