В общем-то такая простая, но эффективная защита основана на том предположении, что программисты того или иного софта достаточно адекватно оценивают необходимость шелл-вызовов непосредственно через веб-сервер и зачастую отказываются от такого не самого лучшего способа интерактива с операционной системой.
Практика показывает, что подобные операции часто или избегают или выносят их в задачи cron. А последние, как правило, запускаются через CLI (например, "/usr/bin/php /path/to/cron.php").
Следовательно, нужно отключить шелл-вызовы именно для веб-сервера, оставив их для CLI.
Предостережение: совместимо не со всем PHP-софтом. Мой опыт системного администрирования показывает, что небольшой процент специализированного софта все-таки требует наличия шелл-вызовов в веб-серверной версии PHP. В таком случае такую защиту ставить нельзя под угрозой срыва функционала.
Совместимо с большим количеством довольно опасного PHP-ширпотреба вроде phpmyadmin, wordpress, phpbb, всевозможные форумы и CMS-ки.
Дает универсальную защиту от вебшеллов и опасных уязвимостей типа «remote code execution».
Было бы здорово просто установить директиву php.ini «disable_functions» в нужное значение только для веб-сервера. Устанавливать эту директиву в виртуалхостах apache с «ванильной» сборкой mod_php нельзя. Однако можно для Apache указать альтернативную директорию, где будет лежать php.ini с этой директивой:
PHPIniDir /etc/httpd
Теперь берем наш php.ini, копируем в указанную директорию /etc/httpd и устанавливаем заветное значение:
disable_functions="popen,exec,system,passthru,proc_open,shell_exec"
Далее важно проверить отсутствие ущерба со стороны функционала веб-приложений.
Автор: pentarh