php exec devuelve 127 porque /bin/sh obtiene "Permiso denegado" en Apache chroot

php exec devuelve 127 porque /bin/sh obtiene "Permiso denegado" en Apache chroot

Tengo un script php que intenta usar exec (o shell_exec) para ejecutar un binario en el sistema. El ejecutivo falla con el código de retorno 127.

El código de retorno 127 normalmente significa comando no encontrado. Así que me aseguré de utilizar la ruta absoluta al binario. Ningún cambio.

Apache está configurado para ejecutarse en un chroot usando ChrootDir de Apache.

Me aseguré de copiar el binario en la ruta adecuada en el chroot, así como en /bin/sh y todas las bibliotecas vinculadas necesarias para ambos.

Apache (y por lo tanto php) se ejecutan como www-data. Confirmé que www-data tiene permiso de lectura y ejecución para los archivos binarios (incluido/bin/sh) y todas las carpetas principales. Para confirmar que no se trata de un problema de permisos de archivos, ejecuté el comando usando /bin/sh -c usando sudo:

sudo -u www-data /chrootdir/bin/sh -c /chrootdir/path/to/binary

Y eso funciona sin problemas.

Usando strace, obtengo esto:

execve("/bin/sh", ["sh", "-c", "/path/to/binary"], 0x7ffe436b3618 /* 11 vars */) = -1 EACCES (Permission denied)

Solo para confirmar que el problema de permiso es para el binario sh (y el que está en chrootdir), intenté cambiar el nombre de /chrootdir/bin/sh a otra cosa e hice el strace nuevamente y ahora se quejó de que no se encontró el archivo.

Entonces, ahora sé que el problema está en el acceso a /chrootdir/bin/sh cuando se ejecuta a través de php a través de Apache, pero no es un permiso del usuario www-data.

No estoy seguro de qué probar a continuación.

Esto se ejecuta en Debian 10, Apache 2.4.38 y PHP 7.3.11.

Borré open_basedir y también borré enable_functions.

Confirmé que Apache no está limitado por apparmor, pero lo desactivé de todos modos.

Finalmente, si desactivo el chroot de Apache, esto funciona.

Entonces, mi pregunta: ¿hay alguna otra restricción en algún lugar que pueda impedir que Apache haga esto?

Respuesta1

Gracias al comentario anterior de @Michael Hampton, intenté usar el comando chroot para simplemente hacer chroot en /chrootdir como root. Yo no era capaz de. Yo obtendría:

chroot: failed to run command ‘/bin/bash’: Permission denied

También intenté, como sugirió, ejecutar /bin/sh -c /path/to/binary (pero como root ya que www-data no puede usar el comando chroot). Y eso dio el mismo error de permiso denegado.

El hecho de que se ejecutara correctamente cuando usé sudo -u www-data /bin/sh..., pero no con el comando chroot, significaba que el problema debía estar en las bibliotecas vinculadas.

Tras una mayor investigación, la biblioteca /chrootdir/lib64/ld-linux-x86-64.so.2 no era ejecutable. Hacerlo ejecutable solucionó el problema.

información relacionada