mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: Out of bounds memory read in src/stdio/vfprintf.c
Date: Thu, 28 Jun 2018 13:40:58 -0400	[thread overview]
Message-ID: <20180628174058.GG1392@brightrain.aerifal.cx> (raw)
In-Reply-To: <CANravCCmcn6wiKZnPc2nYkouFmjSVdD+u8x6EQGvy8qwdXDwkw@mail.gmail.com>

On Thu, Jun 28, 2018 at 10:20:28AM -0700, Mark Winterrowd wrote:
> Hi all,
> 
> I believe I have found an out of bounds memory read in vfprintf.c
> 
> On line 509 in src/stdio/vfprintf.c in the current source tree head, you
> can observe the following snippet of code:
> 
> /* Format specifier state machine */
> st=0;
> do {
> if (OOB(*s)) goto inval;
> ps=st;
> st=states[st]S(*s++);
> } while (st-1<STOP);
> if (!st) goto inval;
> 
> Note that on line 99 the OOB macro expands to the following test whether
> the argument falls outside of 'A' and 'z', written to use a single compare:
> 
> #define OOB(x) ((unsigned)(x)-'A' > 'z'-'A')
> Unfortunately, the cast to unsigned binds tighter than the subtract

For this idiom, it's intentional that it bind higher. Here since x is
small (char-range) anyway it doesn't matter, but in general the
pattern (x-'A') could overflow, producing UB, if x weren't alreaady
unsigned.

> from 'A', so if x is less than 'A',
> OOB will return false. This is common in the case of space, which has
> an ascii value of 32

No, the result of (unsigned)(x)-'A' is unsigned, and in the case
x<'A', it's a value larger than INT_MAX which is much larger than
'z'-'A'.

> compared to 'A' 's value of 65.
> 
> This causes us to index into states with a negative value for its
> second dimension, causing us to
> index to an unpredictable location in states, possibly even off the beginning.

Did you test this? It's possible there's another mistake we're not
seeing, but the above isn't one. Also note that passing an invalid
format string is UB already, so any graceful handling of that is just
hardening, not correctness.

Rich


  reply	other threads:[~2018-06-28 17:40 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-28 17:20 Mark Winterrowd
2018-06-28 17:40 ` Rich Felker [this message]
2018-06-28 17:52   ` Mark Winterrowd

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180628174058.GG1392@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).