public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
From: Jeff Johnston <jjohnstn@redhat.com>
To: "R. Diez" <rdiezmail-newlib@yahoo.de>
Cc: "newlib@sourceware.org" <newlib@sourceware.org>
Subject: Re: _REENT_CHECK_VERIFY calls __assert_func even if NDEBUG is defined
Date: Mon, 27 Apr 2020 19:57:57 -0400	[thread overview]
Message-ID: <CAOox84vYRMU2K2UE6OasV_PMrkvjBcCD5s7Wxj0eLFSA1gT4Hw@mail.gmail.com> (raw)
In-Reply-To: <1918742529.2295153.1588019348307@mail.yahoo.com>

On Mon, Apr 27, 2020 at 4:29 PM R. Diez <rdiezmail-newlib@yahoo.de> wrote:

> > The code does not disable via NDEBUG because it is a fix for a CVE.
> > It is not (and should not be) tied to user control over usage of the
> assert macro.
> > [...]
>
> First of all, thanks for you quick answer.
>
> I guess you mean CVE-2019-14871.
>
> The "fix" for this CVE feels wrong. It seems that you are trading
> accessing a NULL pointer with a total firmware crash. I believe that there
> is no other way that __assert_func() could behave to "fix" this problem.
> Well, that is trading a security problem for a denial of service problem.
> This is not really properly fixing the problem.
>

An alternative change would require modifications to all the existing
conversion routines using eBalloc() and their callers to do checking of
return values and bubble up to the user, setting errno to ENOMEM.  As no
one had an issue with the null pointer exception prior to the CVE it wasn't
felt that many, if any, people were running into this issue.  It should be
noted that Balloc() storage gets reused once allocated (i.e. is not
freed/allocated again).

>
> Firstly, is there no other routine to abort the firmware? __assert_func()
> should only be used together with assert(). Is it documented anywhere that
> __assert_func() must stop execution in order to prevent a security hole?
>
> Is there a way to avoid malloc() at all at a place where the user does not
> expect for it to happen? For example, preallocating all memory that might
> be needed. If may be worth the trade-off space vs safety.
>
>
The memory in question is being allocated by Balloc() which is part of the
mprec.c solution used in newlib.  The allocated _REENT_MP_FREELIST has an
array of storage to reuse for different k values so newlib will reuse
the storage over and over.  You could conceivably pre-populate this list by
doing sample stdlib conversion calls at the beginning of your application.
Other storage needs requires a bit of estimation on your part and
examination for
memory leakage in your application.  This goes without saying.

Like I said, my firmware does not use threads at all. Is there a way to
> drop all these reentrancy stuff? I am already using
> --disable-newlib-multithread .
>
>
Reentrancy is part and parcel of the newlib code base so that it "can"
support multiple threads.  Most of what you wlil need is allocated
initially in impure.c.  This excludes dynamic storage such as from files
being opened
and the Balloc storage used by the stdlib conversion routines.  If you are
constantly finding yourself close to the threshold, you should either have
a larger memory store to begin with or you need to evaulate how your
application is using memory.

In any case, I though the assertion message "REENT malloc succeeded" is
> wrong, it should probably read "REENT malloc failed". Or am I reading the
> code wrong?
>

The code forms a message: Assertion "xxxx" failed: ....   where xxxx is the
thing you are asserting to be true.  In this case, we wish to assert that
the REENT malloc succeeded.


> Thanks again,
>   rdiez
>
>  newlib-3.3.0/newlib/libc/stdlib/rand.c:78: undefined reference to
> `__assert_func'
> >
> > I tracked it down to this definition:
> >
> > /* Specify how to handle reent_check malloc failures. */
> > #ifdef _REENT_CHECK_VERIFY
> > #include <assert.h>
> > #define __reent_assert(x) ((x) ? (void)0 : __assert_func(__FILE__,
> __LINE__, (char *)0, "REENT malloc succeeded"))
> > #else
> > #define __reent_assert(x) ((void)0)
> > #endif
> >
> > This is unfortunate. First of all, I wonder what happens if malloc fails
> and there is no assert. Will there be a crash?
> >
> > Then, I would like to assert() in debug builds, and not in release
> builds. My code does not define __assert_func in release builds, because
> assertions are only supposed to work if NDEBUG is not defined. That has
> been working fine for years, until this Newlib version.
> >
> > I am configuring Newlib with --disable-newlib-multithread , because my
> embedded firmware has no threads. But I guess I still have to deal with
> "struct _reent", don't I? I would have hoped that, in this single-thread
> situation, any reentrancy structure could be allocated statically. Or is
> there any way to avoid this malloc()?
> >
> > Thanks in advance,
> >   rdiez
> >
> >
>
>

  reply	other threads:[~2020-04-27 23:58 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <989180140.2023825.1588003097077.ref@mail.yahoo.com>
2020-04-27 15:58 ` R. Diez
2020-04-27 17:39   ` Jeff Johnston
2020-04-27 20:29     ` R. Diez
2020-04-27 23:57       ` Jeff Johnston [this message]
2020-04-28 12:06         ` R. Diez
2020-04-29 19:51           ` Jeff Johnston
2020-04-30  8:08             ` R. Diez
2020-04-28 19:36         ` FAQ link to crossgcc broken R. Diez
2020-04-28 19:57         ` _REENT_CHECK_VERIFY calls __assert_func even if NDEBUG is defined R. Diez
2020-04-28 22:00           ` Keith Packard
2020-04-29 13:05             ` R. Diez

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=CAOox84vYRMU2K2UE6OasV_PMrkvjBcCD5s7Wxj0eLFSA1gT4Hw@mail.gmail.com \
    --to=jjohnstn@redhat.com \
    --cc=newlib@sourceware.org \
    --cc=rdiezmail-newlib@yahoo.de \
    /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.
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 read-only IMAP folder(s) and NNTP newsgroup(s).