Function hijaking

Автор: | 25 февраля 2012

Перехват функций – архиполезная штука. Если нет возможности изобрести пяттиколесный велосопед, поймать опасную функцию (системную команду) за хвост можно с помощью модуля Baxtep (спасибо Андрею).

Baxtep – PHP security extension to intercept execution of system commands.

Для сборки модуля понадобятся пара прямых рук и такие команды:

# скачиваем с репозитория
svn checkout https://baxtep.googlecode.com/svn/trunk/ baxtep

# переходим в каталог
cd baxtep

# собираем:
phpize
# если у вас PHP в нестандартном каталоге, укажите полный путь:
# /usr/local/php5-fcgi/bin/phpize
./configure
make

# закиньте модуль в папку с модулями:
cp .libs/baxtep.so /usr/local/php5-fcgi/lib/php/extensions/no-debug-non-zts-20060613/baxtep.so

# каталог с модулями можно определить командой
php -i | grep extension_
# или по полному пути:
# /usr/local/php53-fcgi/bin/php -i | grep extension_

# php.ini можно найти тоже через php -i, добавьте туда:
baxtep.logfile = "/tmp/baxtep_messages"
# или укажите другой путь, куда удобнее. я добавил строчку перед
# [Zend]

Все, перезапускайте Apache/PHP, в зависимости от того, что вам нужно перезапустить, чтобы модуль подгрузился. Вахтер послушно запишет в лог-файл все системные вызовы, например:

2012-02-25 19:35:39 BAXTEP: proc_open CMDLINE: `php` FILE: /path/to/file/1.php on line 11 URI: /1.php
2012-02-25 19:35:39 BAXTEP: shell_exec CMDLINE: `date` FILE: - on line 1 URI: (null)

Среди опасных, есть еще функция proc_open, чтобы ее перехватывать, нужно добавить в файл baxtep.c строчку:

php_baxtep_substitute_function("proc_open" TSRMLS_CC);

и пересобрать/переподгрузить модуль.

Список функций, которые я блокирую, если в них нет острой необходимости (php.ini):

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec

Добавить комментарий