Perché sono eseguibili le librerie condivise?


59

Perché quasi tutte le librerie condivise /usr/lib/hanno impostato il bit di autorizzazione eseguibile? Non vedo alcun caso d'uso per eseguirli. Alcuni riescono ad agganciare una qualche forma di mainfunzione per stampare una breve nota sul copyright e sulla versione, ma molti non lo fanno nemmeno e segfault al momento dell'esecuzione.

Quindi, qual è il punto di impostare questo x? Tutti i pacchetti di librerie devono farlo? Cosa succederà se avessi dlopen()una libreria condivisa con 0644autorizzazioni?


3
Su quale sistema operativo (se Linux, quale distribuzione)? Su Debian squeeze, le uniche librerie condivise eseguibili in /libe /usr/libsono libc e libpthread ed entrambe stampano un avviso sul copyright quando eseguite.
Gilles 'SO- smetti di essere malvagio' il

Se segfault, sono probabilmente bug minori. Li segnalerei se li incontrassi. Qual è la distribuzione?
Faheem Mitha,

@Faheem: non avere un main()simbolo come punto di ingresso non è un bug minore, ma una scelta progettuale fondamentale. Ti sei perso il punto.
Tadeusz A. Kadłubowski,

2
@Gilles: ho visto 755 come una scelta di autorizzazione predefinita sui sistemi Linux della famiglia RedHat (Fedora e Centos) e su Solaris.
Tadeusz A. Kadłubowski,

La premessa di questa domanda non è universalmente vera. In effetti è falso, come notato sopra, per Debian Linux; e anche falso per FreeBSD e OpenBSD.
JdeBP,

Risposte:


32

Sotto HP-UX, le librerie condivise vengono mappate nella memoria usando mmap () e tutte le pagine di memoria nel sistema hanno bit di protezione che sono accoppiati con i meccanismi di protezione delle pagine di memoria dell'hardware del kernel e del processore. Per eseguire il contenuto di qualsiasi pagina di memoria sul sistema, quella pagina deve avere PROT_EXEC impostato - una funzione utile per prevenire exploit di esecuzione dei dati.

La chiamata mmap () utilizza i bit di autorizzazione sul file che sta per mappare per definire i bit di protezione delle pagine di memoria mappate che devono contenerlo: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (da sys / mman.h). pertanto, affinché una libreria condivisa sia utilizzabile su HP-UX, il file contenente la libreria condivisa deve disporre delle autorizzazioni di esecuzione per assicurare che anche la libreria mappata disponga delle autorizzazioni di esecuzione.

Una libreria condivisa con la modalità 644 su un sistema HP-UX provocherà i core dump.


Probabilmente anche altre implementazioni Unix usano questa funzione.
Tadeusz A. Kadłubowski,

> HP-UX (da "Hewlett Packard Unix") è l'implementazione proprietaria di Hewlett Packard Enterprise del sistema operativo Unix, basata su UNIX System V
David 天宇 Wong,

Un altro esempio è che la creazione di pacchetti rpm con pacchetti debuginfo separati richiede autorizzazioni di esecuzione su librerie condivise, altrimenti find-debuginfo.sh salta la loro elaborazione.
Domen Vrankar,

20

Gli oggetti condivisi non eseguibili funzionano correttamente, ma le librerie contrassegnate come eseguibili possono anche essere eseguibili come programmi autonomi.

Quindi, qual è il punto di impostare questa x?

Nessuno, a meno che non si desideri che emettano versione o altre informazioni

Tutti i pacchetti di librerie devono farlo?

No

Cosa succederà se dlopen () una libreria condivisa con autorizzazioni 0644?

Otterrai un nuovo handle di oggetto condiviso (fintanto che il file è leggibile ecc.) ... il bit exec non influisce su questo


Per quanto riguarda il motivo per cui le librerie che non sono utilizzabili come eseguibili standalone hanno ancora impostato il bit exec: questo è probabilmente solo un artefatto del sistema di compilazione o dello script di collegamento utilizzato.


esempio di output, solo per riferimento:

$ /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/>.

11
La maggior parte delle librerie .so sono semplicemente segfault perché non hanno nulla che assomigli al normale main()punto di ingresso. Libc è un outlier. I suoi sviluppatori hanno fatto questa nota come una funzionalità aggiuntiva. Semplice chmod a+xdi qualsiasi altra libreria non ti darà questa funzionalità` Non vedo ancora il punto di impostazione +xper tutte le librerie.
Tadeusz A. Kadłubowski,

D'accordo, e probabilmente solo quelli .soche possono essere eseguiti dovrebbero essere contrassegnati come tali. Modificherò la mia risposta per evitare di implicare che tutto con il set di bit exec è davvero un eseguibile autonomo.
Inutile

5
Il comando "ldd" è in genere uno script sh che richiama il linker dinamico, ld-linux-x86-64.so.2 o /lib/ld-linux.so.2 o alcuni di questi. Il linker dinamico è sempre un oggetto condiviso.
Bruce Ediger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.