2011-06-27 15 views
7

Estoy usando python con setcap CAP_NET_RAW habilitado. Mi secuencia de comandos python importa una biblioteca compartida que tiene $ ORIGIN en su RPATH. Como mi python ahora es una aplicación suid, $ ORIGIN no se evalúa y la biblioteca no se carga correctamente (esto se debe a un security leak found in glibc). ¿Hay alguna manera de decirle al enlazador que la ruta de acceso de mi biblioteca es segura y cargar la biblioteca de todos modos?

Unas cuantas notas:

  1. sólo necesitan esta característica en la etapa de desarrollo. No estoy buscando una solución de producción.
  2. Al trabajar como root, todo funciona.
  3. No quiero trabajar como root.

Gracias, de Dave

+0

@Amir Rachum, ejecutar el programa después de ejecutar 'exportación LD_LIBRARY_PATH =" $ LD_LIBRARY_PATH:/ruta/a/yo urlibrary "' – totti

Respuesta

1

¿Usted intentó sudo?

En lugar de $ ORIGIN, use rutas fijas durante el desarrollo porque funcionarán en programas de setuid. No cambie su proceso de compilación principal, solo use patchelf para configurar rpath a lo que necesita. Se podría hacer un script de shell, que hace algo como:

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

Entonces su binario ya no buscará $ ORIGEN /../ lib pero /devel/myprog/lib/../lib

+0

sudo funciona, pero no quiero ejecutarlo como root. Pensé en usar Patchelf durante mi compilación, pero es muy hacky. ¿No hay algo así como la herramienta Crle de Solaris? Eso sería perfecto. –

+0

@DaveyJones, es probable que esto sea demasiado tarde ... pero he visto ejemplos en los que a un archivo de texto se le da un nombre como 'libblah.so', pero en lugar de ser un binario, parece asemejarse a' ld.config 'scripts como los que vería en Solaris. –

2

Puede prueba uno de estos. Tenga en cuenta que <path-to-mylib> es la ruta de acceso absoluta después de resolver la referencia $ORIGIN rpath.

  1. Vuelva a ejecutar ldconfig después de decirle que dónde encontrar su biblioteca

    $ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf 
    $ ldconfig -v 
    
  2. Si se ejecuta cosas como root no es una opción, export LD_LIBRARY_PATH con el directorio correcto para cada ejecución del proceso

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