Skip to content

Commit a72a819

Browse files
committed
Merge tag 'v2.44.1'
Git 2.44.1 Signed-off-by: Johannes Schindelin <[email protected]>
2 parents ad0bbff + 10dc984 commit a72a819

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1291
-89
lines changed

Documentation/RelNotes/2.39.4.txt

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
Git v2.39.4 Release Notes
2+
=========================
3+
4+
This addresses the security issues CVE-2024-32002, CVE-2024-32004,
5+
CVE-2024-32020 and CVE-2024-32021.
6+
7+
This release also backports fixes necessary to let the CI builds pass
8+
successfully.
9+
10+
Fixes since v2.39.3
11+
-------------------
12+
13+
* CVE-2024-32002:
14+
15+
Recursive clones on case-insensitive filesystems that support symbolic
16+
links are susceptible to case confusion that can be exploited to
17+
execute just-cloned code during the clone operation.
18+
19+
* CVE-2024-32004:
20+
21+
Repositories can be configured to execute arbitrary code during local
22+
clones. To address this, the ownership checks introduced in v2.30.3
23+
are now extended to cover cloning local repositories.
24+
25+
* CVE-2024-32020:
26+
27+
Local clones may end up hardlinking files into the target repository's
28+
object database when source and target repository reside on the same
29+
disk. If the source repository is owned by a different user, then
30+
those hardlinked files may be rewritten at any point in time by the
31+
untrusted user.
32+
33+
* CVE-2024-32021:
34+
35+
When cloning a local source repository that contains symlinks via the
36+
filesystem, Git may create hardlinks to arbitrary user-readable files
37+
on the same filesystem as the target repository in the objects/
38+
directory.
39+
40+
* CVE-2024-32465:
41+
42+
It is supposed to be safe to clone untrusted repositories, even those
43+
unpacked from zip archives or tarballs originating from untrusted
44+
sources, but Git can be tricked to run arbitrary code as part of the
45+
clone.
46+
47+
* Defense-in-depth: submodule: require the submodule path to contain
48+
directories only.
49+
50+
* Defense-in-depth: clone: when symbolic links collide with directories, keep
51+
the latter.
52+
53+
* Defense-in-depth: clone: prevent hooks from running during a clone.
54+
55+
* Defense-in-depth: core.hooksPath: add some protection while cloning.
56+
57+
* Defense-in-depth: fsck: warn about symlink pointing inside a gitdir.
58+
59+
* Various fix-ups on HTTP tests.
60+
61+
* Test update.
62+
63+
* HTTP Header redaction code has been adjusted for a newer version of
64+
cURL library that shows its traces differently from earlier
65+
versions.
66+
67+
* Fix was added to work around a regression in libcURL 8.7.0 (which has
68+
already been fixed in their tip of the tree).
69+
70+
* Replace macos-12 used at GitHub CI with macos-13.
71+
72+
* ci(linux-asan/linux-ubsan): let's save some time
73+
74+
* Tests with LSan from time to time seem to emit harmless message that makes
75+
our tests unnecessarily flakey; we work it around by filtering the
76+
uninteresting output.
77+
78+
* Update GitHub Actions jobs to avoid warnings against using deprecated
79+
version of Node.js.

Documentation/RelNotes/2.40.2.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.40.2 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.39.4 to address
5+
the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020,
6+
CVE-2024-32021 and CVE-2024-32465; see the release notes for that
7+
version for details.

Documentation/RelNotes/2.41.1.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.41.1 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.39.4 and v2.40.2
5+
to address the security issues CVE-2024-32002, CVE-2024-32004,
6+
CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release
7+
notes for these versions for details.

Documentation/RelNotes/2.42.2.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.42.2 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.39.4, v2.40.2
5+
and v2.41.1 to address the security issues CVE-2024-32002,
6+
CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465;
7+
see the release notes for these versions for details.

Documentation/RelNotes/2.43.4.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Git v2.43.4 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.39.4, v2.40.2,
5+
v2.41.1 and v2.42.2 to address the security issues CVE-2024-32002,
6+
CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465;
7+
see the release notes for these versions for details.

Documentation/RelNotes/2.44.1.txt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Git v2.44.1 Release Notes
2+
=========================
3+
4+
This release merges up the fix that appears in v2.39.4, v2.40.2,
5+
v2.41.1, v2.42.2 and v2.43.4 to address the security issues
6+
CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021
7+
and CVE-2024-32465; see the release notes for these versions
8+
for details.

Documentation/fsck-msgids.txt

+12
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,18 @@
164164
`nullSha1`::
165165
(WARN) Tree contains entries pointing to a null sha1.
166166

167+
`symlinkPointsToGitDir`::
168+
(WARN) Symbolic link points inside a gitdir.
169+
170+
`symlinkTargetBlob`::
171+
(ERROR) A non-blob found instead of a symbolic link's target.
172+
173+
`symlinkTargetLength`::
174+
(WARN) Symbolic link target longer than maximum path length.
175+
176+
`symlinkTargetMissing`::
177+
(ERROR) Unable to read symbolic link target's blob.
178+
167179
`treeNotSorted`::
168180
(ERROR) A tree is not properly sorted.
169181

Documentation/git-upload-pack.txt

+31
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,37 @@ ENVIRONMENT
5555
admins may need to configure some transports to allow this
5656
variable to be passed. See the discussion in linkgit:git[1].
5757

58+
`GIT_NO_LAZY_FETCH`::
59+
When cloning or fetching from a partial repository (i.e., one
60+
itself cloned with `--filter`), the server-side `upload-pack`
61+
may need to fetch extra objects from its upstream in order to
62+
complete the request. By default, `upload-pack` will refuse to
63+
perform such a lazy fetch, because `git fetch` may run arbitrary
64+
commands specified in configuration and hooks of the source
65+
repository (and `upload-pack` tries to be safe to run even in
66+
untrusted `.git` directories).
67+
+
68+
This is implemented by having `upload-pack` internally set the
69+
`GIT_NO_LAZY_FETCH` variable to `1`. If you want to override it
70+
(because you are fetching from a partial clone, and you are sure
71+
you trust it), you can explicitly set `GIT_NO_LAZY_FETCH` to
72+
`0`.
73+
74+
SECURITY
75+
--------
76+
77+
Most Git commands should not be run in an untrusted `.git` directory
78+
(see the section `SECURITY` in linkgit:git[1]). `upload-pack` tries to
79+
avoid any dangerous configuration options or hooks from the repository
80+
it's serving, making it safe to clone an untrusted directory and run
81+
commands on the resulting clone.
82+
83+
For an extra level of safety, you may be able to run `upload-pack` as an
84+
alternate user. The details will be platform dependent, but on many
85+
systems you can run:
86+
87+
git clone --no-local --upload-pack='sudo -u nobody git-upload-pack' ...
88+
5889
SEE ALSO
5990
--------
6091
linkgit:gitnamespaces[7]

Documentation/git.txt

+31
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,37 @@ The index is also capable of storing multiple entries (called "stages")
10571057
for a given pathname. These stages are used to hold the various
10581058
unmerged version of a file when a merge is in progress.
10591059

1060+
SECURITY
1061+
--------
1062+
1063+
Some configuration options and hook files may cause Git to run arbitrary
1064+
shell commands. Because configuration and hooks are not copied using
1065+
`git clone`, it is generally safe to clone remote repositories with
1066+
untrusted content, inspect them with `git log`, and so on.
1067+
1068+
However, it is not safe to run Git commands in a `.git` directory (or
1069+
the working tree that surrounds it) when that `.git` directory itself
1070+
comes from an untrusted source. The commands in its config and hooks
1071+
are executed in the usual way.
1072+
1073+
By default, Git will refuse to run when the repository is owned by
1074+
someone other than the user running the command. See the entry for
1075+
`safe.directory` in linkgit:git-config[1]. While this can help protect
1076+
you in a multi-user environment, note that you can also acquire
1077+
untrusted repositories that are owned by you (for example, if you
1078+
extract a zip file or tarball from an untrusted source). In such cases,
1079+
you'd need to "sanitize" the untrusted repository first.
1080+
1081+
If you have an untrusted `.git` directory, you should first clone it
1082+
with `git clone --no-local` to obtain a clean copy. Git does restrict
1083+
the set of options and hooks that will be run by `upload-pack`, which
1084+
handles the server side of a clone or fetch, but beware that the
1085+
surface area for attack against `upload-pack` is large, so this does
1086+
carry some risk. The safest thing is to serve the repository as an
1087+
unprivileged user (either via linkgit:git-daemon[1], ssh, or using
1088+
other tools to change user ids). See the discussion in the `SECURITY`
1089+
section of linkgit:git-upload-pack[1].
1090+
10601091
FURTHER DOCUMENTATION
10611092
---------------------
10621093

GIT-VERSION-GEN

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/sh
22

33
GVF=GIT-VERSION-FILE
4-
DEF_VER=v2.44.0
4+
DEF_VER=v2.44.1
55

66
LF='
77
'

INSTALL

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ Issues of note:
139139
not need that functionality, use NO_CURL to build without
140140
it.
141141

142-
Git requires version "7.19.5" or later of "libcurl" to build
142+
Git requires version "7.21.3" or later of "libcurl" to build
143143
without NO_CURL. This version requirement may be bumped in
144144
the future.
145145

RelNotes

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Documentation/RelNotes/2.44.0.txt
1+
Documentation/RelNotes/2.44.1.txt

builtin/clone.c

+45-6
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,20 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
329329
int src_len, dest_len;
330330
struct dir_iterator *iter;
331331
int iter_status;
332-
struct strbuf realpath = STRBUF_INIT;
332+
333+
/*
334+
* Refuse copying directories by default which aren't owned by us. The
335+
* code that performs either the copying or hardlinking is not prepared
336+
* to handle various edge cases where an adversary may for example
337+
* racily swap out files for symlinks. This can cause us to
338+
* inadvertently use the wrong source file.
339+
*
340+
* Furthermore, even if we were prepared to handle such races safely,
341+
* creating hardlinks across user boundaries is an inherently unsafe
342+
* operation as the hardlinked files can be rewritten at will by the
343+
* potentially-untrusted user. We thus refuse to do so by default.
344+
*/
345+
die_upon_dubious_ownership(NULL, NULL, src_repo);
333346

334347
mkdir_if_missing(dest->buf, 0777);
335348

@@ -377,9 +390,27 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
377390
if (unlink(dest->buf) && errno != ENOENT)
378391
die_errno(_("failed to unlink '%s'"), dest->buf);
379392
if (!option_no_hardlinks) {
380-
strbuf_realpath(&realpath, src->buf, 1);
381-
if (!link(realpath.buf, dest->buf))
393+
if (!link(src->buf, dest->buf)) {
394+
struct stat st;
395+
396+
/*
397+
* Sanity-check whether the created hardlink
398+
* actually links to the expected file now. This
399+
* catches time-of-check-time-of-use bugs in
400+
* case the source file was meanwhile swapped.
401+
*/
402+
if (lstat(dest->buf, &st))
403+
die(_("hardlink cannot be checked at '%s'"), dest->buf);
404+
if (st.st_mode != iter->st.st_mode ||
405+
st.st_ino != iter->st.st_ino ||
406+
st.st_dev != iter->st.st_dev ||
407+
st.st_size != iter->st.st_size ||
408+
st.st_uid != iter->st.st_uid ||
409+
st.st_gid != iter->st.st_gid)
410+
die(_("hardlink different from source at '%s'"), dest->buf);
411+
382412
continue;
413+
}
383414
if (option_local > 0)
384415
die_errno(_("failed to create link '%s'"), dest->buf);
385416
option_no_hardlinks = 1;
@@ -392,8 +423,6 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
392423
strbuf_setlen(src, src_len);
393424
die(_("failed to iterate over '%s'"), src->buf);
394425
}
395-
396-
strbuf_release(&realpath);
397426
}
398427

399428
static void clone_local(const char *src_repo, const char *dest_repo)
@@ -936,6 +965,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
936965
int hash_algo;
937966
unsigned int ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
938967
const int do_not_override_repo_unix_permissions = -1;
968+
const char *template_dir;
969+
char *template_dir_dup = NULL;
939970

940971
struct transport_ls_refs_options transport_ls_refs_options =
941972
TRANSPORT_LS_REFS_OPTIONS_INIT;
@@ -955,6 +986,13 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
955986
usage_msg_opt(_("You must specify a repository to clone."),
956987
builtin_clone_usage, builtin_clone_options);
957988

989+
xsetenv("GIT_CLONE_PROTECTION_ACTIVE", "true", 0 /* allow user override */);
990+
template_dir = get_template_dir(option_template);
991+
if (*template_dir && !is_absolute_path(template_dir))
992+
template_dir = template_dir_dup =
993+
absolute_pathdup(template_dir);
994+
xsetenv("GIT_CLONE_TEMPLATE_DIR", template_dir, 1);
995+
958996
if (option_depth || option_since || option_not.nr)
959997
deepen = 1;
960998
if (option_single_branch == -1)
@@ -1116,7 +1154,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
11161154
* repository, and reference backends may persist that information into
11171155
* their on-disk data structures.
11181156
*/
1119-
init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN,
1157+
init_db(git_dir, real_git_dir, template_dir, GIT_HASH_UNKNOWN,
11201158
ref_storage_format, NULL,
11211159
do_not_override_repo_unix_permissions, INIT_DB_QUIET | INIT_DB_SKIP_REFDB);
11221160

@@ -1460,6 +1498,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
14601498
free(dir);
14611499
free(path);
14621500
free(repo_to_free);
1501+
free(template_dir_dup);
14631502
junk_mode = JUNK_LEAVE_ALL;
14641503

14651504
transport_ls_refs_options_release(&transport_ls_refs_options);

0 commit comments

Comments
 (0)