Skip to content

Commit be348e9

Browse files
committed
Sync with 2.41.1
* maint-2.41: (38 commits) Git 2.41.1 Git 2.40.2 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 ...
2 parents 61a22dd + 0f15832 commit be348e9

Some content is hidden

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

46 files changed

+1292
-114
lines changed

.github/workflows/check-whitespace.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
check-whitespace:
2020
runs-on: ubuntu-latest
2121
steps:
22-
- uses: actions/checkout@v3
22+
- uses: actions/checkout@v4
2323
with:
2424
fetch-depth: 0
2525

.github/workflows/main.yml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ jobs:
6363
echo "skip_concurrent=$skip_concurrent" >>$GITHUB_OUTPUT
6464
- name: skip if the commit or tree was already tested
6565
id: skip-if-redundant
66-
uses: actions/github-script@v6
66+
uses: actions/github-script@v7
6767
if: steps.check-ref.outputs.enabled == 'yes'
6868
with:
6969
github-token: ${{secrets.GITHUB_TOKEN}}
@@ -112,7 +112,7 @@ jobs:
112112
group: windows-build-${{ github.ref }}
113113
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
114114
steps:
115-
- uses: actions/checkout@v3
115+
- uses: actions/checkout@v4
116116
- uses: git-for-windows/setup-git-for-windows-sdk@v1
117117
- name: build
118118
shell: bash
@@ -123,7 +123,7 @@ jobs:
123123
- name: zip up tracked files
124124
run: git archive -o artifacts/tracked.tar.gz HEAD
125125
- name: upload tracked files and build artifacts
126-
uses: actions/upload-artifact@v3
126+
uses: actions/upload-artifact@v4
127127
with:
128128
name: windows-artifacts
129129
path: artifacts
@@ -140,7 +140,7 @@ jobs:
140140
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
141141
steps:
142142
- name: download tracked files and build artifacts
143-
uses: actions/download-artifact@v3
143+
uses: actions/download-artifact@v4
144144
with:
145145
name: windows-artifacts
146146
path: ${{github.workspace}}
@@ -157,7 +157,7 @@ jobs:
157157
run: ci/print-test-failures.sh
158158
- name: Upload failed tests' directories
159159
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
160-
uses: actions/upload-artifact@v3
160+
uses: actions/upload-artifact@v4
161161
with:
162162
name: failed-tests-windows
163163
path: ${{env.FAILED_TEST_ARTIFACTS}}
@@ -173,10 +173,10 @@ jobs:
173173
group: vs-build-${{ github.ref }}
174174
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
175175
steps:
176-
- uses: actions/checkout@v3
176+
- uses: actions/checkout@v4
177177
- uses: git-for-windows/setup-git-for-windows-sdk@v1
178178
- name: initialize vcpkg
179-
uses: actions/checkout@v3
179+
uses: actions/checkout@v4
180180
with:
181181
repository: 'microsoft/vcpkg'
182182
path: 'compat/vcbuild/vcpkg'
@@ -212,7 +212,7 @@ jobs:
212212
- name: zip up tracked files
213213
run: git archive -o artifacts/tracked.tar.gz HEAD
214214
- name: upload tracked files and build artifacts
215-
uses: actions/upload-artifact@v3
215+
uses: actions/upload-artifact@v4
216216
with:
217217
name: vs-artifacts
218218
path: artifacts
@@ -230,7 +230,7 @@ jobs:
230230
steps:
231231
- uses: git-for-windows/setup-git-for-windows-sdk@v1
232232
- name: download tracked files and build artifacts
233-
uses: actions/download-artifact@v3
233+
uses: actions/download-artifact@v4
234234
with:
235235
name: vs-artifacts
236236
path: ${{github.workspace}}
@@ -248,7 +248,7 @@ jobs:
248248
run: ci/print-test-failures.sh
249249
- name: Upload failed tests' directories
250250
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
251-
uses: actions/upload-artifact@v3
251+
uses: actions/upload-artifact@v4
252252
with:
253253
name: failed-tests-windows
254254
path: ${{env.FAILED_TEST_ARTIFACTS}}
@@ -276,11 +276,11 @@ jobs:
276276
pool: ubuntu-20.04
277277
- jobname: osx-clang
278278
cc: clang
279-
pool: macos-12
279+
pool: macos-13
280280
- jobname: osx-gcc
281281
cc: gcc
282-
cc_package: gcc-9
283-
pool: macos-12
282+
cc_package: gcc-13
283+
pool: macos-13
284284
- jobname: linux-gcc-default
285285
cc: gcc
286286
pool: ubuntu-latest
@@ -297,15 +297,15 @@ jobs:
297297
runs_on_pool: ${{matrix.vector.pool}}
298298
runs-on: ${{matrix.vector.pool}}
299299
steps:
300-
- uses: actions/checkout@v3
300+
- uses: actions/checkout@v4
301301
- run: ci/install-dependencies.sh
302302
- run: ci/run-build-and-tests.sh
303303
- name: print test failures
304304
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
305305
run: ci/print-test-failures.sh
306306
- name: Upload failed tests' directories
307307
if: failure() && env.FAILED_TEST_ARTIFACTS != ''
308-
uses: actions/upload-artifact@v3
308+
uses: actions/upload-artifact@v4
309309
with:
310310
name: failed-tests-${{matrix.vector.jobname}}
311311
path: ${{env.FAILED_TEST_ARTIFACTS}}
@@ -331,9 +331,9 @@ jobs:
331331
runs-on: ubuntu-latest
332332
container: ${{matrix.vector.image}}
333333
steps:
334-
- uses: actions/checkout@v3
334+
- uses: actions/checkout@v4
335335
if: matrix.vector.jobname != 'linux32'
336-
- uses: actions/checkout@v1
336+
- uses: actions/checkout@v1 # cannot be upgraded because Node.js Actions aren't supported in this container
337337
if: matrix.vector.jobname == 'linux32'
338338
- run: ci/install-docker-dependencies.sh
339339
- run: ci/run-build-and-tests.sh
@@ -342,13 +342,13 @@ jobs:
342342
run: ci/print-test-failures.sh
343343
- name: Upload failed tests' directories
344344
if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname != 'linux32'
345-
uses: actions/upload-artifact@v3
345+
uses: actions/upload-artifact@v4
346346
with:
347347
name: failed-tests-${{matrix.vector.jobname}}
348348
path: ${{env.FAILED_TEST_ARTIFACTS}}
349349
- name: Upload failed tests' directories
350350
if: failure() && env.FAILED_TEST_ARTIFACTS != '' && matrix.vector.jobname == 'linux32'
351-
uses: actions/upload-artifact@v1
351+
uses: actions/upload-artifact@v1 # cannot be upgraded because Node.js Actions aren't supported in this container
352352
with:
353353
name: failed-tests-${{matrix.vector.jobname}}
354354
path: ${{env.FAILED_TEST_ARTIFACTS}}
@@ -362,7 +362,7 @@ jobs:
362362
group: static-analysis-${{ github.ref }}
363363
cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
364364
steps:
365-
- uses: actions/checkout@v3
365+
- uses: actions/checkout@v4
366366
- run: ci/install-dependencies.sh
367367
- run: ci/run-static-analysis.sh
368368
- run: ci/check-directional-formatting.bash
@@ -385,7 +385,7 @@ jobs:
385385
artifact: sparse-20.04
386386
- name: Install the current `sparse` package
387387
run: sudo dpkg -i sparse-20.04/sparse_*.deb
388-
- uses: actions/checkout@v3
388+
- uses: actions/checkout@v4
389389
- name: Install other dependencies
390390
run: ci/install-dependencies.sh
391391
- run: make sparse
@@ -400,6 +400,6 @@ jobs:
400400
jobname: Documentation
401401
runs-on: ubuntu-latest
402402
steps:
403-
- uses: actions/checkout@v3
403+
- uses: actions/checkout@v4
404404
- run: ci/install-dependencies.sh
405405
- run: ci/test-documentation.sh

Documentation/RelNotes/2.39.4.txt

Lines changed: 79 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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/fsck-msgids.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,18 @@
157157
`nullSha1`::
158158
(WARN) Tree contains entries pointing to a null sha1.
159159

160+
`symlinkPointsToGitDir`::
161+
(WARN) Symbolic link points inside a gitdir.
162+
163+
`symlinkTargetBlob`::
164+
(ERROR) A non-blob found instead of a symbolic link's target.
165+
166+
`symlinkTargetLength`::
167+
(WARN) Symbolic link target longer than maximum path length.
168+
169+
`symlinkTargetMissing`::
170+
(ERROR) Unable to read symbolic link target's blob.
171+
160172
`treeNotSorted`::
161173
(ERROR) A tree is not properly sorted.
162174

Documentation/git-upload-pack.txt

Lines changed: 31 additions & 0 deletions
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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,37 @@ The index is also capable of storing multiple entries (called "stages")
10341034
for a given pathname. These stages are used to hold the various
10351035
unmerged version of a file when a merge is in progress.
10361036

1037+
SECURITY
1038+
--------
1039+
1040+
Some configuration options and hook files may cause Git to run arbitrary
1041+
shell commands. Because configuration and hooks are not copied using
1042+
`git clone`, it is generally safe to clone remote repositories with
1043+
untrusted content, inspect them with `git log`, and so on.
1044+
1045+
However, it is not safe to run Git commands in a `.git` directory (or
1046+
the working tree that surrounds it) when that `.git` directory itself
1047+
comes from an untrusted source. The commands in its config and hooks
1048+
are executed in the usual way.
1049+
1050+
By default, Git will refuse to run when the repository is owned by
1051+
someone other than the user running the command. See the entry for
1052+
`safe.directory` in linkgit:git-config[1]. While this can help protect
1053+
you in a multi-user environment, note that you can also acquire
1054+
untrusted repositories that are owned by you (for example, if you
1055+
extract a zip file or tarball from an untrusted source). In such cases,
1056+
you'd need to "sanitize" the untrusted repository first.
1057+
1058+
If you have an untrusted `.git` directory, you should first clone it
1059+
with `git clone --no-local` to obtain a clean copy. Git does restrict
1060+
the set of options and hooks that will be run by `upload-pack`, which
1061+
handles the server side of a clone or fetch, but beware that the
1062+
surface area for attack against `upload-pack` is large, so this does
1063+
carry some risk. The safest thing is to serve the repository as an
1064+
unprivileged user (either via linkgit:git-daemon[1], ssh, or using
1065+
other tools to change user ids). See the discussion in the `SECURITY`
1066+
section of linkgit:git-upload-pack[1].
1067+
10371068
FURTHER DOCUMENTATION
10381069
---------------------
10391070

INSTALL

Lines changed: 1 addition & 1 deletion
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

0 commit comments

Comments
 (0)