public inbox for kernel-hardening@lists.openwall.com
 help / color / mirror / Atom feed
From: Solar Designer <solar@openwall.com>
To: kernel-hardening@lists.openwall.com
Subject: Re: [kernel-hardening] [RFC] x86, mm: start mmap allocation for libs from low addresses
Date: Sun, 4 Sep 2011 03:57:28 +0400	[thread overview]
Message-ID: <20110903235728.GD29169@openwall.com> (raw)
In-Reply-To: <20110903111849.GA2743@albatros>

Vasiliy,

On Sat, Sep 03, 2011 at 03:18:49PM +0400, Vasiliy Kulikov wrote:
> On Fri, Sep 02, 2011 at 22:29 +0400, Solar Designer wrote:
> > On Thu, Aug 25, 2011 at 09:19:34PM +0400, Vasiliy Kulikov wrote:
> > > additionally overwrite function arguments, which are located after the
> > > function address on the stack.  The attacker's best bet may be to find
> > > an entry point not at function boundary that sets registers and then
> > > proceeds with or branches to the desired library code.  The easiest way
> > > to set registers and branch would be a function epilogue -
> > > pop/pop/.../ret - but then there's the difficulty in passing the address
> > > to ret to (we have just one NUL and we've already used it to get to this
> > > code).  Similarly, even via such pop's we can't pass an argument that
> > > contains a NUL in it - e.g., the address of "/bin/sh" in libc (it
> > > contains a NUL most significant byte too) or a zero value for root's
> > > uid.
> > 
> > The above was partially flawed logic on my part - as written above
> > (without further detail), the pop/pop/.../ret thing doesn't apply
> > because those pop's would read stack right after the just-used return
> > address - that is, the same stack locations that we presumably could not
> > write to in order to pass the arguments in a more straightforward
> > fashion.  So this trick would be of no help, and thus its other
> > limitations would be of no relevance.
> 
> Why not?

I am not sure what exactly your "why not" applies to.  What I said was
that the trick of returning specifically to pop/pop/.../ret would be of
no help to an exploit writer trying to bypass ASCII armor, and I
explained why not in the paragraph you quoted.  So the exploit writer
would use some other trick, possibly just slightly different - to give
an example (just to you, not for LKML), I included an instruction
sequence from a glibc build that would be a better target to return to
(note how it is not limited to pop and ret instructions), and that would
actually make the limitations being talked about relevant.

> If function address contains NUL, the overflow stops at this
> address.  If it doesn't contain NUL, but argument contain NUL, it is the
> last argument an attacker can use

Right.

> (therefore, it would be the last used code chunk).

I don't understand this bit.

> So, it has some value even if he can somehow write
> the ret address (e.g. it is out of 16 MBs).

Right.  Once again, what I said is that this limitation becomes relevant
in certain cases other than returning to a trivial pop/ret sequence.
Namely, it is relevant when returning straight to a function entry, and
it is relevant when returning to certain other instruction sequences.
Just not when returning specifically to pop/ret, which is of no help in
an attack trying to bypass ASCII armor anyway.

To summarize: we happened to give a poor example in the patch
description, and I'd like to correct that by reducing the level of
detail.  (The alternative would have been to go deeper into detail.)

> > > If CONFIG_VM86=y, the first megabyte is excluded from the potential
> > > range for mmap allocations as it might be used by vm86 code.  If
> > > CONFIG_VM86=n, the allocation begins from the mmap_min_addr.  Regardless
> > > of CONFIG_VM86 the base address is randomized with the same entropy size
> > > as mm->mmap_base.
> > 
> > OK.  Shouldn't CONFIG_VM86 be a sysctl, though?
> 
> This is not a hardening setting that was present in -ow, but an existing
> config to disable vm86/vm86_old at the compile time.  It was added for
> EMBEDDED.

Oh, I was not aware of that.

solar@host:~/kernel/mainline/linux-3.0.4 $ fgrep -rl CONFIG_VM86 .
./arch/x86/kernel/Makefile
./arch/x86/kernel/entry_32.S
./arch/x86/include/asm/vm86.h
./arch/x86/include/asm/processor-flags.h

Looks like there's no Kconfig option for this - perhaps add it with a
separate patch?

Thanks,

Alexander

  reply	other threads:[~2011-09-03 23:57 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-12 10:29 [kernel-hardening] [RFC] x86, mm: start mmap allocation for libs from low addresses Vasiliy Kulikov
2011-08-12 10:58 ` Solar Designer
2011-08-12 11:05   ` Vasiliy Kulikov
2011-08-25 17:19   ` Vasiliy Kulikov
2011-08-25 17:39     ` Solar Designer
2011-09-02 18:29     ` Solar Designer
2011-09-03 11:18       ` Vasiliy Kulikov
2011-09-03 23:57         ` Solar Designer [this message]
2011-09-05 12:46           ` Vasiliy Kulikov
2011-09-06  5:05             ` Solar Designer
2011-09-07  9:09               ` Vasiliy Kulikov
2011-09-07  9:30                 ` Solar Designer
2011-09-07  9:34                   ` Vasiliy Kulikov
2011-09-07  9:43                     ` Solar Designer
2011-09-07  9:55                       ` Vasiliy Kulikov
2011-09-07 10:16                         ` Solar Designer
2011-09-07 11:01                           ` Vasiliy Kulikov
2011-09-02 23:34     ` Solar Designer
2011-09-03 12:12       ` Vasiliy Kulikov
2011-09-03 23:40         ` Solar Designer
2011-09-04  7:21         ` Vasiliy Kulikov
2011-08-12 23:19 ` [kernel-hardening] " H. Peter Anvin
2011-08-13  6:26   ` Vasiliy Kulikov
2011-08-16  9:05   ` Vasiliy Kulikov
2011-08-22 10:17     ` Vasiliy Kulikov
2011-08-22 17:24       ` H. Peter Anvin
2011-08-22 20:14         ` Vasiliy Kulikov
2011-08-22 20:17           ` H. Peter Anvin
2011-08-23  6:41             ` Vasiliy Kulikov

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=20110903235728.GD29169@openwall.com \
    --to=solar@openwall.com \
    --cc=kernel-hardening@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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox