Mientras leía esto , encontré el siguiente exploit:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
Este fragmento muestra que podemos eludir trivialmente los permisos de ejecución del sistema de archivos como un usuario normal sin privilegios. Ejecuté esto en un Ubuntu 12.04.
Si bien el cargador de Linux es un objeto compartido de acuerdo con el archivo (1), también tiene un punto de entrada que le permite ejecutarse directamente. Cuando se ejecuta de esta manera, el cargador de Linux actúa como un intérprete para los archivos binarios ELF.
Sin embargo, en mi máquina OpenBSD, este exploit no es efectivo, porque no puede ejecutar el cargador como un programa. La página del manual de OpenBSD dice: "ld.so es en sí mismo un objeto compartido que el núcleo carga inicialmente".
Pruebe esto en Solaris 9 y obtendrá un segfault. No estoy seguro de lo que sucede en otros lugares.
Mis preguntas son por lo tanto:
- ¿Por qué el cargador de Linux (cuando se ejecuta directamente) no verifica los atributos del sistema de archivos antes de interpretar un binario ELF?
- ¿Por qué implementar un mecanismo diseñado para no permitir la ejecución de archivos, si se deja de lado tan trivialmente? ¿Me he perdido algo?
libc
(lo hice una vez, actualizando una caja Arch), estarás agradecido por esta pequeña peculiaridad.