2012-02-10 26 views
6

Estoy tratando de usar LD_PRELOAD para precargar una biblioteca con una aplicación que tenga permisos establecidos. LD_PRELOAD tratado en un primer momento, y parecía como si estuviera siendo ignorada con el binario setuid, a pesar de que estaba trabajando cuando lo probé con otros como ls, etc. dirLD_PRELOAD con setuid binary

De la documentación de 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. 

Intenté poner la biblioteca en /usr/lib, /usr/local/lib y /usr/lib64 con los permisos de setuid según esta documentación anterior, pero todavía no parece funcionar. Si no doy una ruta a LD_PRELOAD en el caso en que tengo la biblioteca en los directorios estándar con setuid, parece que no puede encontrar la biblioteca. Si le doy el camino, no hace nada.

El binario setuid es un binario de permisos de raíz que se ejecuta en un shell de usuario no root. ¿Alguna idea? No estoy seguro de si me falta un camino, una variable de entorno, o estoy malinterpretando la documentación anterior.

Edición: permisos solicitados como son:

Biblioteca:

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

Aplicación:

-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

¿Está ejecutando SELinux? –

+0

Sí, la empresa Suse 11.1 es lo que estoy ejecutando actualmente. –

+2

Finalmente funcionó. En todo el conjunto de pruebas, debo haber estropeado algo. Poniéndolo en lib64 con los permisos correctos (setuid) y NO proporcionando una ruta a LD_PRELOAD funcionó. Gracias por toda su ayuda chicos! –

Respuesta

-1

instalar su lib como tal:

  • locat ión:/lib o/usr/lib
  • permisos: root: root
  • ha setuid y setgid en

Asegúrese LD_PRELOAD se exporta a su entorno

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

A continuación, ejecute el programa de .

+0

No funciona, y se aplica en la biblioteca a _todas las aplicaciones. Estaba tratando de usar LD_PRELOAD = ... appname para simplemente precargarlo para esta aplicación. Como experimento, copié ls en mi propio directorio y agregué permisos de setuid (chmod u + s ./l). Mi biblioteca solía trabajar con ls antes, ya no funciona con los permisos locales cambiados .(Como otro experimento, traté de agregar lib a /etc/ld.so.preload, y funciona, pero de nuevo, es para todos aplicaciones. Quería que funcionara con LD_PRELOAD = .. appname si fuera posible. –

+0

¿Puedes editar para mostrar el resultado de 'ls -lad' en tu lib y tu programa, así como el resultado de' env | grep LD'? –

+0

Añadí la edición. Gracias por tu ayuda. Solo una aclaración más, cuando la puse en /etc/ld.so.preload, mi aplicación también parece funcionar con la lib, solo funciona para todas las aplicaciones. Tal vez algunas comprueben el Loader como parte de LD_PRELOAD se omite en el caso ld.so.preload. Además, cuando sudo y ejecuto como root, LD_PRELOAD funciona con mi aplicación, pero no puedo ejecutar la aplicación como raíz por desgracia. Esto fue solo un experimento rápido. –

3

Si está utilizando SELinux, esto puede deberse a ello. Uno de los vectores auxiliares ELF que glibc admite es AT_SECURE. Este parámetro particular (que es 0 por defecto o 1) le dice al vinculador dinámico ELF que desarme varias variables de entorno que se consideran potencialmente perjudiciales para su sistema. Uno de estos es LD_PRELOAD. Normalmente, este saneamiento ambiental se realiza cuando se llama a una aplicación setuid/setgid (para evitar las vulnerabilidades obvias). SELinux también mejoró este saneamiento cuando una aplicación desencadena una transición de dominio en SELinux (digamos sysadm_t a mozilla_t a través de un binario con la etiqueta moz, o lo que sea); SELinux establece el indicador AT_SECURE para la aplicación cargada (en el ejemplo, mozilla/firefox).

El permiso noatsecure deshabilita la actividad de saneamiento del entorno para una transición en particular. Esto se puede hacer a través del siguiente comunicado permitir (ya que se aplicaría en el ejemplo anterior):

allow sysadm_t mozilla_t:process { noatsecure }; 
+0

¿Selinux security enhanced linux o suse enterprise? Estoy ejecutando este último. ¿Todavía se aplica para la empresa suse? –

+0

De acuerdo con [este] (http://news.opensuse.org/2008/08/20/opensuse-to-add-selinux-basic-enablement-in-111/) SELinux es una opción en SUSE Enterprise que comienza con 11.1 . Sin embargo, si no lo está usando, mi respuesta no se aplica. –

+0

Por lo que puedo ver, no estoy ejecutando Selinux. No veo ninguna de las opciones habituales de configuración de selinux. Vi AppArmour, pero también está deshabilitado. –

7

LD_PRELOAD no se puede utilizar con setuid. Esta es una característica de seguridad en Linux. Para obtener información de referencia this article, que entra en detalles sobre cómo usar LD_PRELOAD para sustituir algunas llamadas de biblioteca con código personalizado, en el ejemplo de malloc.