Block file-reading Git options - #2208
Merged
Merged
Conversation
Byron
force-pushed
the
security-fixes
branch
2 times, most recently
from
August 5, 2026 05:15
97ee736 to
91821bd
Compare
Byron
marked this pull request as ready for review
August 5, 2026 05:15
Contributor
There was a problem hiding this comment.
Pull request overview
This PR tightens GitPython’s unsafe-option filtering to prevent caller-controlled Git options from reading (or writing) arbitrary local files through higher-level APIs (blame, tag creation, and diff), aligning with the referenced security advisories.
Changes:
- Extend unsafe option blocks for
Repo.blame()/Repo.blame_incremental()(e.g.,--contents,-S,--ignore-revs-file) including clustered short-option forms. - Extend unsafe option blocks for diff APIs to reject
-O(orderfile) including clustered forms while preserving safe-Spickaxe usage. - Expand unsafe-option parsing to accept per-command “clusterable short options” so sequences like
-wS...and-pO...are detected.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| test/test_repo.py | Adds regression coverage for newly blocked blame option spellings (including clustered short options). |
| test/test_refs.py | Adds regression coverage for unsafe tag message file options via positional args and legacy ref alias. |
| test/test_diff.py | Adds regression coverage for diff -O (orderfile) blocking and clustered forms; ensures -S remains allowed. |
| git/repo/base.py | Introduces per-command unsafe option lists for blame and diff; wires them into blame checks. |
| git/refs/tag.py | Expands tag unsafe-option checking to include positional inputs and ref-alias-sourced reference. |
| git/index/base.py | Switches index diff unsafe option list to the new diff-specific unsafe set and cluster parsing. |
| git/diff.py | Switches diff unsafe option list to the new diff-specific unsafe set and cluster parsing; updates docs. |
| git/cmd.py | Adds configurable clusterable-short-option support to Git.check_unsafe_options. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
git/refs/tag.py:139
- The legacy
refkwarg is used as an alias for thereferenceargument, but it is left inkwargs. Sincerepo.git.tag(*args, **kwargs)transforms kwargs into CLI options, this will pass an unsupported--ref=...option togit tagand can break callers usingref=. Pop it fromkwargswhen consuming it as an alias.
if "ref" in kwargs and kwargs["ref"]:
reference = kwargs["ref"]
test/test_diff.py:394
- The unsafe-diff option tests cover
-O/clustered forms but not the equivalent long form--orderfile(or theorderfile=kwarg), which should be blocked for the same reason. Add regression coverage so bypasses via long-option spelling are caught.
calls = (
lambda target: commit.diff(output=target),
lambda target: commit.diff(other=f"--output={target}"),
lambda target: commit.diff(O=target),
lambda target: commit.diff(other=f"-pO{target}"),
<!-- agent --> Reject file-reading options passed to blame, diff, and tag APIs. Inspect positional values after resolving aliases, recognize unsafe options behind command-specific short-flag clusters, and retain the explicit allow_unsafe_options escape hatch. This closes GHSA-5xxx-qhh7-9287 and GHSA-3wxw-xv34-2frg and covers the adjacent diff order-file sink. Regression tests cover long, short, and clustered options, incremental blame, tag path/reference positionals, the ref keyword alias, both diff entry points, and preservation of diff pickaxe behavior. Git baseline: cf5497b14c; git-blame, git-diff, and git-tag document the relevant file-input options. Assisted-by: GPT 5.6 Co-authored-by: GPT 5.6 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tasks
This section is for Byron only. Models continuing this PR must not add, remove, check, uncheck, rename, or reorder checkboxes here.
Everything below this line was generated by Codex GPT-5.
Created by Codex on behalf of Byron. Byron will review before this is ready to merge.
Summary
refalias for unsafe file options.-Spickaxe behavior.Advisories
Advisory summary
Both advisories are medium severity and affect the pip package
GitPythonthrough version 3.1.58. No patched version or CVE has been assigned yet. The change prevents caller-controlled Git options from reading local files through high-level blame and tag APIs, and closes the same class of issue in diff order-file handling.Validation
test_diff.py: 23 passed; 1 unrelated local branch-fixture failuretest_repo.pyandtest_refs.py: 108 passed, 2 skipped; 5 unrelated local environment/history failuresgit diff --checkGit behavior reference: git.git
cf5497b14c, including the documented file-input options forgit blame,git diff, andgit tag.