¿Cómo Escribir Programas Seguros? - Librerías dinamicas

14 - Librerías dinamicas

[editar]
Tutorial creado por Mononeurona.org. Extraido de: http://www.mononeurona.org/index.php?idp=535
08 de Noviembre de 2005
Si un usuario modifica las variables de entorno "LD_LIBRARY_PATH" y "LD_PRELOAD" puede hacer que cualquier programa ejecute código prácticamente arbitrario. Esas variables de entorno sólo son tenidas en cuenta si el programa invocado no es SUID (más bien debería decirse que no tendrían que tenerse en cuenta). Ello es bastante lógico, ya que en ese caso el usuario no ganaría ningún beneficio que no pueda obtener directamente. Pero incluso aunque el programa sea SUID existe un riesgo, ya que éste puede invocar a otros que no sean SUID y, por tanto, cuyo funcionamiento sí se vea afectado. La solución es la de siempre:

  • Cuando un proceso SUID llame programas externos, debe abandonar sus privilegios.
  • La llamada de procesos externos debe ser precedida de la declaración explícita de las variables de entorno.

Lo más sencillo es que los programas SUID no utilicen librerías dinámicas, sino que se enlaces estáticamente al crearse el ejecutable. Con el compilador "gcc", por ejemplo, eso se consigue especificando "-static".

A la hora de enfrentarse a programas SUID, cada enlazador dinámico ha evolucionado hasta casi converger:

  • Hasta la versión 1.6.7, ld-linux.so.1 obedece a las variables de entorno.
  • Hasta la versión 1.7.11, borra las variables de entorno de carga dinámica si el proceso es SUID/SGID.
  • A partir de la versión 1.9.0, vuelve a obedecer a las variables de entorno, pero sólo si las librerías especificadas no contienen ningún "/" en el nombre. Eso hace que las librerías se carguen de los ficheros configurados en el cargador ("/lib", etc).
  • El cargador dinámico de Solaris 2 hace exactamente lo mismo.
  • El cargador dinámico de GNU ignoraba las variables de entorno, pero a partir de 1.997 adoptó el mismo camino que el resto.
  • El enlazador dinámico de GNU distribuido en Red Had ignora las variables a menos que el que ejecute el código sea "root".

Personalmente a mí me parecería buena idea hacer algo así:

  • Si no somos SUID, el usuario que ejecuta el proceso es su propietario o "root", obedece a la variables de entorno.
  • En caso contrario, y si las librerías no están en directorios seguros, no sólo no les hace caso, sino que borra las variables de entorno relativas al enlazado dinámico, por si el proceso llama luego a otros procesos no SUID.

Algunas arquitecturas tienen más variables de entorno que afectan al enlazado dinámico. Por ejemplo "NLSPATH" en Solaris.
[editar]

Sé el primero en opinar


Tutoriales relacionados con '¿Cómo Escribir Programas Seguros?'

En este artículo vamos a intentar dar algunos consejos para la programación segura en C.... Más »
El objetivo de este documento es enseñar las bases de la instalación de un cortafuegos... Más »
Esta guía no es un documento general de seguridad. Esta guía está específicamente orientada a... Más »
Documento con fundamentos teóricos de control de accesos en redes telemáticas; se tratan temas como... Más »
Bienvenidos al manual de HTML de Indaya.A través de todos estos capítulos vamos a descubrir... Más »

Autor y licencia de '¿Cómo Escribir Programas Seguros?'


Tutorial de Mononeurona.org. Extraido de: http://www.mononeurona.org/index.php?idp=535 CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.