2016-03-16 15 views
6

Próbuję wprowadzić wartość SO do procesu, który rozpoczyna korzystanie z systemd init systemu (przy użyciu LD_PRELOAD), ale nie jest ładowany do nowego procesu.LD_PRELOAD nie załadowano na systemd

I przestrzegane podstawowe SO (unrandom.c):

int rand(){ 
    return 42; //the most random number in the universe 
} 

z linii poleceń:

gcc -shared -fPIC unrandom.c -o unrandom.so 

Zmieniłem plik .service obejmuje:

Environment="LD_PRELOAD=/tmp/unrandom.so" 

Po uruchomieniu usługi istnieje zmienna środowiskowa LD_PRELOAD w procesie, ale SO nie wprowadza iniekcji

cat /proc/<PID>/maps 

Czy brakuje mi czegoś?

Moja maszyna jest RHEL7

+0

Czy to działa, jeśli uciekniesz z powłoki? – hek2mgl

+0

tak, jeśli używam polecenia bezpośrednio z powłoki, to działa ... –

+0

Musiałbym to przetestować. Mogę dać ci informację zwrotną wieczorem. Przy okazji, dziwny pomysł! :) Czy mogę zapytać, dlaczego to robisz? – hek2mgl

Odpowiedz

2

procesy Setuid ograniczyć wykorzystanie LD_PRELOAD (i kilka innych env. Zmiennych) ze względów bezpieczeństwa.

Załadowana biblioteka musi być podana tylko z nazwy i znajdować się w jednym z katalogów wymienionych w /etc/ld.so.conf (patrz np. this link). Na przykład w systemach opartych na Debianie

sudo cp library.so /usr/lib/x86_64-linux-gnu 
LD_PRELOAD=library.so daemon 

Innym podejściem jest umieścić pełną ścieżkę do biblioteki /etc/ld.so.preload:

sudo echo path/to/library.so >> /etc/ld.so.preload 

ale wtedy to będzie z preinstalowanym wszystkich nowych procesów (który ma dużą szansę złamania systemu, jeśli nie jesteś bardzo ostrożny).

+0

Jakie są dokładne kroki wstępnego ładowania? – Velkan

+0

@Velkan: zaktualizowana odpowiedź. – yugr

Powiązane problemy