URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8987
[ Назад ]

Исходное сообщение
"Shared libraries permissions"

Отправлено dimonna , 10-Янв-11 16:06 
Здравствуйте,

Разыскивается спецификация, определяющая какие права доступа должны быть у shared library (.so).

Заранее огромное спасибо всем кто сможет направить по правильному пути.

Дмитрий


Содержание

Сообщения в этом обсуждении
"Shared libraries permissions"
Отправлено pavlinux , 14-Янв-11 17:28 
> Здравствуйте,
> Разыскивается спецификация, определяющая какие права доступа должны быть у 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


"Shared libraries permissions"
Отправлено dimonna , 25-Янв-11 10:02 
Спасибо за ответ. А можете плз дать ссылку на место откуда взята эта цитата:

> Portable programs should always set PROT_EXEC if they intend to execute code
> in the new mapping.


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 14:26 
> Спасибо за ответ. А можете плз дать ссылку на место откуда взята
> эта цитата:
>> 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....


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 14:45 
А какая связь между флагом PROT_EXEC для mmap() и execute permissions у .so файла???

"Shared libraries permissions"
Отправлено ACCA , 25-Янв-11 14:56 
> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
> .so файла???

Было бы логично выставлять PROT_EXEC только в случае, если есть execute permission у файла.


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 15:04 
> Было бы логично выставлять PROT_EXEC только в случае, если есть execute permission
> у файла.

Возможно, но в какой системе mmap() ведет себя так? т.е. не дает поставить PROT_EXEC при отсутствии прав на выполнения файла.


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 15:32 
> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
> .so файла???

Пиши, для совместимости. :)


dlopen() -> dlsym(), обе эти функции вызывают mmap.
mmap() должен использовать PROT_EXEC, для портабильности.
на некоторых системах, mmap c PROT_EXEC, библиотеку откроет и символы загрузит,
но выполнить не разрешит ядро, если у нее нету EXECUTE PERMISSIONS. (Подозреваю что это VAX/VMS|Alpha/VMS)


      


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 15:39 
>> А какая связь между флагом 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 то что-то измениться?


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 15:44 
>> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
>> .so файла???
> Пиши, для совместимости. :)

Ой пока квоту тер вы пост поправили)))
Для совместимости с чем именно?

PS:
Гугл находит что +x хотел hpux 98 года разлива, интересно есть ли более живые системы в которых ld.so или его аналог требует +x.


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 15:59 
>>> А какая связь между флагом PROT_EXEC для mmap() и execute permissions у
>>> .so файла???
>> Пиши, для совместимости. :)
> Ой пока квоту тер вы пост поправили)))
> Для совместимости с чем именно?

Вам накой это надо?

Для курсовой/дипломной - пиши 755, для совместимости и портабильности кода.
для себя, ставь 644, тока потом не удивляйся, если какая-то утиль проверяет наличие EXEC


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 16:12 
>> Для совместимости с чем именно?
> Вам накой это надо?

Для самобразования типа)

> Для курсовой/дипломной - пиши 755, для совместимости и портабильности кода.
> для себя, ставь 644, тока потом не удивляйся, если какая-то утиль проверяет
> наличие EXEC

Так я и прошу вас удивить меня назвав более менее живую систему для которой документировано такое поведение)
Что касается "какой-то утилиты", то на отсутствие +x например ругался ldd в линуксах времен 2.0 хотя ld.so при этом спокойно работал.

Пока складывается впечатление что 755 для .so это анахронизм:)



"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 16:19 
> Пока складывается впечатление что 755 для .so это анахронизм:)

Для Linux + x86 скорее всего.

А так как все ставят 755, никто толком и не знает, что будет если выставить 444 :)



"Shared libraries permissions"
Отправлено guest , 25-Янв-11 16:29 
>> Пока складывается впечатление что 755 для .so это анахронизм:)
> Для Linux + x86 скорее всего.

Например для Free/OpenBSD 444 для .so штатно на всех архитектурах.

> А так как все ставят 755, никто толком и не знает, что
> будет если выставить 444 :)

А ничего не будет, греп по сырцам ld-linux никаких плясок с пермишенами не находит)


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 16:45 
> А ничего не будет, греп по сырцам 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
Ошибка сегментирования


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 16:53 
> Более того, если раздел примонтирован с "noexec", ядро само снимает PROT_EXEC у
> mmap()
> http://lxr.linux.no/#linux+v2.6.37/mm/mmap.c#L976

Более чего?
так же ведут себя и *bsd, но опять же, я не возьму в толк причем тут +x у .so?


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 17:04 
> ... но опять же, я не возьму в толк причем тут +x у .so?

Да никакого, если его нет, ядро добавит само,
если примонтировано с noexec уберёт его.

http://lxr.linux.no/#linux+v2.6.37/mm/mmap.c#L966



"Shared libraries permissions"
Отправлено guest , 25-Янв-11 17:15 
Как итог треда, будем считать что на современных юниксах пофиг наличие/отсутсвие +x для .so :)

ЗЫ: заглянул на debian - 644


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 17:21 
> Как итог треда, будем считать что на современных юниксах пофиг наличие/отсутсвие +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


"Shared libraries permissions"
Отправлено guest , 25-Янв-11 17:27 
> Где current->personality не READ_IMPLIES_EXEC нинайду %-)

Если и найдется такая архитектура (я б смотрел в сторону свежих ARM), то 755 vs 644 явно будет не самой большой проблемой при портировании :)))


"Shared libraries permissions"
Отправлено pavlinux , 25-Янв-11 18:05 
>> Где current->personality не READ_IMPLIES_EXEC нинайду %-)
> Если и найдется такая архитектура (я б смотрел в сторону свежих ARM),
> то 755 vs 644 явно будет не самой большой проблемой при
> портировании :)))

Пока нашёл
IBM S390

ARM говорит, что

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;
  


"Shared libraries permissions"
Отправлено guest , 26-Янв-11 10:34 
> Пока нашёл
> IBM S390

http://www-03.ibm.com/systems/z/os/linux/support/lcds/toc.html
IBM вроде как дает шел на майнфреймах с линуксом, если не лень можно зарегистрироваться и посмотреть на такую экзотику :)