Использование пути, отличного от /bin/sh для PHP, когда ему нужна оболочка
Я бы хотел, чтобы PHP использовал исполняемый файл по заданному пути, когда ему нужна оболочка, вместо значения по умолчанию /bin/sh для всех ситуаций, когда ему нужна оболочка (например, функция mail() для запуска sendmail на платформе UNIX, system()). функция, оператор обратной связи и т. д. и т. д.). Поскольку я использую PHP в качестве модуля apache, я попытался изменить оболочку для пользователя www-data в /etc/passwd, так как веб-сервер работает от имени этого пользователя. Это не помогло. Я также пытался установить переменную SHELL в конфигурации Apache с помощью SetEnv, но это тоже не помогло. Я хотел бы сделать это, так как я хочу проверять все вызовы оболочки, выполняемые PHP, регистрировать и / или отклонять / принимать их тоже. Невозможно отключить функции PHP, такие как system (), поскольку существующие (не могут быть изменены) решения используют его. У меня уже была эта "ограниченная оболочка", закодированная в C, я упускаю только хитрость, чтобы заставить PHP использовать этот двоичный файл вместо /bin/sh во всех случаях, когда в противном случае понадобится /bin/sh.
Да, я задал этот вопрос, уже связанный с функцией mail(), но я понял, что мне нужно гораздо более общее решение, и оно связано не только с mail(), но проблема заключается в использовании оболочки в целом, во многих различных ситуации. Я также думал о возможности переопределить имя пути в apparmor, но я не думаю, что это возможно. Решение предоставить пользовательский chroot "jail" для apache/PHP просто для предоставления другой оболочки, кажется для меня огромной проблемой излишнего:(
Заранее большое спасибо!
1 ответ
В этом случае PHP использует popen(), который обычно жестко запрограммирован /bin/sh -c
(см., например, реализацию glibc).
Если настройка chroot-тюрьмы действительно не подходит, а то, что предоставляет AppArmor, недостаточно, возможно, вам придется изменить либо PHP, либо libc.