Как избежать стека исполняемых потоков процесса Linux? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь избавиться от исполняемых стеков в системе Linux. Все программы связаны с опцией -z noexecstack.

Согласно выводам execstack -q, библиотеки или программы не должны требовать execstack.

Но все же файлы /proc/{pid}/maps показывают флаг x для всего стека потоков, созданных с использованием pthread_create():

~ # cat /proc/1283/maps | grep stack
b68d0000-b69cf000 rwxp 00000000 00:00 0          [stack:1291]
b69d0000-b6acf000 rwxp 00000000 00:00 0          [stack:1290]
b6ad0000-b6bcf000 rwxp 00000000 00:00 0          [stack:1289]
bec63000-bec84000 rw-p 00000000 00:00 0          [stack]

Основные потоки (и все однопоточные программы) не страдают этой проблемой.

strace показывает следующие вызовы, когда стек потоков создан (нет PROT_EXE C):

mmap2(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb6d11000
mprotect(0xb6d11000, 4096, PROT_NONE)   = 0

Я не знаю, связано ли это, но даже процесс init, похоже, имеет странные области памяти для записи и выполнения (но не в стеке).

~ #  cat /proc/1/maps

00008000-000e5000 r-xp 00000000 b3:03 7530       /bin/busybox
000ed000-000ee000 rwxp 000dd000 b3:03 7530       /bin/busybox
000ee000-00111000 rwxp 00000000 00:00 0          [heap]
b6d8b000-b6eb7000 r-xp 00000000 b3:03 1306       /lib/libc-2.20.so
b6eb7000-b6ebe000 ---p 0012c000 b3:03 1306       /lib/libc-2.20.so
b6ebe000-b6ec0000 r-xp 0012b000 b3:03 1306       /lib/libc-2.20.so
b6ec0000-b6ec1000 rwxp 0012d000 b3:03 1306       /lib/libc-2.20.so
b6ec1000-b6ec4000 rwxp 00000000 00:00 0
...

Это какое-то свойство самого старого Linux (v3.4.52) или некоторая пропущенная конфигурация в сборке?

...