On Tue, Dec 04, 2018 at 02:33:40AM -0800, Claus Assmann wrote:
> On Mon, Dec 03, 2018, Philip Guenther wrote:
>
> [thanks for the analysis/explanation!]
>
> > And now this kbind() call blows up: the address is not on the original
> > thread's stack but in one of those mmap()s...but those mmap()s were not
> > marked as stacks by including MAP_STACK. To quote the "Security
> > improvements" section of https://www.openbsd.org/64.html
>
> > * Implemented MAP_STACK option for mmap(2). At pagefaults and
> > syscalls the kernel will check that the stack pointer points
> > to MAP_STACK memory, which mitigates against attacks using
> > stack pivots.
>
> Hmm, I read that and it seems I misunderstood it -- I will give
> this a try.
> However, here's the weird part: there's a compile time switch not
> to use mmap(2) but malloc(2) and I selected that option in one of
> my test because of that note: that version also crashed, hence I
> was under the impression that MAP_STACK couldn't be the problem.
malloc(3) uses mmap without MAP_STACK flag, so you'll end up with memory
not marked MAP_STACK in both cases.
Define MALLOC_STACK and add MAP_STACK to the flags,
-Otto
>
>
> static char *_st_new_stk_segment(int size)
> {
> #ifdef MALLOC_STACK
> void *vaddr = malloc(size);
> #else
> int mmap_flags = MAP_PRIVATE;
> void *vaddr;
>
> mmap_flags |= MAP_ANON;
> vaddr = mmap(NULL, size, PROT_READ | PROT_WRITE, mmap_flags, zero_fd, 0);
> if (vaddr == (void *)MAP_FAILED)
> return NULL;
> #endif /* MALLOC_STACK */
> return (char *)vaddr;
> }
>