php exec 傳回 127 因為 /bin/sh 在 apache chroot 中收到“權限被拒絕”

php exec 傳回 127 因為 /bin/sh 在 apache chroot 中收到“權限被拒絕”

我有一個 php 腳本,它嘗試使用 exec (或 shell_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 函式庫不可執行。使其可執行解決了問題。

相關內容