Static Analysis Report - 2026-03-29 #23478
Closed
Replies: 1 comment
-
|
This discussion has been marked as outdated by Static Analysis Report. A newer discussion is available at Discussion #23579. |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Analysis Summary
Daily static analysis scan of all agentic workflows using zizmor, poutine, and actionlint. Of 178 workflows scanned, 157 compiled successfully and 21 failed (all due to a missing shared import file). Total findings: 7,383 issues across the three tools.
Compilation Failures
21 workflows failed to compile — all due to the same missing import:
View 21 Failed Workflows
Root cause: All reference
shared/mcp/serena-go.mdwhich does not exist in the repository. This is likely a recently added shared component not yet committed, or a renamed/moved file.Findings by Tool
Clustered Findings by Tool and Type
Zizmor Security Findings
Poutine Supply Chain Findings
Actionlint Linting Issues
\$\{RUNNER_TEMP}in generated run stepsTop Priority Issues
1. Template Injection (High Severity) — 24 Workflows
These workflows use GitHub Actions expression syntax (
$\{\{ ... }}) insiderun:blocks, which can allow an attacker to inject arbitrary shell commands if the expression value is controlled by untrusted input (e.g., issue titles, PR body, user-supplied data).View 24 Affected Workflows
2. Secrets Outside Environment Variables — 157 Workflows (3,357 occurrences)
Every compiled workflow references secrets directly in step definitions rather than mapping them through the
env:block. This means secrets can appear in logs, error messages, or be accessed by other steps more broadly than intended. This appears to be a systemic pattern generated by the compiler.3. Unpinned Action References — daily-fact (5 occurrences)
The
daily-factworkflow uses action references without pinning to a specific commit SHA, creating supply chain risk. Tags can be silently moved.4. Missing Shared Import — 21 Workflows (compilation failure)
All 21 failed workflows import
shared/mcp/serena-go.mdwhich does not exist. These workflows cannot be compiled and their security posture cannot be assessed.5. Dangerous GITHUB_ENV Usage — dev-hawk
Writing to the
$GITHUB_ENVfile with untrusted data allows environment variable injection that persists across steps.Fix Suggestion: Template Injection (Highest Priority)
Issue: Code injection via GitHub Actions expression template expansion
Severity: High
Affected Workflows: 24 workflows
Prompt to Copilot Agent:
All Findings Details
Zizmor — Full High Severity Findings
Template Injection (High) — 24 Workflows
All occur at the "Write Safe Outputs Config" step pattern.
Unpinned Action References (High) — daily-fact
GITHUB_ENV Dangerous Use (High) — dev-hawk
Poutine — Full Findings
Errors (Blocking)
untrusted_checkout_exec in
smoke-workflow-callandsmoke-workflow-call-with-inputs:# poutine:ignore untrusted_checkout_execcommentsWarnings
pr_runs_on_self_hosted:
dev.lock.yml:1169— runs-on: aw-gpu-runner-T4smoke-copilot-arm.lock.yml:369— runs-on: ubuntu-24.04-armInformational Notes
smoke-codex— usesactions-ecosystem/action-add-labels(unverified creator)super-linter— usessuper-linter/super-linter(unverified creator)copilot-setup-steps,daily-copilot-token-report— execute unverified script viacurl | bashfrom install-gh-aw.shmcp-inspector,copilot-setup-steps,daily-copilot-token-report— useastral-sh/setup-uv(unverified creator)link-check— usesgaurav-nelson/github-action-markdown-link-check(unverified creator)Actionlint — Summary by Type
SC2086 — Unquoted Variables (3,873 occurrences)
All instances follow the same pattern generated by the gh-aw compiler:
run: bash \$\{RUNNER_TEMP}/gh-aw/actions/some-script.shShould be:
run: bash "\$\{RUNNER_TEMP}/gh-aw/actions/some-script.sh"This is a compiler-level issue — the fix should be applied in the template generation code, not in individual workflow
.mdfiles.Permissions Issues (37 occurrences)
Workflow steps with permission-related actionlint violations.
Runner Label Issues (10 occurrences)
Steps referencing runner labels that actionlint cannot verify.
Expression Syntax Issues (8 occurrences)
GitHub Actions expression syntax errors in 8 locations.
Historical Trends
First scan — no baseline available. Future scans will compare against today's results.
Recommendations
Immediate — Fix missing import: Investigate
shared/mcp/serena-go.md— create or restore this shared file so 21 workflows can compile and be analyzed.High Priority — Fix template injection: Apply environment variable indirection to the 24 workflows with High severity
template-injectionfindings. The fix prompt above is ready for a Copilot coding agent.High Priority — Pin actions in daily-fact: Pin all 5 action references in
daily-factto specific commit SHAs instead of tags.High Priority — Review dev-hawk GITHUB_ENV: Audit the dangerous
$GITHUB_ENVusage indev-hawkat line 1209.Medium — Compiler fix for SC2086: The gh-aw compiler should quote
\$\{RUNNER_TEMP}in generated shellrun:steps. This one compiler fix would eliminate 3,873 of 3,928 actionlint errors.Medium — Compiler fix for secrets-outside-env: The secrets injection pattern used by the compiler triggers 3,357 Medium zizmor findings. Consider mapping secrets through
env:blocks in generated YAML.Long-term: Add all three static analysis tools to the CI pipeline's merge gates so issues are caught before compilation succeeds.
Next Steps
shared/mcp/serena-go.mdto unblock 21 failed workflowsdaily-fact\$\{RUNNER_TEMP}in generated shell stepssmoke-workflow-call*workflowsReferences:
Beta Was this translation helpful? Give feedback.
All reactions