git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] documentation symlink restrictions for .git* files

From
Philip Oakley <philipoakley@iee.email>
Date
Oct 26, 2020, 22:18 UTC
Message-ID
<8bb54778-507c-2e3f-d35a-5e32edb8bee7@iee.email>
In-Reply-To
<20201023081711.GB4012156@coredump.intra.peff.net>
On 23/10/2020 09:17, Jeff King wrote:
Show 93 quoted lines
> On Wed, Oct 21, 2020 at 12:19:25AM +0100, Philip Oakley wrote:
>
>> On 05/10/2020 13:16, Jeff King wrote:
>>> On Mon, Oct 05, 2020 at 03:17:51AM -0400, Jeff King wrote:
>>>
>>>> About 2 years ago as part of a security release we made it illegal to
>>>> have a symlinked .gitmodules file (refusing it both in the index and via
>>>> fsck). At the time we discussed (on the security list) outlawing
>>>> symlinks for other .git files in the same way, but we decided not to do
>>>> so as part of the security release, as it wasn't strictly necessary.
>> Is this something that should be recorded in the documentation, either as a
>> simple (sensible) limitation, or explicitly as a security related safety
>> measure?
>>
>> I didn't see any changes to the .txt docs in the change list below.
> Yeah, that's a good point.
>
> How about this (on top of jk/symlinked-dotgitx-files)?
>
> -- >8 --
> Subject: [PATCH] documentation symlink restrictions for .git* files
>
> We outlawed symbolic link versions of various .git files in 10ecfa7649
> (verify_path: disallow symlinks in .gitmodules, 2018-05-04) and
> dd4c2fe66b (verify_path(): disallow symlinks in .gitattributes and
> .gitignore, 2020-10-05). The reasons are discussed in detail there, but
> we never adjusted the documentation to let users know.
>
> This hasn't been a big deal since the point is that such setups were
> mildly broken and thought to be unusual anyway. But it certainly doesn't
> hurt to be clear and explicit about it.
>
> Suggested-by: Philip Oakley <philipoakley@iee.email>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  Documentation/gitattributes.txt | 7 +++++++
>  Documentation/gitignore.txt     | 5 +++++
>  Documentation/gitmodules.txt    | 8 ++++++++
>  3 files changed, 20 insertions(+)
>
> diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
> index 2d0a03715b..9a2ce4f1ea 100644
> --- a/Documentation/gitattributes.txt
> +++ b/Documentation/gitattributes.txt
> @@ -1241,6 +1241,13 @@ to:
>  [attr]binary -diff -merge -text
>  ------------
>  
> +NOTES
> +-----
> +
> +Note that Git does not allow a `.gitattributes` file within the working
> +tree to be a symbolic link, and will refuse to check out such a tree
> +entry.  This keeps behavior consistent when the file is accessed from
> +the index or a tree versus from the filesystem.
>  
>  EXAMPLES
>  --------
> diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
> index d47b1ae296..7e9a1d49d6 100644
> --- a/Documentation/gitignore.txt
> +++ b/Documentation/gitignore.txt
> @@ -149,6 +149,11 @@ not tracked by Git remain untracked.
>  To stop tracking a file that is currently tracked, use
>  'git rm --cached'.
>  
> +Note that Git does not allow a `.gitignore` file within the working tree
> +to be a symbolic link, and will refuse to check out such a tree entry.
> +This keeps behavior consistent when the file is accessed from the index
> +or a tree versus from the filesystem.
> +
>  EXAMPLES
>  --------
>  
> diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
> index 539b4e1997..2b884be3c7 100644
> --- a/Documentation/gitmodules.txt
> +++ b/Documentation/gitmodules.txt
> @@ -98,6 +98,14 @@ submodule.<name>.shallow::
>  	shallow clone (with a history depth of 1) unless the user explicitly
>  	asks for a non-shallow clone.
>  
> +NOTES
> +-----
> +
> +Note that Git does not allow the `.gitmodules` file within a working
> +tree to be a symbolic link, and will refuse to check out such a tree
> +entry. This keeps behavior consistent when the file is accessed from the
> +index or a tree versus from the filesystem, and helps Git reliably
> +enforce security checks of the file contents.
>  
>  EXAMPLES
>  --------

The text looks good to me, with security point explicitly mentioned just for .gitmodules file.

However, is placing the Note so far down appropriate (.gitattributes and .gitignore), given that there is within the descriptions a discussion of the priority order for finding those files?

Philip
Previous: Jeff KingNext: Jeff King
Message 49 of 55 in “forbidding symlinked .gitattributes and .gitignore”
  1. 0/7 forbidding symlinked .gitattributes and .gitignoreJeff King, Oct 5, 2020
  2. 1/7 fsck_tree(): fix shadowed variableJeff King, Oct 5, 2020
  3. Jonathan NiederOct 5, 2020
  4. Jeff KingOct 5, 2020
  5. Jonathan NiederOct 5, 2020
  6. 2/7 fsck_tree(): wrap some long linesJeff King, Oct 5, 2020
  7. Jonathan NiederOct 5, 2020
  8. 3/7 t7415: rename to expand scopeJeff King, Oct 5, 2020
  9. Jonathan NiederOct 5, 2020
  10. Jeff KingOct 5, 2020
  11. Jonathan NiederOct 5, 2020
  12. Jeff KingOct 5, 2020
  13. 4/7 t7450: test verify_path() handling of gitmodulesJeff King, Oct 5, 2020
  14. Jonathan NiederOct 5, 2020
  15. Jeff KingOct 5, 2020
  16. Jonathan NiederOct 5, 2020
  17. 5/7 t0060: test obscured .gitattributes and .gitignore matchingJeff King, Oct 5, 2020
  18. Jonathan NiederOct 5, 2020
  19. Jeff KingOct 5, 2020
  20. Johannes SchindelinOct 5, 2020
  21. Jeff KingOct 6, 2020
  22. 6/7 verify_path(): disallow symlinks in .gitattributes and .gitignoreJeff King, Oct 5, 2020
  23. Jonathan NiederOct 5, 2020
  24. Jeff KingOct 5, 2020
  25. 7/7 fsck: complain when .gitattributes or .gitignore is a symlinkJeff King, Oct 5, 2020
  26. Jonathan NiederOct 5, 2020
  27. Jeff KingOct 5, 2020
  28. Jonathan NiederOct 5, 2020
  29. Jeff KingOct 5, 2020
  30. 0/8 forbidding symlinked .gitattributes and .gitignoreJeff King, Oct 5, 2020
  31. 1/8 fsck_tree(): fix shadowed variableJeff King, Oct 5, 2020
  32. 2/8 fsck_tree(): wrap some long linesJeff King, Oct 5, 2020
  33. 3/8 t7415: rename to expand scopeJeff King, Oct 5, 2020
  34. 4/8 t7450: test verify_path() handling of gitmodulesJeff King, Oct 5, 2020
  35. 5/8 t7450: test .gitmodules symlink matching against obscured namesJeff King, Oct 5, 2020
  36. 7/8 verify_path(): disallow symlinks in .gitattributes and .gitignoreJeff King, Oct 5, 2020
  37. Jonathan NiederOct 27, 2020
  38. Jeff KingOct 27, 2020
  39. Junio C HamanoOct 27, 2020
  40. Jeff KingOct 28, 2020
  41. Jonathan NiederOct 27, 2020
  42. Junio C HamanoOct 28, 2020
  43. 6/8 t0060: test obscured .gitattributes and .gitignore matchingJeff King, Oct 5, 2020
  44. 8/8 fsck: complain when .gitattributes or .gitignore is a symlinkJeff King, Oct 5, 2020
  45. Junio C HamanoOct 6, 2020
  46. Philip OakleyOct 20, 2020
  47. documentation symlink restrictions for .git* filesJeff King, Oct 23, 2020
  48. Jeff KingOct 23, 2020
  49. Philip OakleyOct 26, 2020
  50. Jeff KingOct 26, 2020
  51. Junio C HamanoOct 26, 2020
  52. Jeff KingOct 27, 2020
  53. Junio C HamanoOct 27, 2020
  54. Philip OakleyOct 27, 2020
  55. Junio C HamanoOct 28, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.