> This proposal was originally at https://fedorahosted.org/fesco/ticket/1104

> http://fedoraproject.org/wiki/Hardened_Packages page mentions
> that "FESCo requires some packages to use PIE and relro hardening by
> default."

"Position independent executables" use a weak form of ASLR on 
Fedora-19-Alpha-TC3-i686.
The kernel always chooses the region below and *near* the stack.  The stack 
placement
is randomized (always, regardless of executable type), but the range for "a 
position-
independent executable" (ET_DYN with 0==PT_LOAD.p_vaddr) is only a small subset 
of
the address space.  Experiment suggests that the window is 1MiB (20 bits), but 
this
includes the 12 low-order bits which cannot be changed.  Thus the kernel uses 
only
256 possibilities.  See test program below.

Note that "gcc -fPIE" is for compiling.  Static linking requires "gcc -pie",
else the result has Elf32_Hdr.e_type == ET_EXEC, which is not eligible for ASLR.


$ cat where.c
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>

char buf[8192];

main()
{
        int const fd=open("/proc/self/maps", O_RDONLY);
        for (;;) {
                size_t len=read(fd, buf, sizeof(buf));
                if (-1==len) {
                        perror("read"); exit(1);
                }
                if (0==len)
                        break;
                write(1, buf, len);
        }
        return 0;
}
$ gcc -m32 -pie -fPIE -g -o where where.c   # -m32 is redundant on real i686
$ readelf --headers ./where | grep Type:
  Type:                              DYN (Shared object file)
$ readelf --headers ./where  |  grep LOAD
  LOAD           0x000000 0x00000000 0x00000000 0x0092c 0x0092c R E 0x1000
  LOAD           0x000ef0 0x00001ef0 0x00001ef0 0x00140 0x02170 RW  0x1000

$ ./where  # on i686 hardware
b750d000-b750e000 rw-p 00000000 00:00 0
b750e000-b76c6000 r-xp 00000000 08:3b 132197     /usr/lib/libc-2.17.so
b76c6000-b76c8000 r--p 001b7000 08:3b 132197     /usr/lib/libc-2.17.so
b76c8000-b76c9000 rw-p 001b9000 08:3b 132197     /usr/lib/libc-2.17.so
b76c9000-b76cc000 rw-p 00000000 00:00 0
b76e5000-b76e6000 rw-p 00000000 00:00 0
b76e6000-b76e7000 r-xp 00000000 00:00 0          [vdso]
b76e7000-b7706000 r-xp 00000000 08:3b 131776     /usr/lib/ld-2.17.so
b7706000-b7707000 r--p 0001e000 08:3b 131776     /usr/lib/ld-2.17.so
b7707000-b7708000 rw-p 0001f000 08:3b 131776     /usr/lib/ld-2.17.so
b7708000-b7709000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b7709000-b770a000 r--p 00000000 08:3b 654566     /home/jreiser/where
b770a000-b770b000 rw-p 00001000 08:3b 654566     /home/jreiser/where
b770b000-b770d000 rw-p 00000000 00:00 0
bfa65000-bfa86000 rw-p 00000000 00:00 0          [stack]

$ for i in 0 1 2 3 4 5 6 7 8 9 0; do ./where | grep where | sed 1q; done
b7749000-b774a000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b77f4000-b77f5000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b7795000-b7796000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b7719000-b771a000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b775f000-b7760000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b7785000-b7786000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b77a3000-b77a4000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b771a000-b771b000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b776f000-b7770000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b77d9000-b77da000 r-xp 00000000 08:3b 654566     /home/jreiser/where
b7768000-b7769000 r-xp 00000000 08:3b 654566     /home/jreiser/where
$

-- 
devel mailing list
devel@lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/devel

Reply via email to