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

Re: [PATCH] imap-send: use xsnprintf to format command

From
Jeff King <peff@peff.net>
Date
Apr 3, 2024, 20:32 UTC
Message-ID
<20240403203221.GB1949464@coredump.intra.peff.net>
In-Reply-To
<970c27ec-c377-4034-853a-0251733ec50c@web.de>
On Wed, Apr 03, 2024 at 11:25:42AM +0200, René Scharfe wrote:
Show 10 quoted lines
> From reading the code I assumed the static buffer is there to stay
> within some IMAP limit.  RFC 9051 mentions the distinction between
> synchronizing and non-synchronizing literals.  The latter have a maximum
> length of 4096 bytes.
> 
> But those are transferred after the command, so have no relevance for
> the command buffer size.  I see no other limits, and I don't see us
> respecting that non-synchronizing literals limit, either.  I guess that
> means messages longer than 4096 bytes could be rejected by a conforming
> IMAP server?  Hmm.

It can also just be a quoted string, which likewise has no limit defined in that section. That's what we send for LOGIN (you have to go back to the imap_exec() command which uses a format string). It also looks like that would barf completely on a username or password that contains a double-quote. Yup:

  $ git format-patch -1 --stdout |
    git -c imap.user='my"user"' -c imap.pass=foo imap-send --no-curl
  [...]
  IMAP command 'LOGIN <user> <pass>' returned response (BAD) - Invalid characters in atom
  IMAP error: LOGIN failed
Show 7 quoted lines
> > Likewise imap-send's nfvasprintf() is basically xstrfmt(), except it
> > takes a va_list. So it would have to be replaced by strbuf_vaddf().
> 
> Looking closer I notice that the result of the single nfvasprintf() call
> is fed into the 1024 bytes buffer.  So we could replace it with
> strbuf_vaddf() or xstrvfmt() and still stay within that strange limit,
> as it's enforced later.
Oh, I forgot we had xstrvfmt(). That would obviously be the right match.
> Its own 8192 buffer shields us from huge allocations e.g. due to long
> usernames or paths, but we probably don't need this protection as such
> and "attack" would originate and be felt only locally.

Yeah, I think all of the data here is user controlled. Even if you didn't trust the patch itself, this is all username, mailbox name, etc.

Show 9 quoted lines
> > I wouldn't be surprised if there are other opportunities for string
> > cleanup, but I generally hoped that if we waited long enough imap-send
> > would just go away. ;) Either because we could get rid of the tool
> > entirely (though from a recent-ish search, there did not seem to be a
> > lot of good other tools) or because we'd just drop the old code and rely
> > on curl to do the heavy lifting.
> 
> Oh, my build uses curl, so my earlier test run was even worth less than
> I thought.
Heh.
-Peff
Previous: René Scharfe
Message 4 of 4 in “imap-send: use xsnprintf to format command”
  1. imap-send: use xsnprintf to format commandRené Scharfe, Apr 2, 2024
  2. Jeff KingApr 3, 2024
  3. René ScharfeApr 3, 2024
  4. Jeff KingApr 3, 2024

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.