Podobnie jak odpowiedział Oliver Matthews, LD_PRELOAD
jest wyłączone zarówno dla plików binarnych Setuid, jak i dla plików binarnych posiadających możliwości plików, ze względów bezpieczeństwa.
wstępnego ładowania biblioteki jednocześnie umożliwiając możliwości plików, masz dwie opcje:
Ustaw fabrycznie biblioteka setuid korzeń
(Linux dynamiczny linker ld.so
ma wczytywać biblioteki nawet setuid/plików -capability obsługą plików binarnych, jeśli biblioteki są root i oznaczony setuid.)
Użyj setuid korzeniowy opakowanie
Opakowanie uzyskuje pełne uprawnienia roota (zarówno rzeczywisty, jak i efektywny identyfikator użytkownika i grupy zero) i przechowuje oryginalny rzeczywisty identyfikator użytkownika i grupy do np. Zmienne środowiska).
Wstępnie załadowana biblioteka ma konstruktor, np.
static void my_library_init(void) __attribute__((constructor));
static void my_library_init(void)
{
/* ... */
}
który jest automatycznie prowadzony przed main()
(ale może po innych konstruktorów w innych bibliotekach fabrycznie lub w bibliotekach że zainstalowane fabrycznie biblioteki zależą).
Ten konstruktor uzyskuje pożądane właściwości, wyznaczone za pomocą zmiennych środowiskowych (getenv()
, cap_from_text()
) lub sam plik wykonywalny pliku binarnego (cap_from_file("/proc/self/exe")
).
Konstruktor musi tymczasowo użyć prctl(PR_SET_KEEPCAPS, 1)
zachować możliwości nad zmianą tożsamości i zachować CAP_SETUID
i CAP_SETGID
możliwości, aby móc zmienić tożsamość od nasady do użytkownika i grupy określonej w zmiennych środowiskowych, przed ograniczając się do ostatecznej możliwości zestaw.
Obie opcje mają oczywiste względy bezpieczeństwa. Zalecam sprawdzenie poprawności (i wyczyszczenie LD_PRELOAD
) we wstępnie załadowanym konstruktorze biblioteki. Jeśli cokolwiek wydaje się podejrzane, użyj _exit()
, aby natychmiast przerwać proces.
Ogólnie rzecz biorąc, zalecam pierwszą opcję prostoty (zarówno problemy z implementacją, jak i bezpieczeństwem), ale jeśli jest jakiś powód, którego nie można użyć, mogę dostarczyć kod koncepcyjny dla drugiego przypadku. (Sprawdziłem obie opcje działa na systemie Ubuntu 12.04.2 LTS z jądrem x86-64 w wersji 3.8.0-27, używając systemu plików ext4.)
Mam nadzieję, że to pomoże.
Zobacz [to pytanie] (http://stackoverflow.com/questions/9843178/linux-capabilities-setcap-seems-to-disable-ld-library-path) dla odpowiedzi. – scai
Możesz napisać program otoki dla docelowego pliku binarnego. Będzie mniej więcej musiało być ustawione na root. Spowoduje to rozwidlenie procesu potomnego, a następnie wykonanie docelowego pliku binarnego (z zestawem 'LD_PRELOAD'); docelowy plik binarny nie ma ustawionych żadnych możliwości plików. Twoja biblioteka wstępnego ładowania komunikuje się następnie z procesem podrzędnym (za pośrednictwem np. Pary gniazd, powiedzmy, fd 3), z procesem podrzędnym, przyznając niezbędne możliwości procesowi docelowemu, a następnie kończąc (oraz bibliotekę wstępnego ładowania zbierającego dziecko). Daj mi znać, jeśli chcesz mieć przykład. –
@NominalAnimal Cieszę się, że możesz pokazać mi przykład. –