Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Jun 2005 18:50:17 +0200
From:      Jeremie Le Hen <jeremie@le-hen.org>
To:        freebsd-hackers@FreeBSD.org
Subject:   ProPolice and FreeBSD
Message-ID:  <20050630165017.GH49933@obiwan.tataz.chchile.org>

next in thread | raw e-mail | index | archive | help
Hello,

maybe this question should be asked on -threads@, I'm not sure.  If it
is, please tell me and I will redirect my mail.

I'm working on upgrading the ProPolice/SSP patch [1] to -CURRENT.  I
initially used the patch against FreeBSD 5.1 to know which file I
should modify and in which way in the source tree, but I used the
newest patch against gcc 3.4.1 for gcc specific stuffs.

After a little work, I got a full FreeBSD built with SSP functions
compiled in libc (it is also possible to compile it in libgcc but,
AFAIU, this would require the SSP stuff to be statically built in
all binaries since FreeBSD doesn't provide a shared libgcc).  I also
read somewhere that some guys of the hardened Debian project have made
a libssp, but I find this a little bit overkill (comments ?).

I recompiled host(1), libc and libpthread with debugging symbol.

Now the questions.  All binaries linked against libpthread immediately
get a SIGSEGV :
%%%
    coyote:libc# gdb /usr/bin/host 
    GNU gdb 6.1.1 [FreeBSD]
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i386-marcel-freebsd"...
    (gdb) r
    Starting program: /usr/bin/host 
    warning: Unable to get location for thread creation breakpoint: generic error
    [New LWP 100135]
    
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to LWP 100135]
    _thr_cancel_enter (thread=0x0)
        at /usr/src/lib/libpthread/thread/thr_cancel.c:269
    269             THR_THREAD_LOCK(thread, thread);
    (gdb) bt full
    #0  _thr_cancel_enter (thread=0x0)
        at /usr/src/lib/libpthread/thread/thr_cancel.c:269
    No locals.
    #1  0x282dd51b in __open (path=0x281bc0c0 "ÀÀ\033( \220\033(", flags=0)
        at /usr/src/lib/libpthread/thread/thr_open.c:53
            curthread = (struct pthread *) 0x0
            ret = 0
            mode = 0
    #2  0x2838f40b in __guard_setup ()
        at /usr/src/lib/libc/sys/stack_protector.c:51
            fd = 0
    #3  0x283cbe22 in lseek () from /lib/libc.so.6
    No symbol table info available.
    #4  0x28316dd1 in _init () from /lib/libc.so.6
    No symbol table info available.
    #5  0x281b8000 in ?? ()
    No symbol table info available.
    #6  0x281ad6fc in ?? () from /libexec/ld-elf.so.1
    No symbol table info available.
    #7  0xbfbfeca8 in ?? ()
    No symbol table info available.
    #8  0x2818cc79 in find_symdef () from /libexec/ld-elf.so.1
    No symbol table info available.
    #9  0x2818b759 in _rtld () from /libexec/ld-elf.so.1
    No symbol table info available.
    #10 0x2818a98e in .rtld_start () from /libexec/ld-elf.so.1
    No symbol table info available.
%%%

__guard_setup() is the constructor of the SSP patch, it generates a
random cookie for the application runtime :
%%%
    static void __guard_setup(void) __attribute__ ((constructor));
    static void
    __guard_setup(void)
    {
      int fd;
      if (__guard[0]!=0) return;
      fd = open ("/dev/urandom", 0);
      if (fd != -1) {
        ssize_t size = read (fd, (char*)&__guard, sizeof(__guard));
        close (fd) ;
        if (size == sizeof(__guard)) return;
      }
      /* If a random generator can't be used, the protector switches the guard
         to the "terminator canary" */
      ((char*)__guard)[0] = 0; ((char*)__guard)[1] = 0;
      ((char*)__guard)[2] = '\n'; ((char*)__guard)[3] = 255;
    }
%%%

I am neither a gcc hacker nor a thread guru, so I have no clue on how to
resolve this issue.  Advices are welcome.

Thanks.

Regards,
[1] http://www.trl.ibm.com/projects/security/ssp/
-- 
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050630165017.GH49933>