Я пытаюсь избавиться от исполняемых стеков в системе 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) или некоторая пропущенная конфигурация в сборке?