我有一个 php 脚本,它尝试使用 exec (或 shell_exec) 在系统上执行二进制文件。exec 失败,返回代码为 127。
返回代码 127 通常表示未找到命令。因此我确保使用二进制文件的绝对路径。没有变化。
Apache 配置为使用 apache 的 ChrootDir 在 chroot 中运行。
我已确保将二进制文件复制到 chroot 中的正确路径以及 /bin/sh 以及这两者所需的所有链接库中。
Apache(以及 php)以 www-data 身份运行。我已确认 www-data 对二进制文件(包括 /bin/sh)和所有父文件夹具有读取和执行权限。为了确认这不是文件权限问题,我使用 sudo 使用 /bin/sh -c 运行了命令:
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 执行此操作?
答案1
感谢@Michael Hampton 的上述评论,我尝试使用 chroot 命令以 root 身份简单地 chroot 到 /chrootdir。但我做不到。我会得到:
chroot: failed to run command ‘/bin/bash’: Permission denied
我还按照他的建议尝试执行 /bin/sh -c /path/to/binary(但以 root 身份执行,因为 www-data 无法使用 chroot 命令)。结果还是出现了同样的权限被拒绝错误。
事实上,当我仅使用 sudo -u www-data /bin/sh ... 时它可以正确执行,但使用 chroot 命令时却不能,这意味着问题一定出在链接库上。
经过进一步调查,发现 /chrootdir/lib64/ld-linux-x86-64.so.2 库不可执行。将其设置为可执行即可解决问题。