2016-03-16 12 views
6

Sto cercando di iniettare un SO in un processo che inizia a usare systemd init system (utilizzando LD_PRELOAD), ma non viene caricato nel nuovo processo.LD_PRELOAD non caricato su systemd

ho rispettato un SO di base (unrandom.c):

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

con la riga di comando:

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

ho cambiato il file .Service per includere:

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

Dopo aver avviato il servizio, la variabile di ambiente LD_PRELOAD esiste nel processo, ma la SO non viene iniettata

cat /proc/<PID>/maps 

Mi manca qualcosa?

La mia macchina è RHEL7

+0

Funziona se si esegue da una shell? – hek2mgl

+0

sì, se sto eseguendo il comando direttamente dalla shell funziona ... –

+0

Avrei bisogno di testarlo. Posso darti un feedback la sera. Btw, strana idea! :) Posso chiederti perché lo stai facendo? – hek2mgl

risposta

2

processi setuid limitano l'utilizzo di LD_PRELOAD (e qualche altra ENV. Variabili) per motivi di sicurezza.

La libreria caricata deve essere specificata solo tramite il nome e deve trovarsi in una delle directory elencate in /etc/ld.so.conf (vedere ad esempio this link). Ad esempio, su sistemi basati su Debian

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

Un altro approccio è quello di mettere il percorso completo di biblioteca per /etc/ld.so.preload:

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

ma allora sarà precaricato a tutti i nuovi processi (che ha una alta probabilità di rompere il tuo sistema se non sei estremamente attento).

+0

Quindi quali sono i passaggi precisi per il precaricamento? – Velkan

+0

@Velkan: risposta aggiornata. – yugr

Problemi correlati