Uh oh!
There was an error while loading. Please reload this page.
Block file-reading Git options - #2208
Conversation
97ee736 to
91821bdCompareThere 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.
Uh oh!
There was an error while loading. Please reload this page.
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}"),
Uh oh!
There was an error while loading. Please reload this page.
<!-- 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 <codex@openai.com>
Uh oh!
There was an error while loading. Please reload this page.
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.