Sync with 2.39.4
* maint-2.39: (38 commits) Git 2.39.4 fsck: warn about symlink pointing inside a gitdir core.hooksPath: add some protection while cloning init.templateDir: consider this config setting protected clone: prevent hooks from running during a clone Add a helper function to compare file contents init: refactor the template directory discovery into its own function find_hook(): refactor the `STRIP_EXTENSION` logic clone: when symbolic links collide with directories, keep the latter entry: report more colliding paths t5510: verify that D/F confusion cannot lead to an RCE submodule: require the submodule path to contain directories only clone_submodule: avoid using `access()` on directories submodules: submodule paths must not contain symlinks clone: prevent clashing git dirs when cloning submodule in parallel t7423: add tests for symlinked submodule directories has_dir_name(): do not get confused by characters < '/' docs: document security issues around untrusted .git dirs upload-pack: disable lazy-fetching by default fetch/clone: detect dubious ownership of local repositories ...
This commit is contained in:
79
Documentation/RelNotes/2.39.4.txt
Normal file
79
Documentation/RelNotes/2.39.4.txt
Normal file
@ -0,0 +1,79 @@
|
||||
Git v2.39.4 Release Notes
|
||||
=========================
|
||||
|
||||
This addresses the security issues CVE-2024-32002, CVE-2024-32004,
|
||||
CVE-2024-32020 and CVE-2024-32021.
|
||||
|
||||
This release also backports fixes necessary to let the CI builds pass
|
||||
successfully.
|
||||
|
||||
Fixes since v2.39.3
|
||||
-------------------
|
||||
|
||||
* CVE-2024-32002:
|
||||
|
||||
Recursive clones on case-insensitive filesystems that support symbolic
|
||||
links are susceptible to case confusion that can be exploited to
|
||||
execute just-cloned code during the clone operation.
|
||||
|
||||
* CVE-2024-32004:
|
||||
|
||||
Repositories can be configured to execute arbitrary code during local
|
||||
clones. To address this, the ownership checks introduced in v2.30.3
|
||||
are now extended to cover cloning local repositories.
|
||||
|
||||
* CVE-2024-32020:
|
||||
|
||||
Local clones may end up hardlinking files into the target repository's
|
||||
object database when source and target repository reside on the same
|
||||
disk. If the source repository is owned by a different user, then
|
||||
those hardlinked files may be rewritten at any point in time by the
|
||||
untrusted user.
|
||||
|
||||
* CVE-2024-32021:
|
||||
|
||||
When cloning a local source repository that contains symlinks via the
|
||||
filesystem, Git may create hardlinks to arbitrary user-readable files
|
||||
on the same filesystem as the target repository in the objects/
|
||||
directory.
|
||||
|
||||
* CVE-2024-32465:
|
||||
|
||||
It is supposed to be safe to clone untrusted repositories, even those
|
||||
unpacked from zip archives or tarballs originating from untrusted
|
||||
sources, but Git can be tricked to run arbitrary code as part of the
|
||||
clone.
|
||||
|
||||
* Defense-in-depth: submodule: require the submodule path to contain
|
||||
directories only.
|
||||
|
||||
* Defense-in-depth: clone: when symbolic links collide with directories, keep
|
||||
the latter.
|
||||
|
||||
* Defense-in-depth: clone: prevent hooks from running during a clone.
|
||||
|
||||
* Defense-in-depth: core.hooksPath: add some protection while cloning.
|
||||
|
||||
* Defense-in-depth: fsck: warn about symlink pointing inside a gitdir.
|
||||
|
||||
* Various fix-ups on HTTP tests.
|
||||
|
||||
* Test update.
|
||||
|
||||
* HTTP Header redaction code has been adjusted for a newer version of
|
||||
cURL library that shows its traces differently from earlier
|
||||
versions.
|
||||
|
||||
* Fix was added to work around a regression in libcURL 8.7.0 (which has
|
||||
already been fixed in their tip of the tree).
|
||||
|
||||
* Replace macos-12 used at GitHub CI with macos-13.
|
||||
|
||||
* ci(linux-asan/linux-ubsan): let's save some time
|
||||
|
||||
* Tests with LSan from time to time seem to emit harmless message that makes
|
||||
our tests unnecessarily flakey; we work it around by filtering the
|
||||
uninteresting output.
|
||||
|
||||
* Update GitHub Actions jobs to avoid warnings against using deprecated
|
||||
version of Node.js.
|
@ -157,6 +157,18 @@
|
||||
`nullSha1`::
|
||||
(WARN) Tree contains entries pointing to a null sha1.
|
||||
|
||||
`symlinkPointsToGitDir`::
|
||||
(WARN) Symbolic link points inside a gitdir.
|
||||
|
||||
`symlinkTargetBlob`::
|
||||
(ERROR) A non-blob found instead of a symbolic link's target.
|
||||
|
||||
`symlinkTargetLength`::
|
||||
(WARN) Symbolic link target longer than maximum path length.
|
||||
|
||||
`symlinkTargetMissing`::
|
||||
(ERROR) Unable to read symbolic link target's blob.
|
||||
|
||||
`treeNotSorted`::
|
||||
(ERROR) A tree is not properly sorted.
|
||||
|
||||
|
@ -55,6 +55,37 @@ ENVIRONMENT
|
||||
admins may need to configure some transports to allow this
|
||||
variable to be passed. See the discussion in linkgit:git[1].
|
||||
|
||||
`GIT_NO_LAZY_FETCH`::
|
||||
When cloning or fetching from a partial repository (i.e., one
|
||||
itself cloned with `--filter`), the server-side `upload-pack`
|
||||
may need to fetch extra objects from its upstream in order to
|
||||
complete the request. By default, `upload-pack` will refuse to
|
||||
perform such a lazy fetch, because `git fetch` may run arbitrary
|
||||
commands specified in configuration and hooks of the source
|
||||
repository (and `upload-pack` tries to be safe to run even in
|
||||
untrusted `.git` directories).
|
||||
+
|
||||
This is implemented by having `upload-pack` internally set the
|
||||
`GIT_NO_LAZY_FETCH` variable to `1`. If you want to override it
|
||||
(because you are fetching from a partial clone, and you are sure
|
||||
you trust it), you can explicitly set `GIT_NO_LAZY_FETCH` to
|
||||
`0`.
|
||||
|
||||
SECURITY
|
||||
--------
|
||||
|
||||
Most Git commands should not be run in an untrusted `.git` directory
|
||||
(see the section `SECURITY` in linkgit:git[1]). `upload-pack` tries to
|
||||
avoid any dangerous configuration options or hooks from the repository
|
||||
it's serving, making it safe to clone an untrusted directory and run
|
||||
commands on the resulting clone.
|
||||
|
||||
For an extra level of safety, you may be able to run `upload-pack` as an
|
||||
alternate user. The details will be platform dependent, but on many
|
||||
systems you can run:
|
||||
|
||||
git clone --no-local --upload-pack='sudo -u nobody git-upload-pack' ...
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkgit:gitnamespaces[7]
|
||||
|
@ -1026,6 +1026,37 @@ The index is also capable of storing multiple entries (called "stages")
|
||||
for a given pathname. These stages are used to hold the various
|
||||
unmerged version of a file when a merge is in progress.
|
||||
|
||||
SECURITY
|
||||
--------
|
||||
|
||||
Some configuration options and hook files may cause Git to run arbitrary
|
||||
shell commands. Because configuration and hooks are not copied using
|
||||
`git clone`, it is generally safe to clone remote repositories with
|
||||
untrusted content, inspect them with `git log`, and so on.
|
||||
|
||||
However, it is not safe to run Git commands in a `.git` directory (or
|
||||
the working tree that surrounds it) when that `.git` directory itself
|
||||
comes from an untrusted source. The commands in its config and hooks
|
||||
are executed in the usual way.
|
||||
|
||||
By default, Git will refuse to run when the repository is owned by
|
||||
someone other than the user running the command. See the entry for
|
||||
`safe.directory` in linkgit:git-config[1]. While this can help protect
|
||||
you in a multi-user environment, note that you can also acquire
|
||||
untrusted repositories that are owned by you (for example, if you
|
||||
extract a zip file or tarball from an untrusted source). In such cases,
|
||||
you'd need to "sanitize" the untrusted repository first.
|
||||
|
||||
If you have an untrusted `.git` directory, you should first clone it
|
||||
with `git clone --no-local` to obtain a clean copy. Git does restrict
|
||||
the set of options and hooks that will be run by `upload-pack`, which
|
||||
handles the server side of a clone or fetch, but beware that the
|
||||
surface area for attack against `upload-pack` is large, so this does
|
||||
carry some risk. The safest thing is to serve the repository as an
|
||||
unprivileged user (either via linkgit:git-daemon[1], ssh, or using
|
||||
other tools to change user ids). See the discussion in the `SECURITY`
|
||||
section of linkgit:git-upload-pack[1].
|
||||
|
||||
FURTHER DOCUMENTATION
|
||||
---------------------
|
||||
|
||||
|
Reference in New Issue
Block a user