Question - intention of UCLIBC_BUILD_NOEXECSTACK?

Andrew McDonnell bugs at andrewmcdonnell.net
Wed Oct 1 14:34:54 UTC 2014


(Sorry I didnt get back for a while)

After quite a journey I managed to work out how patch OpenWRT BB to build 
using uClibc snapshot 2014097 and sourceware binutils 20140918.

For a MIPS target, all the symptoms remain:

- in spite of UCLIBC_BUILD_NOEXECSTACK=y, noexecstack is not present on 
several so files

- in spite of UCLIBC_BUILD_RELRO=y, relro is not present in several so files

For noexecstack:

I dug right down into the build process and confirmed that -Wa,--noexecstack 
is being applied at the assembler stage which is supposed to put noexecstack 
on assembly files.  Assuming that this was not working as intended, I then 
applied the 'proper' way to fix assembly files, 
http://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart#Patching , to every 
S file under all mips/ directories in the uClibc tree, noting that some other 
architectures in uClibc do the same. After clean rebuilding this made no 
difference.
As a further check I did a scan of every single .os / .oS file and disocevred 
that not one did NOT have the NX flag. Which means that the problem is being 
caused by the linker.  There is no difference in linker options between the 
libraries that have NX and those that dont.

In desparation I enabled ld tracing and verbose and discovered that for MIPS 
targets the linked does some '/DISCARD/ : { *(.note.GNU-stack)' thing, so I 
wonder if this is related?

The only way I was able to force noexecstack on every output was to use 
UCLIBC_EXTRA_LDFLAGS=-Wl,-z,noexecstack in the build environment.


For relro:

I confirmed that -Wl,-z,relro -Wl,-z,now is on the linker line for the 
affected libraries, and it works for some and not others.

My current understanding:

I think this problem is MIPS specific.

I built uClibc for x86 on native Debian Wheezy amd64 and every library had NX 
and RELRO without doing anything special.

In summary, on MIPS architectures: if someone builds uClibc with 
UCLIBC_BUILD_NOEXECSTACK=y or UCLIBC_BUILD_RELRO=y they wont be getting what 
they asked for.

*Caveat* - it is highly possible there is something I still dont understand 
about all this, and I will happily be enlightnened!


thanks,
--A





(I havent yet had a chance to look at the gentoo hardened mips uclibc 
suggested previously.)




On 27/08/14 05:05, Bernhard Reutner-Fischer wrote:
> On 25 August 2014 15:57, Andrew McDonnell <bugs at andrewmcdonnell.net> wrote:
>> On 25/08/14 22:56, Andrew McDonnell wrote:
>>> Hmmm, I am having some trouble repeating my original result.
>>>
>> <snipped>
>>
>> OK, with a fresh build, the following appears to apply:
>>
>> * OpenWRT sets UCLIBC_BUILD_NOEXECSTACK=y
>>
>> * Somehow this ends up with libcrypt, libm, libresolv, libnsl, libthread_db,
>> libdl and  and libutil actually having the NX flag set in the ELF despite
>> there being no -Wl,-z,noexecstack linker option specified.
>>
>> This I really do not understand yet!
>>
>> * ld-uClibc, librt, libuClibc and libpthread _dont have the NX flag set, which
>> is what I would have expected when the link was missing the noexecstack option.
>>
>> * The above was checked before any stripping applied, just in case
>>
>> Now its gotten too late, so I'll have to re-test my patch that applies the
>> noexecstack marking to ld-uClibc, librt, libuClibc and libpthread as well
>> later this week before I submit it.
>>
>> FWIW this is all done using the OpenWRT buildroot for a carambola2 target
>>
>> There is another oddity with all of this, as well.
>>
>> Every single one of libcrypt, libm, libresolv, libnsl, libthread_db, libdl,
>> libutil, libuClibc, librt and libpthread are all built with -Wl,-z-relro yet
>> the GNU_RELRO section is only present in libdl, libpthread and libuClibc and
>> yet all are built with exactly the same set of -Wl,-z options
>>
>> I am wondering if this is this bug,
>> https://sourceware.org/bugzilla/show_bug.cgi?id=16322 because OpenWRT binutils
>> is still 2.23
>
> I cannot reproduce this with binutils-gdb 2.24.51.20140818.
> Can you try with binutils 2.24 or later please?
>
> TIA,
>



More information about the uClibc mailing list