[14807] in bugtraq

home help back first fref pref prev next nref lref last post

Re: Solaris 7 x86 lpset exploit.

daemon@ATHENA.MIT.EDU (Peter da Silva)
Sat May 6 16:19:05 2000

Message-Id:  <200005041909.OAA0000024698@grendel.eng.baileynm.com>
Date:         Thu, 4 May 2000 14:09:58 -0500
Reply-To: Peter da Silva <peter@GRENDEL.ENG.BAILEYNM.COM>
From: Peter da Silva <peter@GRENDEL.ENG.BAILEYNM.COM>
X-To:         BUGTRAQ@SECURITYFOCUS.COM
To: BUGTRAQ@SECURITYFOCUS.COM
In-Reply-To:  <200005030604.CAA01307@twig.rodents.montreal.qc.ca>

In article <200005030604.CAA01307@twig.rodents.montreal.qc.ca>,
der Mouse  <mouse@RODENTS.MONTREAL.QC.CA> wrote:
> >> Another possible way around it would be to cause gcc to keep part of
> >> the stack in the data segment, out of what the kernel thinks of as
> >> the stack, and have it do its trampolines there.  This runs into big
> >> problems with setjmp and other nonlocal exits, and possibly with
> >> signal handlers as well.

> > You could handle that by having a frame pointer on the processor
> > stack point into the function's executable stack frame (if it has
> > one) on the trampoline stack, rather than having a permanent stack
> > pointer into this space.  I don't think there would be any issues
> > with this, unless you're trying to use setjmp/longjmp for coroutines
> > or something perverse like that.

> If you longjmp out, how do you free up the jumped-through frames on the
> executable stack?

If the frame pointer only exists on the processor stack what is there to
free up?

> If you do it by using a contiguous executable stack
> with an offset-style pointer into it, conceptually the way longjmp
> deals with freeing ordinary stack frames, how do you deal with
> overflow, without wasting large amounts of data segment space on
> programs that don't need deep executable stacks?

How big a stack are you thinking of? How big are the chunks of code you're
allocating on it? I was under the impression that these are 20-30 byte chunks
of code at the most... suppose you allocated a megabyte of address space to
the task, would any modern system even notice? Would you ever overflow?

Even on 32-bit operating systems allocating a gigabyte or so of address space
to system code isn't a big deal...  on 64-bit... well, Tru64 UNIX starts
memory allocations above the first gigabyte to try and make sure you trap
when following bogus pointers.

> If you do it with a
> linked list of frame structures, how do you push frames on it without
> risking either a corrupted stack or a lost frame in the presence of
> longjmp out of a signal handler?  If you do it with something else,
> well, what?

You can always do it in the exit or entry code of any routine that uses the
executable stack. The only serious failure mode I can see for that is pretty
unlikely... you'd have to have a program do a bunch of executable stack work,
longjmp out of ALL of it, then never touch the executable stack for the rest
of the program.

home help back first fref pref prev next nref lref last post