Dlaczego biblioteki współdzielone są wykonywalne?


59

Dlaczego prawie wszystkie udostępnione biblioteki /usr/lib/mają ustawiony bit uprawnień do wykonywania? Nie widzę żadnego przypadku użycia do ich wykonania. Niektórym udaje się podłączyć jakąś mainfunkcję, aby wydrukować krótką notatkę o prawach autorskich i wersji, ale wielu nawet tego nie robi i nie działa poprawnie po wykonaniu.

Więc po co to ustawiać x? Czy muszą to robić wszystkie programy pakujące biblioteki? Co się stanie, jeśli będę dlopen()mieć bibliotekę współdzieloną z 0644uprawnieniami?


3
Na jakim systemie operacyjnym (jeśli Linux, jaka dystrybucja)? W przypadku ściśnięcia Debiana jedynymi wykonywalnymi bibliotekami współdzielonymi w /libi /usr/libsą libc i libpthread, a po uruchomieniu oba drukują informację o prawach autorskich.
Gilles

Jeśli się zepsują, prawdopodobnie są to drobne błędy. Zgłosiłbym je, jeśli je spotkasz. Jaka jest dystrybucja?
Faheem Mitha

@ Faheem: Brak main()symbolu jako punktu wejścia nie jest drobnym błędem, ale podstawowym wyborem projektowym. Przegapiłeś mój punkt.
Tadeusz A. Kadłubowski

2
@Gilles: Widziałem 755 jako domyślny wybór uprawnień w systemach Linux z rodziny RedHat (Fedora i Centos) oraz w Solarisie.
Tadeusz A. Kadłubowski

Założenie tego pytania nie jest powszechnie prawdziwe. W rzeczywistości jest to fałsz, jak wspomniano powyżej, w przypadku Debiana Linux; a także false dla FreeBSD i OpenBSD.
JdeBP

Odpowiedzi:


32

W systemie HP-UX biblioteki współdzielone są mapowane do pamięci za pomocą mmap (), a wszystkie strony pamięci w systemie mają bity ochronne, które są sprzężone z mechanizmami ochrony stron pamięci jądra i procesora. Aby wykonać zawartość dowolnej strony pamięci w systemie, strona ta musi mieć ustawiony PROT_EXEC - przydatną funkcję zapobiegającą exploitom wykonywania danych.

Wywołanie mmap () używa bitów uprawnień do pliku, który ma zostać zmapowany, aby zdefiniować bity ochrony mapowanych stron pamięci, które mają go zawierać: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (z sys / mman.h). więc aby biblioteka współdzielona mogła być używana w systemie HP-UX, plik zawierający bibliotekę współdzieloną musi mieć uprawnienia do wykonywania, aby mieć pewność, że odwzorowana biblioteka ma również uprawnienia do wykonywania.

Biblioteka współdzielona z trybem 644 w systemie HP-UX spowoduje zrzuty pamięci.


Możliwe, że inne implementacje Uniksa również korzystają z tej funkcji.
Tadeusz A. Kadłubowski

> HP-UX (z „Hewlett Packard Unix”) jest zastrzeżoną przez Hewlett Packard Enterprise implementacją systemu operacyjnego Unix opartą na systemie UNIX V
David 天宇 Wong

Innym przykładem jest to, że tworzenie pakietów RPM z oddzielnymi pakietami debuginfo wymaga uprawnień do wykonywania w bibliotekach współdzielonych, w przeciwnym razie find-debuginfo.sh pominie ich przetwarzanie.
Domen Vrankar,

20

Niewykonywalne obiekty współdzielone działają dobrze, ale biblioteki oznaczone jako pliki wykonywalne mogą być również uruchamiane jako samodzielne programy.

Po co więc ustawiać to x?

Brak, chyba że chcesz, aby emitowały wersję lub inne informacje

Czy muszą to robić wszystkie programy pakujące biblioteki?

Nie

Co się stanie, jeśli dlopen () udostępnisz bibliotekę, która ma uprawnienia 0644?

Otrzymasz nowy uchwyt obiektu współdzielonego (o ile plik jest czytelny itp.) ... bit exec nie ma na to wpływu


Co do tego, dlaczego biblioteki, które nie są użyteczne jako samodzielne pliki wykonywalne, nadal mają ustawiony bit exec: jest to prawdopodobnie tylko artefakt systemu kompilacji lub użytego skryptu łącza.


przykładowe dane wyjściowe, tylko w celach informacyjnych:

$ /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
Większość bibliotek .so po prostu segreguje, ponieważ nie mają niczego przypominającego normalny main()punkt wejścia. Libc jest wartością odstającą. Jego twórcy zrobili tę notatkę jako dodatkową funkcjonalność. Prosta chmod a+xz jakiejkolwiek innej biblioteki nie zapewni tej funkcji. „Nadal nie widzę sensu ustawiania +xdla wszystkich bibliotek.
Tadeusz A. Kadłubowski

Uzgodnione i prawdopodobnie tylko te, .soktóre można wykonać, należy oznaczyć jako takie. Zmienię swoją odpowiedź, aby uniknąć sugerowania, że ​​wszystko z zestawem bitów wykonawczych jest tak naprawdę samodzielnym plikiem wykonywalnym.
Bezużyteczne

5
Polecenie „ldd” jest zwykle skryptem sh, który wywołuje dynamiczny linker, ld-linux-x86-64.so.2 lub /lib/ld-linux.so.2 lub coś w tym rodzaju. Dynamiczny linker jest zawsze obiektem współdzielonym.
Bruce Ediger,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.