LINUX.ORG.RU

Внезапный READ_IMPLIES_EXEC в personality

 , ,


1

2

Этот код у меня на x86_64 по дефолту выдаёт 0.

#include <stdio.h>
#include <sys/personality.h>

int main(void)
{
	printf("READ_IMPLIES_EXEC: %d\n", (personality(0xffffffff) & READ_IMPLIES_EXEC) != 0);
	return 0;
}

Есть один проект, в котором ВНЕЗАПНО в /proc/[pid]/maps засверкало много x в permissions.

Копали-копали, оказалось:

$ LD_LIBRARY_PATH=/somedir ./projectexecutable
READ_IMPLIES_EXEC: 1

$ LD_LIBRARY_PATH=/somedir /lib64/ld-linux-x86-64.so.2 ./projectexecutable
READ_IMPLIES_EXEC: 0

Проверка на READ_IMPLIES_EXEC идёт в первой строке в main. В strace вызовов personality, кроме как с 0xffffffff, нет.

И ещё более внезапно:

$ readelf -l ./prog
...
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
...

Куда копать?


Возможно, сюда:

$ gcc personality.c
$ ./a.out
READ_IMPLIES_EXEC: 0
$ gcc personality.c -Wl,-zexecstack
$ ./a.out
READ_IMPLIES_EXEC: 1
$ strace ./a.out |& grep personality
personality(0xffffffff /* PER_??? */)   = 4194304

xaizek ★★★★★
()

Гугл даёт такую статью https://lwn.net/Articles/631631/ , в которой написано, что в конце load_elf_binary() вызывается SET_PERSONALITY(), в котором для 64-бит делается:

current->personality &= ~READ_IMPLIES_EXEC;

Видимо при запуске через ld-linux это не срабатывает.

mky ★★★★★
()

Всем спасибо

Выхлоп двух readelf:

...
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RWE    0x10
...

...
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
...

В статье на lwn объясняется PT_GNU_STACK, "-Wl,-znoexecstack" помогло.

Почему gcc начал выставлять executable-флаг по быстрому найти не смог. На стэке я вроде бы ничего не исполнял. Много играл с mmap и mprotect и __asm__.

suuaq
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.