У меня есть скрипт php, который пытается использовать exec (или shell_exec) для выполнения двоичного файла в системе. Выполняется сбой с кодом возврата 127.
Код возврата 127 обычно означает, что команда не найдена. Поэтому я убедился, что использовал абсолютный путь к двоичному файлу. Без изменений.
Apache настроен для работы в chroot с использованием Apache ChrootDir.
Я обязательно скопировал двоичный файл по правильному пути в chroot, а также / bin / sh и все связанные библиотеки, необходимые для них обоих.
Apache (и, следовательно, php) работают как www-данные. Я подтвердил, что 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, и теперь он пожаловался на то, что файл не найден.
Итак, теперь я знаю, что проблема связана с доступом к / chrootdir / bin / sh при запуске через php через apache, но это не разрешение пользователя www-data.
Я не уверен, что попробовать дальше.
Это работает на Debian 10, apache 2.4.38 и php 7.3.11.
Я очистил open_basedir, а также отключил disable_functions.
Я подтвердил, что apache не ограничен apparmor, но все равно отключил его.
Наконец, если я отключу chroot apache, это сработает.
Итак, мой вопрос: есть ли где-нибудь еще какое-то ограничение, которое может помешать apache сделать это?
Благодаря комментарию @Michael Hampton выше, я попытался использовать команду chroot, чтобы просто chroot на / chrootdir как root. Я не смог. Я бы получил:
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 не была исполняемой. Сделав его исполняемым, проблема была решена.