Pourquoi les bibliothèques partagées sont-elles exécutables?

59

Pourquoi presque toutes les bibliothèques partagées /usr/lib/ont-elles le bit d'autorisation d'exécution exécutable? Je ne vois aucun cas d'utilisation pour les exécuter. Certains parviennent à brancher une mainfonction quelconque pour imprimer une note de copyright et de version abrégée, mais beaucoup ne le font même pas et commettent une erreur de segmentation lors de l'exécution.

Alors, quel est le point de régler cela x? Tous les utilisateurs de la bibliothèque doivent-ils le faire? Que se passera-t-il si je suis dlopen()une bibliothèque partagée qui a des 0644autorisations?

Tadeusz A. Kadłubowski
la source
3
Sur quel OS (si Linux, quelle distribution)? Sur Debian Squeeze, les seules bibliothèques partagées exécutables dans /libet /usr/libsont libc et libpthread, et les deux affichent un avis de droit d’auteur lorsqu’elles sont exécutées.
Gilles 'SO- arrête d'être méchant'
S'ils segfèrent, ce sont probablement des bugs mineurs. Je les signalerais si vous les rencontriez. Quelle est la distribution?
Faheem Mitha le
@Faheem: Ne pas avoir de main()symbole comme point d'entrée n'est pas un bug mineur, mais un choix de conception fondamental. Vous avez manqué mon point.
Tadeusz A. Kadłubowski
2
@Gilles: J'ai vu 755 comme choix d'autorisation par défaut sur les systèmes Linux de la famille RedHat (Fedora et Centos) et sur Solaris.
Tadeusz A. Kadłubowski
La prémisse de cette question n'est pas universellement vraie. En fait, comme indiqué ci-dessus, il est faux pour Debian Linux; et aussi false pour FreeBSD et pour OpenBSD.
JdeBP

Réponses:

32

Sous HP-UX, les bibliothèques partagées sont mappées dans la mémoire à l'aide de mmap (). Toutes les pages de mémoire du système ont des bits de protection couplés aux mécanismes de protection des pages de mémoire du noyau et du processeur. Pour exécuter le contenu de toute page de mémoire sur le système, PROT_EXEC doit être défini sur cette page - une fonctionnalité utile pour empêcher les exploitations d’exécution de données.

L'appel mmap () utilise les bits d'autorisation du fichier qu'il est sur le point de mapper pour définir les bits de protection des pages de mémoire mappées devant le contenir: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (à partir de sys / mman.h). Par conséquent, pour qu'une bibliothèque partagée puisse être utilisée sur HP-UX, le fichier contenant la bibliothèque partagée doit disposer des autorisations d'exécution afin de garantir que la bibliothèque mappée dispose également de l'autorisation d'exécution.

Une bibliothèque partagée avec le mode 644 sur un système HP-UX provoquera des vidages mémoire.

Michael Pelletier
la source
Peut-être d'autres implémentations Unix utilisent-elles également cette fonctionnalité.
Tadeusz A. Kadłubowski
> HP-UX (de "Hewlett Packard Unix") est l'implémentation propriétaire du système d'exploitation Unix de Hewlett Packard Enterprise, basée sur UNIX System V
David 天宇 Wong
Un autre exemple est que la création de packages rpm avec des packages debuginfo distincts nécessite des autorisations d'exécution sur les bibliothèques partagées, sinon find-debuginfo.sh ignore de les traiter.
Domen Vrankar
20

Les objets partagés non exécutables fonctionnent correctement, mais les bibliothèques marquées comme exécutables peuvent également être exécutées en tant que programmes autonomes.

Alors, quel est le point de régler ce x?

Aucun, sauf si vous souhaitez qu'ils émettent une version ou d'autres informations

Tous les utilisateurs de la bibliothèque doivent-ils le faire?

Non

Qu'est-ce qui se passera si je dlopen () une bibliothèque partagée qui a des autorisations 0644?

Vous obtiendrez un nouveau descripteur d'objet partagé (tant que le fichier est lisible, etc.) ... le bit exec n'affecte pas ceci


Quant aux raisons pour lesquelles les bibliothèques qui ne sont pas utilisables en tant qu’exécutables autonomes ont toujours le bit d’exécution défini: c’est probablement un artefact du système de construction ou du script de lien utilisé.


exemple de sortie, juste pour référence:

$ /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.14 system on 2012-04-19.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
Inutile
la source
11
La plupart des bibliothèques .so se contentent simplement de commettre une erreur de segmentation car elles n'ont rien qui ressemble à un main()point d'entrée normal . Libc est un cas particulier. Ses développeurs ont fait cette note comme une fonctionnalité supplémentaire. Simple chmod a+xde toute autre bibliothèque ne vous donnera pas cette fonctionnalité. Je ne vois toujours pas l'intérêt de configurer +xtoutes les bibliothèques.
Tadeusz A. Kadłubowski
D'accord, et probablement seulement ceux .soqui peuvent être exécutés doivent être marqués comme tels. Je modifierai ma réponse pour éviter d’impliquer que tout ce qui est défini avec le bit d’exécution est en réalité un exécutable autonome.
Inutile
5
La commande "ldd" est généralement un script sh qui appelle l'éditeur de liens dynamique, ld-linux-x86-64.so.2, ou /lib/ld-linux.so.2 ou autre. L'éditeur de liens dynamique est toujours un objet partagé.
Bruce Ediger