Re: Fwd: [Bug] `credential fill` prints incomplete bearer credential

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2024-12-18 at 20:42:31, M Hickford wrote:
> Hi. Is this a bug in git version 2.47.1? Or am I using it incorrectly?
> 
> # erase existing example.com credentials
> printf "host=example.com\nprotocol=https\n" | git -c credential.helper= -c credential.helper=cache credential reject
> # store bearer token with expiry in far future in credential-cache
> printf "host=example.com\nprotocol=https\nauthtype=bearer\ncredential=letmein\npassword_expiry_utc=2147483640\n"
> | git credential-cache store
> # try to retrieve credential
> printf "host=example.com\nprotocol=https\n" | git -c credential.helper= -c credential.helper=cache credential fill
> 
> Expected output (complete credential):
> 
> protocol=https
> host=example.com
> authtype=bearer
> credential=letmein
> password_expiry_utc=2147483640
> 
> Actual output (incomplete credential, no prompt for username or password):
> 
> protocol=https
> host=example.com
> password_expiry_utc=2147483640

This is expected.  Every request to a credential helper should include
all of the capabilities that the caller supports on input, and the
credential helper will always emit those on output.  `git credential`,
however, will only emit the capabilities that were actually supported,
so that general callers (including Git LFS) can determine the actual
set of supported capabilities.

In this case, you asked the cache helper for a credential, but didn't
tell it that you supported `authtype` and `credential`.  Therefore, the
only safe thing it can assume is that you are incapable of parsing and
understanding those fields, so it doesn't emit them.  This is a benefit
for security, because some tooling logs all fields but the `password`
field, and we don't want to include new secret fields that the caller is
going to shovel into a file or syslog.

In addition, the helper could actually store two different sets of
credentials, one which is a username and password, and one which is an
authtype and credential.  If you provided the capability, the latter
would be omitted, but otherwise the former would.  That can be helpful
if you have a stronger credential type but might occasionally need to
use older software (say, older versions of Git or Git LFS).

However, if you provide the proper capability, this works as you expect:

----
% printf "host=example.com\nprotocol=https\n" | git -c credential.helper= -c credential.helper=cache credential reject
% printf "capability[]=authtype\nhost=example.com\nprotocol=https\nauthtype=bearer\ncredential=letmein\npassword_expiry_utc=2147483640\n" | git credential-cache store
% printf "capability[]=authtype\nhost=example.com\nprotocol=https\n" | git -c credential.helper= -c credential.helper=cache credential fill
capability[]=authtype
authtype=bearer
credential=letmein
protocol=https
host=example.com
password_expiry_utc=2147483640
----

Note that `capability[]` directives should always start the request to
allow one-pass parsing.

Hopefully this is helpful.
-- 
brian m. carlson (they/them or he/him)
Toronto, Ontario, CA

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux