Changing stack protector initialization

Florian Weimer fweimer@redhat.com
Thu Oct 27 17:55:00 GMT 2016


On 10/27/2016 07:03 PM, Carlos O'Donell wrote:
> On 10/27/2016 10:00 AM, Florian Weimer wrote:
>> I need a few more pseudo-random bits (32 instead of 16 on 64-bit
>> architectures).  I talked to some cryptography people and they told
>> me to expand the 16-byte secret by hashing it with SHA-256.
>>
>> This key expansion has to happen both in ld.so (for the stack
>> protector and pointer guard) and libc.so (for the new stuff).  My
>> first attempt failed because doing the initialization in ld.so
>> triggers duplication of the new guard variables from libc.so in
>> ld.so, and the libc.so variables are never initialized.  (This is
>> very confusing to GDB, which does not tell you that you have two
>> variables with the same name at different addresses.)
>
> Could you explain this in a bit more detail?

It's a bit complicated.  I've put the patch on the branch fw/heap-protector.

The branch should build just fine, and the malloc/tst-mallocstate test 
passes.  However, it should fail.

If you set a breakpoint in the middle of do_test, after the 
initialization (say, tst-mallocstate.c:486), you have this situation:

(gdb) print __malloc_header_guard
$2 = 1248978169008729616
(gdb) print &__malloc_header_guard
$5 = (size_t *) 0x555555779128 <__malloc_header_guard>

But look at the disassembly of malloc_usable_size.  It contains:

    0x00007ffff7cd5355 <+37>:    xor    0x322114(%rip),%rax        # 
0x7ffff7ff7470 <__malloc_header_guard>

And of course:

(gdb) print *(size_t *)0x7ffff7ff7470
$6 = 0

Notice the difference address of the variable:

(gdb) info symb 0x7ffff7ff7470
__malloc_header_guard in section .bss of ./libc.so.6
(gdb) info symb 0x555555779128
__malloc_header_guard in section .bss of 
/home/fweimer/src/gnu/glibc/build/elf/ld-linux-x86-64.so.2

I hope this allows you to reproduce the issue easily.

I'll try to propagate the cookie values through GLRO variables.  I do 
not want to access GLRO directly in the malloc code due to performance 
concerns.

Thanks,
Florian



More information about the Libc-alpha mailing list