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

Re: [PATCH v4] gpg-interface.c: detect and reject multiple signatures on commits

From
Michał Górny <mgorny@gentoo.org>
Date
Oct 21, 2018, 07:10 UTC
Message-ID
<1540105841.1174.1.camel@gentoo.org>
In-Reply-To
<xmqqin1wyxvz.fsf@gitster-ct.c.googlers.com>
On Sun, 2018-10-21 at 08:57 +0900, Junio C Hamano wrote:
Show 64 quoted lines
> Michał Górny <mgorny@gentoo.org> writes:
> 
> > GnuPG supports creating signatures consisting of multiple signature
> > packets.  If such a signature is verified, it outputs all the status
> > messages for each signature separately.  However, git currently does not
> > account for such scenario and gets terribly confused over getting
> > multiple *SIG statuses.
> > 
> > For example, if a malicious party alters a signed commit and appends
> > a new untrusted signature, git is going to ignore the original bad
> > signature and report untrusted commit instead.  However, %GK and %GS
> > format strings may still expand to the data corresponding
> > to the original signature, potentially tricking the scripts into
> > trusting the malicious commit.
> > 
> > Given that the use of multiple signatures is quite rare, git does not
> > support creating them without jumping through a few hoops, and finally
> > supporting them properly would require extensive API improvement, it
> > seems reasonable to just reject them at the moment.
> > 
> > Signed-off-by: Michał Górny <mgorny@gentoo.org>
> > ---
> >  gpg-interface.c          | 90 +++++++++++++++++++++++++++-------------
> >  t/t7510-signed-commit.sh | 26 ++++++++++++
> >  2 files changed, 87 insertions(+), 29 deletions(-)
> > 
> > Changes in v4:
> > * switched to using skip_prefix(),
> > * renamed the variable to seen_exclusive_status,
> > * made the loop terminate early on first duplicate status seen.
> 
> Thanks for sticking to the topic and polishing it further.  Looks
> very good.  
> 
> Will replace.
> 
> > +	int seen_exclusive_status = 0;
> > +
> > +	/* Iterate over all lines */
> > +	for (line = buf; *line; line = strchrnul(line+1, '\n')) {
> > +		while (*line == '\n')
> > +			line++;
> > +		/* Skip lines that don't start with GNUPG status */
> > +		if (!skip_prefix(line, "[GNUPG:] ", &line))
> > +			continue;
> > +
> > +		/* Iterate over all search strings */
> > +		for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_status); i++) {
> > +			if (skip_prefix(line, sigcheck_gpg_status[i].check, &line)) {
> > +				if (sigcheck_gpg_status[i].flags & GPG_STATUS_EXCLUSIVE) {
> > +					if (++seen_exclusive_status > 1)
> > +						goto found_duplicate_status;
> 
> Very minor point but by not using pre-increment, i.e.
> 
> 		if (seen_exclusive_status++)
> 			goto found_duplicate_status;
> 
> you can use the expression as a "have we already seen?" boolean,
> whic may probably be more idiomatic.
> 
> The patch is good in the way written as-is, and this is so minor
> that it is not worth rerolling to only update this part.
> 

Sure, thanks. For the record, I've been taught to use pre-increment whenever possible to avoid copying the variable but I suppose it doesn't really matter here. Just a habit.

I'll start working on my next ideas once this is merged and I rebase.
-- 
Best regards,
Michał Górny
Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 11 in “gpg-interface.c: detect and reject multiple signatures on commits”
  1. gpg-interface.c: detect and reject multiple signatures on commitsMichał Górny, Oct 20, 2018
  2. Junio C HamanoOct 20, 2018
  3. Michał GórnyOct 21, 2018
  4. Junio C HamanoOct 22, 2018
  5. Michał GórnyOct 22, 2018
  6. Michał GórnyOct 22, 2018
  7. Duy NguyenNov 3, 2018
  8. Michał GórnyNov 3, 2018
  9. Duy NguyenNov 3, 2018
  10. Michał GórnyNov 3, 2018
  11. Duy NguyenNov 3, 2018

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.