Warum können gemeinsam genutzte Bibliotheken ausgeführt werden?

59

Warum haben fast alle gemeinsam genutzten Bibliotheken in /usr/lib/das ausführbare Berechtigungsbit gesetzt? Ich sehe keinen Anwendungsfall für die Ausführung. Einige schaffen es, irgendeine Form von mainFunktion zum Drucken eines kurzen Urheberrechts- und Versionshinweises anzuschließen, aber viele tun dies nicht einmal und schlagen bei der Ausführung fehl.

Was bringt es also, dies xeinzustellen? Müssen das alle Bibliothekspaketierer tun? Was passiert, wenn ich dlopen()eine gemeinsam genutzte Bibliothek mit 0644Berechtigungen habe?

Tadeusz A. Kadłubowski
quelle
3
Auf welchem ​​Betriebssystem (wenn Linux, welche Distribution)? Auf Debian Squeeze, die einzigen ausführbaren gemeinsam genutzte Bibliotheken in /libund /usr/libsind libc und libpthread, und sowohl ein Copyright - Hinweis drucken , wenn sie ausgeführt.
Gilles 'SO- hör auf böse zu sein'
Wenn sie fehlerfrei sind, handelt es sich wahrscheinlich um kleinere Fehler. Ich würde sie melden, wenn Sie auf sie stoßen. Wie ist die Aufteilung?
Faheem Mitha
@Faheem: Das Fehlen eines main()Symbols als Einstiegspunkt ist kein kleiner Fehler, sondern eine grundlegende Wahl für das Design. Du hast meinen Standpunkt verfehlt.
Tadeusz A. Kadłubowski
2
@ Gilles: Ich habe 755 als Standardberechtigungsauswahl für Linux-Systeme der RedHat-Familie (Fedora und Centos) und für Solaris gesehen.
Tadeusz A. Kadłubowski
Die Prämisse dieser Frage ist nicht allgemeingültig. Tatsächlich ist es, wie oben erwähnt, für Debian Linux falsch; und auch false für FreeBSD und OpenBSD.
JdeBP

Antworten:

32

Unter HP-UX werden gemeinsam genutzte Bibliotheken mit mmap () in den Speicher abgebildet, und alle Speicherseiten im System verfügen über Schutzbits, die mit den Speicherseitenschutzmechanismen der Kernel- und Prozessorhardware gekoppelt sind. Damit der Inhalt einer beliebigen Speicherseite im System ausgeführt werden kann, muss auf dieser Seite PROT_EXEC festgelegt sein - eine nützliche Funktion, um Datenausführungs-Exploits zu verhindern.

Der Aufruf von mmap () verwendet die Berechtigungsbits in der zuzuordnenden Datei, um die Schutzbits der zugeordneten Speicherseiten zu definieren, die sie enthalten sollen: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (von sys / mman.h). Damit eine gemeinsam genutzte Bibliothek unter HP-UX verwendet werden kann, muss die Datei mit der gemeinsam genutzten Bibliothek über Ausführungsberechtigungen verfügen, um sicherzustellen, dass die zugeordnete Bibliothek auch über Ausführungsberechtigungen verfügt.

Eine gemeinsam genutzte Bibliothek mit Modus 644 auf einem HP-UX-System führt zu Core-Dumps.

Michael Pelletier
quelle
Möglicherweise verwenden auch andere Unix-Implementierungen diese Funktion.
Tadeusz A. Kadłubowski
> HP-UX (von "Hewlett Packard Unix") ist die proprietäre Implementierung des Unix-Betriebssystems von Hewlett Packard Enterprise, basierend auf UNIX System V
David 天宇 Wong,
Ein weiteres Beispiel ist, dass das Erstellen von RPM-Paketen mit separaten Debuginfo-Paketen Ausführungsberechtigungen für gemeinsam genutzte Bibliotheken erfordert, andernfalls überspringt find-debuginfo.sh deren Verarbeitung.
Domen Vrankar
20

Nicht ausführbare freigegebene Objekte funktionieren einwandfrei, Bibliotheken, die als ausführbar gekennzeichnet sind, können jedoch auch als eigenständige Programme ausgeführt werden.

Was bringt es also, dieses x zu setzen?

Keine, es sei denn, Sie möchten, dass sie Versions- oder andere Informationen veröffentlichen

Müssen das alle Bibliothekspaketierer tun?

Nein

Was passiert, wenn ich eine gemeinsam genutzte Bibliothek mit 0644-Berechtigungen öffne ()?

Sie erhalten ein neues Shared Object-Handle (solange die Datei lesbar ist usw.) ... das Exec-Bit hat keinen Einfluss darauf


Warum in Bibliotheken, die nicht als eigenständige ausführbare Dateien verwendet werden können, immer noch das Ausführungsbit gesetzt ist: Dies ist wahrscheinlich nur ein Artefakt des verwendeten Build-Systems oder Link-Skripts.


Beispielausgabe, nur als Referenz:

$ /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/>.
Nutzlos
quelle
11
Die meisten .so-Bibliotheken sind einfach fehlerfrei, da sie keinen normalen main()Einstiegspunkt haben. Libc ist ein Ausreißer. Die Entwickler haben diesen Hinweis als zusätzliche Funktionalität ausgeführt. Einfache chmod a+xvon jeder anderen Bibliothek wird Ihnen diese Funktionalität nicht geben. Ich sehe immer noch nicht den Punkt der Einstellung +xfür alle Bibliotheken.
Tadeusz A. Kadłubowski
Einverstanden, und wahrscheinlich nur diejenigen, .sodie ausgeführt werden können, sollten als solche gekennzeichnet werden. Ich werde meine Antwort ändern, um zu vermeiden, dass alles, was mit dem Exec-Bit gesetzt ist, wirklich eine eigenständige ausführbare Datei ist.
Nutzlos
5
Der Befehl "ldd" ist normalerweise ein sh-Skript, das den Dynamic Linker, ld-linux-x86-64.so.2 oder /lib/ld-linux.so.2 oder ein solches aufruft. Der dynamische Linker ist immer ein gemeinsames Objekt.
Bruce Ediger