contrib/credential: avoid fixed-size buffer in osxkeychain
commit5747c8072b74d26a179267acc09da1e8c5becf64
authorTaylor Blau <me@ttaylorr.com>
Mon, 1 May 2023 15:53:54 +0000 (1 11:53 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 May 2023 16:27:01 +0000 (1 09:27 -0700)
tree41cf2e69ab95935816e616f83cb4c5839d708106
parent71201ab0e53d61f3908a63078265e4e0742ef10d
contrib/credential: avoid fixed-size buffer in osxkeychain

The macOS Keychain-based credential helper reads the newline-delimited
protocol stream one line at a time by repeatedly calling fgets() into a
fixed-size buffer, and is thus affected by the vulnerability described
in the previous commit.

To mitigate this attack, avoid using a fixed-size buffer, and instead
rely on getline() to allocate a buffer as large as necessary to fit the
entire content of the line, preventing any protocol injection.

We solved a similar problem in a5bb10fd5e (config: avoid fixed-sized
buffer when renaming/deleting a section, 2023-04-06) by switching to
strbuf_getline(). We can't do that here because the contrib helpers do
not link with the rest of Git, and so can't use a strbuf. But we can use
the system getline() directly, which works similarly.

In most parts of Git we don't assume that every platform has getline().
But this helper is run only on OS X, and that platform added support in
10.7 ("Lion") which was released in 2011.

Tested-by: Taylor Blau <me@ttaylorr.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/credential/osxkeychain/git-credential-osxkeychain.c