2012-02-10 18 views
6

Sto tentando di utilizzare LD_PRELOAD per precaricare una libreria con un'applicazione con autorizzazioni setuid. Provato LD_PRELOAD in un primo momento, e sembrava come se fosse stato ignorato con il file binario setuid, anche se funzionava quando ho provato con altri come ls, dir eccLD_PRELOAD con binario setuid

Dalla documentazione di LD_PRELOAD:

LD_PRELOAD 
      A whitespace-separated list of additional, user-specified, ELF shared 
      libraries to be loaded before all others. This can be used to 
      selectively override functions in other shared libraries. For set- 
      user-ID/set-group-ID ELF binaries, only libraries in the standard 
      search directories that are also set-user-ID will be loaded. 

Ho provato a mettere la libreria in /usr/lib, /usr/local/lib e /usr/lib64 con i permessi setuid come da questa documentazione sopra, ma ancora non sembra funzionare. Se non diamo a LD_PRELOAD un percorso nel caso in cui io abbia la libreria nelle dir standard con setuid, non riesco a trovare la libreria. Se gli dò il percorso, non fa nulla.

Il binario setuid è un binario di permessi di root eseguito in una shell utente non root. qualche idea? Non sono sicuro se mi manca un percorso, una variabile di ambiente, o sto fraintendendo la documentazione di cui sopra.

Edit: permessi come richiesti sono:

libreria:

-rwsr-sr-x 1 root root 72580 2012-02-10 07:51 

App:

-rwsr-xr-x 1 root root 137517601 2012-02-10 

env | grep LD 
LD_LIBRARY_PATH=/usr/lib (I added this manually myself, usually LD_LIBRARY_PATH is empty) 
+0

Stai utilizzando SELinux? –

+0

Sì, Suse enterprise 11.1 è ciò che sono attualmente in esecuzione .. –

+2

Finalmente ha funzionato. In tutta la serie di test, devo aver incasinato qualcosa. Mettendolo in lib64 con le giuste autorizzazioni (setuid) e NON fornendo un percorso a LD_PRELOAD ha funzionato. Grazie per tutto il tuo aiuto ragazzi! –

risposta

-1

installare il lib come tale:

  • Locat ione:/lib o/usr/lib
  • permesso: root: root
  • ha setuid e setgid sul

Assicurarsi LD_PRELOAD viene esportato per l'ambiente

$ export LD_PRELOAD=/usr/lib/yourlib.so 
$ env | grep LD_PRELOAD # verify 

Quindi eseguire il programma .

+0

Non funziona e si applica alla libreria a tutte le app. Stavo cercando di utilizzare LD_PRELOAD = ... appname per il precaricamento di questa app. Come esperimento, ho copiato ls nella mia cartella personale e ho aggiunto i permessi di setuid (chmod u + s ./ls). La mia libreria era abituata a lavorare con ls in precedenza, non funziona più con le autorizzazioni locali. :(Come un altro esperimento, ho provato ad aggiungere lib a /etc/ld.so.preload, e funziona, ma ancora una volta, è tutto per tutti App. Volevo che funzionasse con LD_PRELOAD = .. appname se possibile –

+0

puoi modificare per mostrare il risultato di 'ls -lad' sulla tua lib e il tuo programma, così come il risultato di' env | grep LD'? –

+0

Aggiunta la modifica Grazie per il tuo aiuto! Ancora una precisazione, quando la metto in /etc/ld.so.preload, anche la mia app sembra funzionare con la lib, funziona solo per tutte le app. loader fa parte di LD_PRELOAD vengono saltati nel caso ld.so.preload. Inoltre, quando sudo ed eseguo come root, LD_PRELOAD funziona con la mia app, ma sfortunatamente non posso eseguire l'app come root.Questo è stato solo un rapido esperimento. –

3

Se si utilizza SELinux, questo potrebbe essere dovuto ad esso. Uno dei vettori ausiliari ELF supportati da glibc è AT_SECURE. Questo particolare parametro (che è 0 per impostazione predefinita o 1) indica al linker dinamico ELF di annullare l'impostazione di varie variabili di ambiente considerate potenzialmente dannose per il sistema. Uno di questi è LD_PRELOAD. Normalmente, questo risanamento ambientale viene eseguito quando viene chiamata un'applicazione setuid/setgid (per evitare le evidenti vulnerabilità). SELinux ha anche migliorato questo risanamento ogni volta che un'applicazione sta attivando una transizione di dominio in SELinux (ad esempio sysadm_t a mozilla_t attraverso un binario etichettato moz o qualsiasi altra cosa); SELinux imposta il flag AT_SECURE per l'applicazione caricata (nell'esempio, mozilla/firefox).

L'autorizzazione noatsecure disabilita l'attività di risanamento ambientale per una transizione particolare. È possibile farlo attraverso il seguente consentire economico (in quanto si applicherebbe l'esempio sopra):

allow sysadm_t mozilla_t:process { noatsecure }; 
+0

Selinux sicurezza avanzata linux o suse enterprise? Sto facendo funzionare quest'ultimo. ancora richiesto per le imprese di successo? –

+0

Secondo [this] (http://news.opensuse.org/2008/08/20/opensuse-to-add-selinux-basic-enablement-in-111/) SELinux è un'opzione in SUSE Enterprise che inizia con 11.1 . Tuttavia, se non lo stai utilizzando, la mia risposta non si applica. –

+0

Da quello che posso vedere, non sto eseguendo Selinux. Non vedo nessuna delle solite opzioni di configurazione di selinux. Ho visto AppArmour, ma anche disabilitato. –

7

LD_PRELOAD non può essere utilizzato con setuid. Questa è una funzionalità di sicurezza in linux. Per il controllo di riferimento this article, che illustra i dettagli su come utilizzare LD_PRELOAD per sostituire alcune chiamate di libreria con codice personalizzato, nell'esempio di malloc.