fix: prevent git option injection via new_branch - #755
Conversation
Validate new_branch as a branch name and pass it after -- so values like --force cannot force-checkout or force-push. Co-authored-by: Cursor <cursoragent@cursor.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughThe change validates ChangesBranch Safety
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant Action
participant InputValidation
participant Git
participant Remote
Action->>InputValidation: validate new_branch
InputValidation->>Git: run git check-ref-format --branch
Git-->>InputValidation: return validation result
InputValidation-->>Action: accept or reject branch name
Action->>Git: checkout or create branch
Action->>Git: push named branch with --
Git->>Remote: push branch
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main.ts`:
- Around line 82-88: Update the checkout flow in the visible branch-handling
chain to remove the `--` separator from both branch operands: use
`git.checkout([targetBranch])` for the existing-branch path and
`git.checkout(['-b', targetBranch], log)` when creating the branch. Preserve the
surrounding success and fallback logging.
In `@src/util.ts`:
- Around line 51-57: Update the validator loop in src/util.ts lines 51-57 to
reject all contract-defined Unicode whitespace and C1 control characters, not
just ASCII values, while preserving existing rejection behavior. Add rejection
cases for \u00A0 and \u0085 in test/util.test.ts lines 72-82 to verify both
categories.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 333d4d79-dffd-4c95-a44f-8aaf5b850584
📒 Files selected for processing (7)
README.mdaction.ymllib/index.jssrc/io.tssrc/main.tssrc/util.tstest/util.test.ts
Reject Unicode whitespace/C1 controls in branch names, and drop the checkout -- separator after early validation. Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve conflicts by keeping new_branch validation alongside remote-helper arg blocking. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
README.md (2)
132-132: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winImplement the Git branch-name checks before documenting
new_branchas a valid branch name.
assertValidBranchName()only rejects empty values, leading hyphens, and whitespace/control characters. It still accepts ref forms that Git rejects, such asfeature..name,name@{x},name~1, andname.. Usegit check-ref-format --branchor reimplement the full branch-validation rules, then keep the README wording aligned with the enforced limits.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@README.md` at line 132, Update assertValidBranchName() to validate branch names using git check-ref-format --branch or equivalent complete Git branch rules, rejecting forms such as feature..name, name@{x}, name~1, and names ending with a dot. After enforcement is complete, keep the README new_branch description aligned with the actual accepted constraints.
104-105: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick winUse transport-neutral wording for the execution risk.
--upload-pack,--receive-pack, and--execselect the Git service path for the transport peer. They do not always run a local program; SSH transport runs the selected program remotely, while a local helper or file transport may run it locally. Change “arbitrary local program” to wording such as “an arbitrary Git transport program” or “an arbitrary program on the transport peer.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@README.md` around lines 104 - 105, Update the remote-helper override warning in the README to replace “arbitrary local program” with transport-neutral wording such as “an arbitrary Git transport program” or “an arbitrary program on the transport peer,” while preserving the surrounding security guidance.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@README.md`:
- Line 132: Update assertValidBranchName() to validate branch names using git
check-ref-format --branch or equivalent complete Git branch rules, rejecting
forms such as feature..name, name@{x}, name~1, and names ending with a dot.
After enforcement is complete, keep the README new_branch description aligned
with the actual accepted constraints.
- Around line 104-105: Update the remote-helper override warning in the README
to replace “arbitrary local program” with transport-neutral wording such as “an
arbitrary Git transport program” or “an arbitrary program on the transport
peer,” while preserving the surrounding security guidance.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 654a7df6-72e0-43de-9094-c003c2fa478b
📒 Files selected for processing (4)
README.mdlib/index.jssrc/util.tstest/util.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- src/util.ts
- test/util.test.ts
Reject invalid ref forms via check-ref-format --branch, align docs, and clarify the remote-helper warning wording. Co-authored-by: Cursor <cursoragent@cursor.com>
Bumps EndBug/add-and-commit from 10 to 11. Release notes Sourced from EndBug/add-and-commit's releases. v11.0.0 What's Changed chore(deps): bump picomatch by @dependabot[bot] in EndBug/add-and-commit#724 chore(deps-dev): bump handlebars from 4.7.8 to 4.7.9 by @dependabot[bot] in EndBug/add-and-commit#725 chore(deps): bump lodash from 4.17.23 to 4.18.1 by @dependabot[bot] in EndBug/add-and-commit#728 chore(deps-dev): bump ts-jest from 29.4.6 to 29.4.9 by @dependabot[bot] in EndBug/add-and-commit#727 chore(deps): bump @actions/github from 9.0.0 to 9.1.0 by @dependabot[bot] in EndBug/add-and-commit#729 chore(deps): bump @actions/github from 9.1.0 to 9.1.1 by @dependabot[bot] in EndBug/add-and-commit#732 chore(deps): bump @actions/core from 3.0.0 to 3.0.1 by @dependabot[bot] in EndBug/add-and-commit#733 ci(deps): bump actions/dependency-review-action from 4 to 5 by @dependabot[bot] in EndBug/add-and-commit#734 chore(deps-dev): bump ts-jest from 29.4.9 to 29.4.11 by @dependabot[bot] in EndBug/add-and-commit#736 chore(deps-dev): bump jest from 30.3.0 to 30.4.2 by @dependabot[bot] in EndBug/add-and-commit#735 chore(deps-dev): bump eslint-plugin-prettier from 5.5.5 to 5.5.6 by @dependabot[bot] in EndBug/add-and-commit#738 chore(deps): bump js-yaml from 4.1.1 to 4.2.0 by @dependabot[bot] in EndBug/add-and-commit#739 ci(deps): bump actions/checkout from 6 to 7 by @dependabot[bot] in EndBug/add-and-commit#741 chore(deps): bump undici from 6.24.1 to 6.27.0 by @dependabot[bot] in EndBug/add-and-commit#744 ci(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in EndBug/add-and-commit#749 chore(deps-dev): bump @vercel/ncc from 0.38.4 to 0.44.1 by @dependabot[bot] in EndBug/add-and-commit#746 chore(deps): bump js-yaml from 4.2.0 to 5.2.1 by @dependabot[bot] in EndBug/add-and-commit#747 chore(deps-dev): bump ts-jest from 29.4.11 to 29.4.12 by @dependabot[bot] in EndBug/add-and-commit#750 chore(deps): bump js-yaml from 5.2.1 to 5.2.2 by @dependabot[bot] in EndBug/add-and-commit#751 chore(deps): bump undici from 6.27.0 to 6.28.0 by @dependabot[bot] in EndBug/add-and-commit#753 fix: reject remote-helper git flags that enable RCE by @EndBug in EndBug/add-and-commit#754 fix: prevent git option injection via new_branch by @EndBug in EndBug/add-and-commit#755 fix: verify committed lib/ matches source in CI by @EndBug in EndBug/add-and-commit#756 fix: stop logging full git config (credential leak) by @EndBug in EndBug/add-and-commit#758 fix: reject -F/--file git args that can exfiltrate runner files by @EndBug in EndBug/add-and-commit#759 fix: reject unmatched quotes in matchGitArgs to prevent flag injection by @EndBug in EndBug/add-and-commit#760 fix: refuse unexpected gitlinks staged by git add by @EndBug in EndBug/add-and-commit#761 fix: do not report committed=true for empty commit SHA by @EndBug in EndBug/add-and-commit#757 ci: pin actions-tagger and restrict release workflow permissions by @EndBug in EndBug/add-and-commit#762 fix: neutralize bidi and control chars in action logs by @EndBug in EndBug/add-and-commit#763 Full Changelog: EndBug/add-and-commit@v10.0.0...v11.0.0 Commits 645ecc0 11.0.0 06e788f fix: neutralize bidi and control chars in action logs (#763) 68ec86a ci: pin actions-tagger and restrict release workflow permissions (#762) f1bb0cc fix: do not report committed=true for empty commit SHA (#757) ebc24bf fix: refuse unexpected gitlinks staged by git add (#761) 75038f8 fix: reject unmatched quotes in matchGitArgs to prevent flag injection (#760) d07c930 fix: reject -F/--file git args that can exfiltrate runner files (#759) 0971289 fix: stop logging full git config (credential leak) (#758) c38a33b fix: verify committed lib/ matches source in CI (#756) b4a0134 fix: prevent git option injection via new_branch (#755) Additional commits viewable in compare view Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase. Dependabot commands and options You can trigger Dependabot actions by commenting on this PR: @dependabot rebase will rebase this PR @dependabot recreate will recreate this PR, overwriting any edits that have been made to it @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Summary
new_branchearly so empty values, leading hyphens (e.g.--force), and whitespace/control characters are rejected before any git calls--on checkout/create/default push so git cannot treat it as an optionlib/index.jsTest plan
npm testpasses (includingassertValidBranchNamecases)new_branch(e.g.feature/foo) still checks out/creates and pushes as beforenew_branch: --forcefails during input validation with a clear error (no force-checkout/force-push)lib/index.jsincludes the validation and--push/checkout argvMade with Cursor
Summary by CodeRabbit
New Features
Bug Fixes
Documentation