php exec は、/bin/sh が apache chroot で「権限が拒否されました」と表示されるため、127 を返します。

php exec は、/bin/sh が apache chroot で「権限が拒否されました」と表示されるため、127 を返します。

システム上でバイナリを実行するために exec (または shell_exec) を使用しようとしている PHP スクリプトがあります。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 として /chrootdir に chroot しようとしました。できませんでした。次のメッセージが表示されました:

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

また、彼の提案に従って、/bin/sh -c /path/to/binary を実行してみました (ただし、www-data は chroot コマンドを使用できないため、root として実行しました)。そして、同じ権限拒否エラーが発生しました。

sudo -u www-data /bin/sh ... を使用した場合は正常に実行されますが、chroot コマンドを使用した場合は実行されないため、問題はリンクされたライブラリにあるはずです。

さらに調査したところ、/chrootdir/lib64/ld-linux-x86-64.so.2 ライブラリは実行可能ではありませんでした。これを実行可能にすると問題は解決しました。

関連情報