¿Cómo Escribir Programas Seguros? - Librerías dinamicas
08 de Noviembre de 2005
Lenguaje C
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:
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:
Personalmente a mí me parecería buena idea hacer algo así:
Algunas arquitecturas tienen más variables de entorno que afectan al enlazado dinámico. Por ejemplo "NLSPATH" en Solaris.
- 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.
Valora este capítulo:
Autor y licencia de '¿Cómo Escribir Programas Seguros? - Librerías dinamicas'
|
Opiniona sobre '¿Cómo Escribir Programas Seguros? - Librerías dinamicas' (0)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con '¿Cómo Escribir Programas Seguros? - Librerías dinamicas'
Se discuten SSH, SSL, TSL y HTTPS, los protocolos utilizados en la actualidad para intercambiar...
Más »
Se discuten SSH, SSL, TSL y HTTPS, los protocolos utilizados en la actualidad para intercambiar...
Más »
Este documento recopila la información de importantes autores en cuanto a programas de investigación se...
Más »
El poder de Unix1 se esconde en pequeños comandos que no parecen ser muy útiles...
Más »
Repaso a algunos de los programas más interesantes de Linux.

