Skip to content

Fix PR sweeper: stop expanding pull_request.body inside a run comment - #490

Merged
soyalejolopez merged 1 commit into
microsoft:masterfrom
soyalejolopez:upstream-fix-sweeper-injection
Jul 22, 2026
Merged

Fix PR sweeper: stop expanding pull_request.body inside a run comment#490
soyalejolopez merged 1 commit into
microsoft:masterfrom
soyalejolopez:upstream-fix-sweeper-injection

Conversation

@soyalejolopez

Copy link
Copy Markdown
Member

The "Write PR metadata" step warned that interpolating the PR body into a shell step is an injection sink, but it wrote the pull_request.body context expression (in ${{ }} form) inside a comment to say so. GitHub expands ${{ }} expressions textually before bash runs -- even inside a "#" comment -- so the PR body was injected into the generated script. On any PR whose body contained newlines this broke the step with exit code 127 ("$'\r': command not found").

Rewritten as literal "pull_request.body" text so nothing is expanded. The body is still deliberately never captured; all values continue to flow through env and jq --arg.

Copilot-Session: cecb163d-04c4-4b01-ab7a-14d25f7ec690

The "Write PR metadata" step warned that interpolating the PR body into a
shell step is an injection sink, but it wrote the pull_request.body context
expression (in ${{ }} form) inside a comment to say so. GitHub expands ${{ }}
expressions textually before bash runs -- even inside a "#" comment -- so the
PR body was injected into the generated script. On any PR whose body contained
newlines this broke the step with exit code 127 ("$'\r': command not found").

Rewritten as literal "pull_request.body" text so nothing is expanded. The body
is still deliberately never captured; all values continue to flow through env
and jq --arg.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cecb163d-04c4-4b01-ab7a-14d25f7ec690
@soyalejolopez
soyalejolopez merged commit 3e6b5b2 into microsoft:master Jul 22, 2026
@soyalejolopez
soyalejolopez deleted the upstream-fix-sweeper-injection branch July 22, 2026 14:37
@github-actions

Copy link
Copy Markdown
Contributor

🛰️ PR Sweeper report

Risk: 🟠 MEDIUM · Security gate: ✅ passing · Files: 1

🔒 Automated guardrails (authoritative)

Category Location Finding
⚠️ scope Touches security-sensitive path(s): .github/workflows/pr-sweeper.yml. Maintainer + security review required.

🤖 Dual-model AI review (advisory)

Deep-reasoning revieweropenai/o3 · verdict: approve · risk: low

The PR only refines comments in the workflow, reinforcing existing script-injection precautions. No executable logic or configuration was altered, so it introduces no new security or quality concerns.

Quality notes:

  • .github/workflows/pr-sweeper.yml — Only comment wording adjusted; no functional changes.

✅ Suggested next steps

  • Proceed with merge; no follow-up actions required.

The automated guardrails are authoritative and gate the security status. The AI review is advisory and never auto-merges. Thanks for contributing to FastTrack! 🛩️

@github-actions github-actions Bot added sweeper:ai-reviewed PR Sweeper: dual-model AI review attached sweeper:risk-medium PR Sweeper: medium risk sweeper:scope-review PR Sweeper: scope/sensitive-path review labels Jul 22, 2026
soyalejolopez added a commit that referenced this pull request Jul 22, 2026
#484)

* Harden supply chain: message-center injection, PII in samples, workflow perms

- update-message-center: sanitise fetched Message Center posts against a schema
  whitelist and JSON.stringify + escape </script>, U+2028/2029 and & when embedding
  data into the generated page, preventing stored HTML/script injection from
  upstream feed content. Also removes the unattended 'gh pr merge --auto' step so
  generated changes require human review.
- Sample data: replace real-looking tenant identities, UPNs, phone numbers and GUIDs
  in three sample CSVs with Contoso / 555-01xx / random-GUID placeholders (no PII).
- build-catalog.yml: drop top-level token to 'contents: read' and grant
  'contents: write' only to the publish job, so the PR-triggered validate job (which
  runs untrusted fork changes) can no longer write to the repo.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cecb163d-04c4-4b01-ab7a-14d25f7ec690

* chore: re-trigger checks after upstream sweeper fix (#490)

Empty commit to run Stage 1 PR Sweeper against the now-fixed workflow on master. Will be removed by squash-merge.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cecb163d-04c4-4b01-ab7a-14d25f7ec690

---------

Co-authored-by: soyalejolopez <88358406+soyalejolopez@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

sweeper:ai-reviewed PR Sweeper: dual-model AI review attached sweeper:risk-medium PR Sweeper: medium risk sweeper:scope-review PR Sweeper: scope/sensitive-path review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants