Здравствуйте,Разыскивается спецификация, определяющая какие права доступа должны быть у shared library (.so).
Заранее огромное спасибо всем кто сможет направить по правильному пути.
Дмитрий
> Здравствуйте,
> Разыскивается спецификация, определяющая какие права доступа должны быть у shared library
> (.so).
> Заранее огромное спасибо всем кто сможет направить по правильному пути.Либа загружается через dlopen(), dlopen() юзает mmap(), у mmap есть флаг PROT_EXEC,
т.е. страница памяти может быть исполняемой (но вроде как борются с этим, тот же флаг NX у процессоров),
в общем, по этому надо 755. Write на владельца нужен, если тот надумает изменять или обновлять, на всякий случай короче.
Но!!!Portable programs should always set PROT_EXEC if they intend to execute code in the new mapping.
:)
man mmap
man dlopen
Спасибо за ответ. А можете плз дать ссылку на место откуда взята эта цитата:> Portable programs should always set PROT_EXEC if they intend to execute code
> in the new mapping.
> Спасибо за ответ. А можете плз дать ссылку на место откуда взята
> эта цитата:
>> Portable programs should always set PROT_EXEC if they intend to execute code
>> in the new mapping.man mmap ну или https://www.kernel.org/doc/man-pages/online/pages/man2/mmap....
А какая связь между флагом PROT_EXEC для mmap() и execute permissions у .so файла???
> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
> .so файла???Было бы логично выставлять PROT_EXEC только в случае, если есть execute permission у файла.
> Было бы логично выставлять PROT_EXEC только в случае, если есть execute permission
> у файла.Возможно, но в какой системе mmap() ведет себя так? т.е. не дает поставить PROT_EXEC при отсутствии прав на выполнения файла.
> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
> .so файла???Пиши, для совместимости. :)
dlopen() -> dlsym(), обе эти функции вызывают mmap.
mmap() должен использовать PROT_EXEC, для портабильности.
на некоторых системах, mmap c PROT_EXEC, библиотеку откроет и символы загрузит,
но выполнить не разрешит ядро, если у нее нету EXECUTE PERMISSIONS. (Подозреваю что это VAX/VMS|Alpha/VMS)
>> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
>> .so файла???
>
> #include <stdio.h>
> #include <dlfcn.h>
> mprotect(0x7f069c77b000, 4096, PROT_READ) = 0
> munmap(0x7f069c526000, 2449592) = 0
> ...Эм... Вы хотите сказать что если перед этим сделать chmod 644 /usr/lib64/tls/libm.so то что-то измениться?
>> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
>> .so файла???
> Пиши, для совместимости. :)Ой пока квоту тер вы пост поправили)))
Для совместимости с чем именно?PS:
Гугл находит что +x хотел hpux 98 года разлива, интересно есть ли более живые системы в которых ld.so или его аналог требует +x.
>>> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
>>> .so файла???
>> Пиши, для совместимости. :)
> Ой пока квоту тер вы пост поправили)))
> Для совместимости с чем именно?Вам накой это надо?
Для курсовой/дипломной - пиши 755, для совместимости и портабильности кода.
для себя, ставь 644, тока потом не удивляйся, если какая-то утиль проверяет наличие EXEC
>> Для совместимости с чем именно?
> Вам накой это надо?Для самобразования типа)
> Для курсовой/дипломной - пиши 755, для совместимости и портабильности кода.
> для себя, ставь 644, тока потом не удивляйся, если какая-то утиль проверяет
> наличие EXECТак я и прошу вас удивить меня назвав более менее живую систему для которой документировано такое поведение)
Что касается "какой-то утилиты", то на отсутствие +x например ругался ldd в линуксах времен 2.0 хотя ld.so при этом спокойно работал.Пока складывается впечатление что 755 для .so это анахронизм:)
> Пока складывается впечатление что 755 для .so это анахронизм:)Для Linux + x86 скорее всего.
А так как все ставят 755, никто толком и не знает, что будет если выставить 444 :)
>> Пока складывается впечатление что 755 для .so это анахронизм:)
> Для Linux + x86 скорее всего.Например для Free/OpenBSD 444 для .so штатно на всех архитектурах.
> А так как все ставят 755, никто толком и не знает, что
> будет если выставить 444 :)А ничего не будет, греп по сырцам ld-linux никаких плясок с пермишенами не находит)
> А ничего не будет, греп по сырцам ld-linux никаких плясок с пермишенами не находит)Если раздел примонтирован с "noexec", ядро само снимает PROT_EXEC у mmap()
http://lxr.linux.no/#linux+v2.6.37/mm/mmap.c#L976
# cp /lib64/libm-2.11.3.so /boot
# mount -o remount,ro,noexec /boot
#include <stdio.h>
#include <dlfcn.h>int main(void) {
double (*cosinus)(double);
void *math = dlopen("/boot/libm-2.11.3.so", RTLD_LAZY);cosinus = dlsym(math,"cos");
printf ("%f\n", (*cosinus)(-3.1415));dlclose(math);
return 0;
}# gcc test.c -ldl
# ./a.out
Ошибка сегментирования
> Более того, если раздел примонтирован с "noexec", ядро само снимает PROT_EXEC у
> mmap()
> http://lxr.linux.no/#linux+v2.6.37/mm/mmap.c#L976Более чего?
так же ведут себя и *bsd, но опять же, я не возьму в толк причем тут +x у .so?
> ... но опять же, я не возьму в толк причем тут +x у .so?Да никакого, если его нет, ядро добавит само,
если примонтировано с noexec уберёт его.http://lxr.linux.no/#linux+v2.6.37/mm/mmap.c#L966
Как итог треда, будем считать что на современных юниксах пофиг наличие/отсутсвие +x для .so :)ЗЫ: заглянул на debian - 644
> Как итог треда, будем считать что на современных юниксах пофиг наличие/отсутсвие +x
> для .so :)Типа того, ....
как я понял,
if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))
если есть флаг на чтение, и текущая реализация персонализации PROT_READ
предоставляет выполнение, то флаг PROT_READ равен PROT_READ + PROT_EXEC :)
Фуф... :)
Где current->personality не READ_IMPLIES_EXEC нинайду %-)
> ЗЫ: заглянул на debian - 644
> Где current->personality не READ_IMPLIES_EXEC нинайду %-)Если и найдется такая архитектура (я б смотрел в сторону свежих ARM), то 755 vs 644 явно будет не самой большой проблемой при портировании :)))
>> Где current->personality не READ_IMPLIES_EXEC нинайду %-)
> Если и найдется такая архитектура (я б смотрел в сторону свежих ARM),
> то 755 vs 644 явно будет не самой большой проблемой при
> портировании :)))Пока нашёл
IBM S390ARM говорит, что
Set READ_IMPLIES_EXEC if:
- the binary requires an executable stack
- we're running on a CPU which doesn't support NX.
if (cpu_architecture() < CPU_ARCH_ARMv6)
return error;
> Пока нашёл
> IBM S390http://www-03.ibm.com/systems/z/os/linux/support/lcds/toc.html
IBM вроде как дает шел на майнфреймах с линуксом, если не лень можно зарегистрироваться и посмотреть на такую экзотику :)