setup_git_directory(): add an owner check for the top-level directory
commit8959555cee7ec045958f9b6dd62e541affb7e7d9
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 2 Mar 2022 11:23:04 +0000 (2 12:23 +0100)
committerJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 21 Mar 2022 12:16:26 +0000 (21 13:16 +0100)
treeda189c139989e8ea73421bde49a076ae9508661b
parentbdc77d1d685be9c10b88abb281a42bc620548595
setup_git_directory(): add an owner check for the top-level directory

It poses a security risk to search for a git directory outside of the
directories owned by the current user.

For example, it is common e.g. in computer pools of educational
institutes to have a "scratch" space: a mounted disk with plenty of
space that is regularly swiped where any authenticated user can create
a directory to do their work. Merely navigating to such a space with a
Git-enabled `PS1` when there is a maliciously-crafted `/scratch/.git/`
can lead to a compromised account.

The same holds true in multi-user setups running Windows, as `C:\` is
writable to every authenticated user by default.

To plug this vulnerability, we stop Git from accepting top-level
directories owned by someone other than the current user. We avoid
looking at the ownership of each and every directories between the
current and the top-level one (if there are any between) to avoid
introducing a performance bottleneck.

This new default behavior is obviously incompatible with the concept of
shared repositories, where we expect the top-level directory to be owned
by only one of its legitimate users. To re-enable that use case, we add
support for adding exceptions from the new default behavior via the
config setting `safe.directory`.

The `safe.directory` config setting is only respected in the system and
global configs, not from repository configs or via the command-line, and
can have multiple values to allow for multiple shared repositories.

We are particularly careful to provide a helpful message to any user
trying to use a shared repository.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Documentation/config.txt
Documentation/config/safe.txt [new file with mode: 0644]
setup.c