Назад | Перейти на главную страницу

php exec возвращает 127, потому что / bin / sh получает «Permission denied» в apache chroot

У меня есть скрипт 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 не была исполняемой. Сделав его исполняемым, проблема была решена.