我有一个 php 脚本,它试图使用 exec(或 shell_exec)在系统上执行二进制文件。exec 失败,返回码 127。
返回代码 127 通常表示未找到命令。所以我确保使用二进制文件的绝对路径。没变。
Apache 被配置为使用 apache 的 ChrootDir 在 chroot 中运行。
我确保将二进制文件复制到 chroot、/bin/sh 以及这两者所需的所有链接库中的正确路径中。
Apache(以及因此 php)作为 www-data 运行。我已经确认 www-data 具有对二进制文件(包括 /bin/sh)和所有父文件夹的读取和执行权限。为了确认这不是文件权限问题,我使用 /bin/sh -c 使用 sudo 运行命令:
sudo -u www-data /chrootdir/bin/sh -c /chrootdir/path/to/binary
这没有问题。
使用 strace,我得到了这个:
execve("/bin/sh", ["sh", "-c", "/path/to/binary"], 0x7ffe436b3618 /* 11 vars */) = -1 EACCES (Permission denied)
只是为了确认权限问题是针对 sh 二进制文件(以及 chrootdir 中的那个),我尝试将 /chrootdir/bin/sh 重命名为其他内容并再次执行 strace,现在它抱怨找不到文件。
所以,我现在知道问题出在通过 apache 通过 php 运行时访问 /chrootdir/bin/sh ,但不是 www-data 用户的权限。
我不确定下一步该尝试什么。
这是在 Debian 10、apache 2.4.38 和 php 7.3.11 上运行的。
我已经清除了 open_basedir,也清除了 disable_functions。
我已经确认 apache 不受 apparmor 的限制,但无论如何都禁用了它。
最后,如果我禁用 apache chroot,这确实有效。
所以我的问题是在某个地方是否有任何其他限制可能会阻止 apache 这样做?