Skip to content

Reject unsafe submodule checkout paths - #2225

Merged
Byron merged 1 commit into
mainfrom
submodule-path-hardening
Sep 1, 2026
Merged

Reject unsafe submodule checkout paths#2225
Byron merged 1 commit into
mainfrom
submodule-path-hardening

Conversation

@Byron

@Byron Byron commented Sep 1, 2026

Copy link
Copy Markdown
Member

Tasks

This section is for Byron only. Models continuing this PR must not add, remove, check, uncheck, rename, or reorder checkboxes here.

  • refackiew

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

Confine submodule checkout paths to the parent repository before filesystem operations. The shared absolute-path accessor now rejects parent traversal, paths resolving through symlinks outside the worktree, and paths resolving to the worktree root.

Advisory

https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-59cr-6r3x-644w

Advisory summary

  • GHSA: GHSA-59cr-6r3x-644w
  • Severity: Medium
  • Package: GitPython (pip)
  • Affected versions: <= 3.1.61
  • Patched version: not yet assigned
  • CVE: not assigned

Validation

  • python -m pytest test/test_submodule.py -q — 45 passed, 3 skipped, 1 xfailed
  • pre-commit run --files git/objects/submodule/base.py test/test_submodule.py
  • mypy git/objects/submodule/base.py
  • git diff --check

Git behavior reference: commit e8d0608944, submodule.c::validate_submodule_path(), and t/t7423-submodule-symlinks.sh reject every existing symlink component before submodule update. read-cache.c::verify_path_internal() rejects parent-traversing index paths.

Commits

  • f67ab162 Reject submodule checkout paths outside the repository
  • 07091717 Reject submodule paths through outside symlinks
  • 914a4ae8 Keep submodule checkouts away from the worktree root
  • dcd956a6 Match Git submodule symlink validation
@Byron
Byron force-pushed the submodule-path-hardening branch from dcd956a to c0ed846 Compare September 1, 2026 10:19
GHSA-59cr-6r3x-644w identifies that submodule update paths could reach
filesystem operations without the containment check already used by add and
move.

Add a regression that proves update rejects a parent-directory checkout
path before cloning, and override Submodule.abspath to apply the shared
_to_relative_path guard for every filesystem consumer.

Git baseline: git.git read-cache.c verify_path_internal() rejects invalid index
paths, covered for parent traversal by t/t9300-fast-import.sh.

Assisted-by: GPT 5.6
Co-authored-by: GPT 5.6 <codex@openai.com>
@Byron
Byron force-pushed the submodule-path-hardening branch from c0ed846 to 1ed0ebc Compare September 1, 2026 11:49
@Byron
Byron marked this pull request as ready for review September 1, 2026 12:51
Copilot AI lite review requested due to automatic review settings September 1, 2026 12:51
@Byron
Byron merged commit 8a14adc into main Sep 1, 2026
53 checks passed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR hardens submodule checkout path handling to mitigate GHSA-59cr-6r3x-644w by ensuring submodule paths are confined to the parent repository before filesystem operations, including rejecting paths that traverse through symlink components.

Changes:

  • Add Submodule.abspath validation that rejects checkout paths containing symbolic-link components under a non-bare parent repo.
  • Add regression tests covering updates with checkout paths outside the parent, through a symlink, and at the repository root.
  • Document the security fix in the changelog for the 3.1.62 release entry.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
git/objects/submodule/base.py Adds symlink-component rejection during submodule absolute path resolution.
test/test_submodule.py Adds tests asserting update(init=True) rejects unsafe checkout paths.
doc/source/changes.rst Adds a 3.1.62 changelog entry referencing the security advisory.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread test/test_submodule.py
Comment on lines +1390 to +1391
os.mkdir(osp.join(parent.working_tree_dir, "target"))
os.symlink("target", osp.join(parent.working_tree_dir, "link"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants