2011-06-27 21 views
7

Używam Pythona z włączoną opcją CAP CAPETERAW. Mój skrypt python importuje wspólną bibliotekę, która ma $ ORIGIN w swojej RPATH. Ponieważ mój python jest teraz aplikacją suid, $ ORIGIN nie jest oceniany, a biblioteka nie ładuje się poprawnie (jest to spowodowane security leak found in glibc). Czy istnieje sposób, aby powiedzieć linkerowi, że moja ścieżka biblioteki jest bezpieczna i mimo to załadować bibliotekę?

Jeszcze kilka uwag:

  1. Muszę tylko tę funkcję w fazie rozwojowej. Nie szukam rozwiązania do produkcji.
  2. Podczas pracy jako root wszystko działa.
  3. Nie chcę pracować jako root.

Dzięki Dave

+0

@Amir Rachum, uruchomić program po wykonaniu 'eksportowej LD_LIBRARY_PATH =" $ LD_LIBRARY_PATH:/ścieżka/do/yo urlibrary "' – totti

Odpowiedz

1

Próbowałaś sudo?

Zamiast $ ORIGIN, używaj stałych ścieżek podczas programowania, ponieważ będą one działać w programach setuid. Nie zmieniaj głównego procesu budowania, wystarczy użyć patchelf, aby ustawić ścieżkę do tego, czego potrzebujesz. Można zrobić skrypt, który robi coś takiego:

ln=`readelf -d |grep RPATH` 
IFS=: 
set -- $ln 
newrpath=`echo $2 |sed 's/\$ORIGIN/\/devel\/myprog\/lib/'` 
patchelf --set-rpath newrpath myprogram 

Następnie plik binarny nie będą już szukać $ ORIGIN /../ lib ale /devel/myprog/lib/../lib

+0

sudo działa, ale nie chcę działać jako root. Myślałem o używaniu patchelf podczas mojej kompilacji, ale to jest preety hacky. czy nie ma czegoś takiego jak narzędzie do gry w Solaris? to byłoby idealne. –

+0

@DaveyJones, to chyba za mało za późno ... ale widziałem przykłady, w których plik tekstowy ma nazwę taką jak 'libblah.so', ale zamiast być binarnym wydaje się przypominać' ld.config 'skrypty podobne do Solaris. –

2

Można spróbuj jednego z nich. Należy wziąć pod uwagę, że <path-to-mylib> jest bezwzględną ścieżką po rozwiązaniu referencji rpath dla $ORIGIN.

  1. Ponownie uruchom ldconfig po informując go, gdzie znaleźć biblioteki

    $ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf 
    $ ldconfig -v 
    
  2. Jeśli uruchomiony rzeczy jak korzeń nie jest opcją, LD_LIBRARY_PATH eksport z odpowiednim katalogu na każdą realizacją procesu

    $ echo "export LD_LIBRARY_PATH=<path-to-mylib>" >> ~/.bashrc 
    $ export LD_LIBRARY_PATH=<path-to-mylib> 
    $ # then run your stuff...