Por que bibliotecas compartilhadas ou não devem ser executáveis (por exemplo, Red Hat vs Debian)?

6

Isso é quase uma cópia de " Por que os arquivos .so são executáveis? ".

Eu notei que nas bibliotecas compartilhadas dos sistemas baseados no Red Hat tem permissão de execução, mas no Debian eles não.

Logicamente, as bibliotecas de fragmentos não são executáveis, a menos que sejam por design (por meio de links inteligentes). No entanto, o código que eles contêm é executado. Então é um pouco uma área cinzenta.

Existe um interessante artic

A questão vinculada sugere que é por razões históricas e também que é um requisito em alguns sistemas operacionais baseados em Unix, como o HP-UX.

Eu gostaria de entender o motivo pelo qual o Debian e a Red Hat diferem aqui em um pouco mais de profundidade.

Qual sistema mudou e por quê?

Qual é a situação no BSD?

Há alguma possível consideração de segurança?

Atualização: 26-out-2017

Aqui está o que a Red Hat tinha a dizer sobre o assunto (ênfase minha):

Setting an executable bit on libraries does not have any effect other than they could be executed from a shell. The shared libraries in Linux are in a format called ELF, which stands for Executable and Linkable Format. This is the format for both executable files and shared libraries, so that is the reason why libraries are marked with an executable bit. It is worth noting that GCC creates shared libraries with the executable bit set by default.

Removing the executable bit does not have any side effects (other than not being able to run certain libraries to display their information, such as libc), since the dynamic loader does not care about the libraries' permissions: it instead maps parts of the library to parts of memory, and those that require execution are mapped to a memory area previously marked as PROT_EXEC.

Assim, como apontado, é a política Debian que tem bibliotecas instaladas como não executáveis. Eu suponho que o gcc (ou melhor, ld) sendo independente de plataforma erra por precaução, tornando as bibliotecas executáveis por padrão?

Há um artigo interessante aqui: link

Veja também link

    
por Bruce Adams 24.10.2017 / 19:33

1 resposta

4

O Debian mudou isso em 1997, na versão 2.2 da Política (veja # 7129 , embora isso não dê muitos detalhes e eu não tenha encontrado nenhuma outra discussão); a razão é dada assim nas versões atuais da Política :

Shared libraries should not be installed executable, since the dynamic linker does not require this and trying to execute a shared library usually results in a core dump.

Por isso, trata-se de gerenciar as expectativas e o princípio da menor surpresa: não marque algo como executável se a execução não for útil. No Debian e suas derivadas, as únicas bibliotecas que deveriam ser executáveis são aquelas que fazem algo sensato quando executadas (como a biblioteca C, libpthread e, é claro, o vinculador dinâmico).

No FreeBSD e no OpenBSD, pelo menos, as bibliotecas compartilhadas do sistema operacional não são executáveis. No OpenBSD isto também é verdade para bibliotecas compartilhadas em /usr/local . No FreeBSD, bibliotecas compartilhadas em /usr/local de portas e pacotes são geralmente executáveis. (Agradecimentos a JdeBP pelo informações relacionadas ao BSD .)

No Linux, não creio que haja alguma consideração de segurança em particular (pelo menos, não em um sistema Linux básico), porque executar uma biblioteca não requer que seu bit executável seja definido (você pode executá-la usando o linker dinâmico).

    
por 24.10.2017 / 20:34