🔍 Static Analysis Report - 2026-09-05
Analysis Summary
- Tools configured: zizmor, poutine, actionlint, runner-guard, syft, grype, yamllint, shellcheck
- Tools with data this run: zizmor, actionlint (only these two produced any output in
compile-output.txt)
- Total zizmor findings: 13,442 (+6 vs 2026-09-04's 13,436)
- Workflows scanned: 299
- Workflows affected (zizmor): 299 / 299
- Build gate: ✗ zizmor failed (11 High severity findings trip the gate)
⚠️ Data-completeness note: poutine, runner-guard, syft, grype, yamllint, and shellcheck produced zero output lines anywhere in compile-output.txt for the second consecutive day (verified via case-insensitive search for tool names, CVE-, RGS-, and SBOM markers — all zero hits except the actionlint header text "Running actionlint (with shellcheck/pyflakes)..."). This is an instrumentation gap, not a clean bill of health — it should not be read as "0 findings" for those 6 tools. This is already tracked in #58562 ("Static-analysis scan pipeline instrumentation gap: 6/8 tools produced zero output") with a fix in progress at #58717 ("[WIP] Fix static-analysis scan pipeline instrumentation gap", fixes #58562). No new issue is being filed for this — see those two instead.
Findings by Tool
| Tool |
Total |
Critical |
High |
Medium |
Low |
| zizmor (security) |
13,442 |
0 |
11 |
8,801 |
2,408 (+2,222 informational) |
| poutine (supply chain) |
— no data (gap) |
— |
— |
— |
— |
| actionlint (linting) |
0 |
- |
- |
- |
- |
| runner-guard (taint analysis) |
— no data (gap) |
— |
— |
— |
— |
| syft (SBOM inventory) |
— no data (gap) |
— |
— |
— |
— |
| grype (container CVEs) |
— no data (gap) |
— |
— |
— |
— |
| yamllint (yaml linting) |
— no data (gap) |
— |
— |
— |
— |
| shellcheck (shell linting) |
— no data (gap) |
— |
— |
— |
— |
Clustered Findings by Tool and Type
Zizmor Security Findings
| Issue Type |
Severity |
Count |
Unique Workflows |
| secrets-outside-env |
Medium |
8,725 |
296 / 299 |
| anonymous-definition |
Informational |
2,190 |
299 / 299 |
| undocumented-permissions |
Low |
1,766 |
299 / 299 |
| adhoc-packages |
Low |
611 |
238 / 299 |
| artipacked |
Medium |
75 |
72 / 299 |
| template-injection |
Info/Low |
34 |
13 / 299 |
| obfuscation |
Low |
28 |
28 / 299 |
| github-app |
High |
8 |
4 (squad-*.lock.yml) |
| secrets-inherit |
Medium |
1 |
1 |
| superfluous-actions |
Informational |
1 |
1 |
| unpinned-images |
High |
1 |
1 (smoke-service-ports.lock.yml) |
| github-env |
High |
1 |
1 (dev-hawk.lock.yml) |
| bot-conditions |
High |
1 |
1 (squad.lock.yml) |
All 4 High-severity rule/workflow pairs are unchanged since 2026-09-04 — none are new today, none have been fixed yet.
Actionlint Linting Issues
None — 0 findings across 299 files, consistent with prior runs.
Poutine / Runner-Guard / Syft / Grype / Yamllint / Shellcheck
No data produced this run (see instrumentation-gap note above). Historical baselines from the last run that had data (2026-09-02) are preserved in cache memory (vulnerabilities/by-tool.json) and should not be overwritten with zeros.
Top Priority Issues
1. zizmor github-app: unscoped GitHub App tokens in 4 squad-* workflows
- Tool: zizmor
- Count: 8 occurrences / 4 workflows (squad-game-planner, squad-implement-worker, squad-plan, squad)
- Severity: High
- Description: Each workflow mints a token via
actions/create-github-app-token with no permissions: input, so the token inherits the full permission set of the GitHub App installation instead of a scoped subset.
- Impact: If any step in these jobs is compromised (malicious dependency, prompt injection into an agent step, supply-chain issue), the attacker gets a token scoped to everything the app can do, not just what the job needs.
- Reference: (docs.zizmor.sh/redacted)
- Status: No GitHub issue exists yet for this finding (checked via search). A fix template already exists in cache memory (
fix-templates/zizmor-github-app.md) from 2026-09-04.
2. zizmor github-env: dev-hawk — recurring regression
3. zizmor unpinned-images / bot-conditions
- unpinned-images (High, 1×, smoke-service-ports.lock.yml):
services.redis.image: redis:7 uses a floating tag instead of a digest pin.
- bot-conditions (High, 1×, squad.lock.yml):
pre_activation job's if: condition includes github.actor == 'github-actions[bot]' as a bypass check — actor names are spoofable and shouldn't gate trust decisions.
- Neither has a dedicated issue yet.
4. zizmor secrets-outside-env (volume driver, Medium)
- 8,725 occurrences across 296/299 workflows — by far the largest contributor to total finding count, but Medium severity and effectively unchanged day-over-day. Not prioritized for immediate action; noted for completeness since it dominates the raw numbers.
Fix Suggestion for github-app (zizmor)
Issue: GitHub App token minted via actions/create-github-app-token with no permissions: input
Severity: High
Affected Workflows: 4 (squad-game-planner.lock.yml, squad-implement-worker.lock.yml, squad-plan.lock.yml, squad.lock.yml) — 8 occurrences
Prompt to Copilot Agent:
You are fixing a security vulnerability identified by zizmor.
Vulnerability: github-app - dangerous use of GitHub App tokens
Rule: github-app - (docs.zizmor.sh/redacted)
Current Issue:
A workflow step uses actions/create-github-app-token to mint an installation
access token but does not pass a `permissions:` input. Without it, the minted
token inherits ALL permissions granted to the GitHub App installation, not
just the subset the job actually needs. If the job's environment is later
compromised (e.g. via a malicious dependency, prompt injection into an agent
step, or a supply-chain issue in another step), the attacker gets a token
scoped to the app's full installation permissions instead of a minimal set.
Required Fix:
1. Locate the `uses: actions/create-github-app-token@...` step (search for
"Mint Squad GitHub App token" — all 4 affected workflows share the
identical step, so there is likely one shared source template/include to
fix instead of 4 separate files).
2. Add a `permissions:` map under `with:` listing only the scopes the token
is actually used for downstream (check every place
`steps.<id>.outputs.token` is consumed to determine the real minimum set,
e.g. `contents: write`, `issues: write`, `pull-requests: write`).
3. Fix must be applied in the .md source (not the generated .lock.yml), then
run `make recompile` so it survives the next compile.
4. Re-run zizmor to confirm the finding clears.
Example:
Before:
```yaml
- name: Mint Squad GitHub App token
id: squad-app-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
app-id: ${{ vars.SQUAD_GITHUB_APP_ID }}
owner: ${{ vars.SQUAD_GITHUB_APP_OWNER }}
private-key: ${{ secrets.SQUAD_GITHUB_APP_PRIVATE_KEY }}
After:
- name: Mint Squad GitHub App token
id: squad-app-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
app-id: ${{ vars.SQUAD_GITHUB_APP_ID }}
owner: ${{ vars.SQUAD_GITHUB_APP_OWNER }}
private-key: ${{ secrets.SQUAD_GITHUB_APP_PRIVATE_KEY }}
permissions: >-
{"contents": "write", "issues": "write", "pull-requests": "write"}
(replace the scope map with whatever this token is actually used for in each
workflow.)
Please apply this fix to all affected workflows via their shared source:
squad-game-planner.lock.yml, squad-implement-worker.lock.yml,
squad-plan.lock.yml, squad.lock.yml
### All Findings Details
<details>
<summary><b>Zizmor severity breakdown (raw counts)</b></summary>
- High: 11
- Medium: 8,801
- Low: 2,408
- Informational: 2,222
- **Total: 13,442**
</details>
<details>
<summary><b>Compiler warnings (gh-aw compiler itself, not one of the 8 tools)</b></summary>
| Warning | Count |
|---|---|
| `sandbox.agent.runtime: cloud-hypervisor` requires human security review | 97 |
| `sandbox.agent.runtime: gvisor` deprecated | 37 |
| `sandbox.agent.runtime: docker-sbx` deprecated | 35 |
| `workflow_dispatch` missing `concurrency.job-discriminator` | 31 |
| Threat detection engine `pi` missing `copilot-requests: write` | 18 |
| Template separator appears mid-line | 15 |
| Prompt references `/tmp/` directly instead of `/tmp/gh-aw/agent/` | 10 |
| Missing required permissions for GitHub toolsets | 8 |
199 / 299 workflows have at least one compiler warning. These are gh-aw's own compile-time diagnostics, distinct from the 8 static-analysis tools, kept here for completeness.
</details>
### Historical Trends
- **Previous Scan**: 2026-09-04 (issue #58390, still open)
- **Total zizmor findings then**: 13,436
- **Total zizmor findings now**: 13,442
- **Change**: +6 (+0.04%) — essentially flat, entirely within `secrets-outside-env`
#### New Issues
None — all 4 High findings are carried over unchanged from 2026-09-04.
#### Resolved Issues
`github_action_from_unverified_creator_used` (info, was ~29/day from 2026-08-22 through 2026-09-02) remains absent for a **2nd consecutive day**, increasingly looking like a genuine fix rather than a fluke.
### Recommendations
1. **Immediate**: Get the instrumentation-gap fix (#58717) merged — six of eight tools have been dark for two days, which hides any real regressions in poutine/runner-guard/syft/grype/yamllint/shellcheck coverage.
2. **Immediate**: File a fix for the 3 net-new zizmor High findings that have no issue yet — `github-app` (4 squad-* workflows), `unpinned-images` (smoke-service-ports), `bot-conditions` (squad.lock.yml).
3. **Short-term**: Investigate why dev-hawk's `github-env` finding keeps regressing after 6 prior fixes — likely a template/source-generation issue, not a one-off code bug.
4. **Long-term**: Once poutine/runner-guard/syft/grype/yamllint/shellcheck data resumes, re-baseline against the last known-good run (2026-09-02) rather than treating the 2-day gap as "0 findings."
### Next Steps
- [ ] Merge #58717 to restore poutine/runner-guard/syft/grype/yamllint/shellcheck output
- [ ] Fix `github-app` unscoped token permissions in the 4 squad-* workflows (fix prompt above)
- [ ] Fix `unpinned-images` in smoke-service-ports.lock.yml (pin redis image to digest)
- [ ] Fix `bot-conditions` spoofable actor check in squad.lock.yml
- [ ] Root-cause dev-hawk's recurring `github-env` regression (6th recurrence)
**References:**
- Prior report: #58390
- Instrumentation gap tracking: #58562
- Instrumentation gap fix (WIP): #58717
- Workflow run: [§33945254017](https://github.com/github/gh-aw/actions/runs/33945254017)
> [!WARNING]
> <details>
> <summary>Firewall blocked 1 domain</summary>
>
> The following domain was blocked by the firewall during workflow execution:
>
> - `api.anthropic.com`
>
> To allow these domains, add them to the `network.allowed` list in your workflow frontmatter:
>
> ```yaml
> network:
> allowed:
> - defaults
> - "api.anthropic.com"
> ```
>
> See [Network Configuration](https://github.github.com/gh-aw/reference/network/) for more information.
>
> </details>
> Generated by [📊 Static Analysis Report](https://github.com/github/gh-aw/actions/runs/33945254017) · claude · agent · 253.2 AIC · ⌖ 10.5 AIC · ⊞ 11.9K · [◷](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-09-12T04:56:21.687Z --> on Sep 11, 2026, 8:56 PM UTC-08:00
<!-- gh-aw-agentic-workflow: Static Analysis Report, engine: claude, model: agent, id: 33945254017, workflow_id: static-analysis-report, run: https://github.com/github/gh-aw/actions/runs/33945254017 -->
<!-- gh-aw-workflow-id: static-analysis-report -->
<!-- gh-aw-workflow-call-id: github/gh-aw/static-analysis-report -->
🔍 Static Analysis Report - 2026-09-05
Analysis Summary
compile-output.txt)compile-output.txtfor the second consecutive day (verified via case-insensitive search for tool names,CVE-,RGS-, andSBOMmarkers — all zero hits except the actionlint header text "Running actionlint (with shellcheck/pyflakes)..."). This is an instrumentation gap, not a clean bill of health — it should not be read as "0 findings" for those 6 tools. This is already tracked in #58562 ("Static-analysis scan pipeline instrumentation gap: 6/8 tools produced zero output") with a fix in progress at #58717 ("[WIP] Fix static-analysis scan pipeline instrumentation gap", fixes #58562). No new issue is being filed for this — see those two instead.Findings by Tool
Clustered Findings by Tool and Type
Zizmor Security Findings
All 4 High-severity rule/workflow pairs are unchanged since 2026-09-04 — none are new today, none have been fixed yet.
Actionlint Linting Issues
None — 0 findings across 299 files, consistent with prior runs.
Poutine / Runner-Guard / Syft / Grype / Yamllint / Shellcheck
No data produced this run (see instrumentation-gap note above). Historical baselines from the last run that had data (2026-09-02) are preserved in cache memory (
vulnerabilities/by-tool.json) and should not be overwritten with zeros.Top Priority Issues
1. zizmor
github-app: unscoped GitHub App tokens in 4squad-*workflowsactions/create-github-app-tokenwith nopermissions:input, so the token inherits the full permission set of the GitHub App installation instead of a scoped subset.fix-templates/zizmor-github-app.md) from 2026-09-04.2. zizmor
github-env: dev-hawk — recurring regressionrun:step writes to$GITHUB_ENVfrom a value seeded by anenv:var, which zizmor flags as a potential environment-file injection vector.github-envinjection risk indev-hawkby switching GH_HOST propagation to step outputs #27219, Resolve dev-hawkgithub-envhighs by tightening env-file usage in generated workflow steps #37586, Eliminate persistent zizmorgithub-envfinding indev-hawksafe-outputs path #38050 (spanning 2026-03-22 through 2026-06-09). It keeps reappearing, which suggests the fix isn't surviving regeneration of dev-hawk's compiled.lock.yml— likely a template/source issue rather than a one-off code bug.3. zizmor
unpinned-images/bot-conditionsservices.redis.image: redis:7uses a floating tag instead of a digest pin.pre_activationjob'sif:condition includesgithub.actor == 'github-actions[bot]'as a bypass check — actor names are spoofable and shouldn't gate trust decisions.4. zizmor
secrets-outside-env(volume driver, Medium)Fix Suggestion for
github-app(zizmor)Issue: GitHub App token minted via
actions/create-github-app-tokenwith nopermissions:inputSeverity: High
Affected Workflows: 4 (squad-game-planner.lock.yml, squad-implement-worker.lock.yml, squad-plan.lock.yml, squad.lock.yml) — 8 occurrences
Prompt to Copilot Agent:
After:
(replace the scope map with whatever this token is actually used for in each
workflow.)
Please apply this fix to all affected workflows via their shared source:
squad-game-planner.lock.yml, squad-implement-worker.lock.yml,
squad-plan.lock.yml, squad.lock.yml