Для экспресс-блокировки выполняемых при работе определенного PHP-скрипта внешних программ удобно использовать библиотеку amon.so (http://www.lucaercoli.it/amon.html), которая подменяет своим обработчиком системный вызов execve() и контролирует его выполнение. Библиотека amon.so рассчитана на тесное взаимодействие с PHP и учитывает особенности его работы, позволяя защититься от простейших атак и блокировать работу бэкдоров, подобных r57shell.Так как библиотека amon пока отсутствует в стандартных пакетах, загрузим и соберем её вручную (пример для Debian/Ubuntu).
Устанавливаем необходимые для сборки компоненты:
apt-get install build-essential
Загружаем amon:
wget http://www.lucaercoli.it/amon/amon.c
Открываем файл amon.c и находим в верхней части строку "char * cmds []", в которой определен список допустимых команд. При необходимости правим список на своё усмотрение.
По умолчанию список разрешенных программ выглядит следующим образом:
"/usr/sbin/sendmail"
"/usr/lib/sendmail"
"/etc/alternatives/lib.sendmail"
"/usr/lib/sm.bin/sendmail"
"/usr/bin/mail"
"/bin/mv"
"/bin/rm"
"/usr/bin/unlink"
"/bin/rmdir"
"/bin/cp"
"/bin/date"
"/bin/bzip2"
"/bin/gunzip"
"/bin/gzip"
"/usr/bin/unzip"
"/bin/tar"
"/usr/bin/host"
"/usr/bin/file"
"/usr/bin/uptime"
"/bin/grep"
"/usr/bin/diff3"
"/bin/pwd"
Компилируем amon
gcc -fPIC -shared -ldl -o amon.so amon.c
Копируем amon.so в директорию /lib:
mv ./amon.so /lib/
В простейшем случае для защиты php-скрипта, запущенного в командной строке или в режиме CGI можно использовать следующий скрипт (php5-cgi-wrapper):
#!/bin/sh
export LD_PRELOAD=amon.so
exec /path/del/vero/php5-cgi "$@"
При использовании механизма suEXEC, этот скрипт можно прописать вместо вызова php, например, указать в конфигурации apache:
ScriptAlias /php_amon/ "/usr/local/bin/"
AddHandler php-script .php
Action php-script /php_amon/php5-cgi-wrapper
В случае необходимости работы php в виде модуля (libapache2-mod-php5), работающего внутри Apache, добавляем в /etc/apache2/envvars:
export LD_PRELOAD=amon.so
и перезапускаем apache:
/etc/init.d/apache2 restart
Для проверки загрузилась ли библиотека создадим и запустим простейший скрипт, в выводе которого должно быть упоминание amon.so:
<?php
phpinfo();
?>
Для php-скриптов, работающих в режиме FastCGI через mod_fcgid, достаточно написать промежуточный shell-скрипт, который использовать для запуска основного php-скрипта:
#!/bin/sh
export PHPRC=/etc/php5/cgi
export LD_PRELOAD = amon.so
exec /usr/lib/cgi-bin/php
В ситуации, когда php-скрипт попытается запустить, допустим, /bin/sh, операция будет блокирована, а в error.log будет оставлена запись:
sh: command_name: command not found
URL: http://www.howtoforge.com/amon.so-highjacking-system-calls-f...
Обсуждается: http://www.opennet.dev/tips/info/2567.shtml