Записки сисадмина

Или помойное ведро идей


Выделенные сервера от $130
VDS/VPS от $20

Особенности применения PHP disable_functions

В PHP есть такая замечательная настройка как disable_functions, которая позволяет отключить использование определенных функций. Это очень удобно с точки зрения безопасности. Наиболее распространенный способ применения – запретить использовать шелл вызовы:

disable_functionspopen,exec,system,passthru,proc_open,shell_exec«

Поскольку на шелл вызовы не распространяется open_basedir ограничение (например, можно спокойно посмотреть systemls /«); с включенным open_basedir), эта «дырка» сводит на нет все ограничения безопасности и позволяет работать remote shell’ам даже с включенным ограничением open_basedir.

Было бы логично добавить в конфигурацию virtual host такие строки:

php_admin_value «open_basedir» «/home/foobar/foobar.com»
php_admin_value «disable_functions» «popen,exec,system,passthru,proc_open,shell_exec»

Но это не сработает, т.к. disable_functions работает только когда включен в глобальном php.ini.

Конечно, в phpinfo() вы увидите правильное значение disable_functions, однако «отключенные» функции будут продолжать действовать. Разработчики объяснили это тем, что отключать функции на уровне конфигурации апача очень накладно, гораздо проще выключить их вообще из php.ini

Но с другой стороны, шелл вызовы достаточно часто используются в CLI скриптах, в то время как в веб скриптах в большинстве случаев их можно отключить. Значит нужно разделить конфиги CLI и Web. В первом конфиге оставить шелл вызовы, а во втором, более подверженном хаку, их отключить.

Предположим, что дефолтный конфиг php.ini лежит в /usr/local/lib (стандартное место на FreeBSD). Скопируем его в /usr/local/etc/apache2. И на новом месте пропишем нужные disable_functions. Далее, в httpd.conf пишем:

PHPIniDir /usr/local/etc/apache2/conf

И рестартуем апач. Все, теперь CLI и Web версии PHP имеют независимые конфиги и в последнем отключены шелл вызовы.

13.10.2008 Автор admin | Безопасность | 11 comments

Комментарии (11) »

  1. [...] open_basedir не распространяется на шелл вызовы php: system,exec,popen,passthru. С другой стороны, зачем вордпрессу эти вызовы? Ну вот и отключим их. В этой статье описано, как грамотно отключить shell вызовы с помощью disable_functions. [...]

    Пингбек от Записки сисадмина :: Делаем WordPress безопаснее | 13 октября 2008

  2. Для того, чтобы использовать «disable_functions» в virtual host нужен suhosin patch. Параметр называется по другому, но смысл тот же. Незаменимая вещь для shared хостинга, когда отдельным сайтам нужно разрешить использование потенциально небезопасных функций.

    Комментарий от Aleksey | 23 декабря 2008

  3. В документации сказано что список функций должен быть разделен двоеточием, у Вас запятыми будет ли это работать, нет ли здесь ошибки?

    Комментарий от SHOUTcast | 9 марта 2009

  4. буду краток. запятые работают.
    ==========WEB SCRIPT===============
    < ?
    $a=ini_get('disable_functions');
    echo "Disabled functions: $a
    «;
    echo «Trying popen()…»;
    ini_set(‘error_reporting’,E_ALL);
    ini_set(‘display_errors’,1);
    $p=popen(‘/bin/true’,'r’);
    if ($p) {
    echo «Hmmmm!!!! SUCCESS :(
    «;
    pclose($p);
    } else {
    echo «Works! failure
    «;
    }
    ?>
    =============OUTPUT=========================
    Disabled functions: popen,exec,system,passthru,proc_open,shell_exec
    Trying popen()…
    Warning: popen() has been disabled for security reasons in /home/foobar/domain.com/x.php on line 7
    Works! failure
    ======================================

    Комментарий от admin | 9 марта 2009

  5. Хм…
    Извините, не админ, но вопрос а конструкцию « как отрубить?
    Т.е. echo `less /etc/passwd`; – как пример.

    Комментарий от Виталий | 18 мая 2009

  6. А слона то и не заметили… ) подумаем

    Комментарий от admin | 18 мая 2009

  7. >Извините, не админ, но вопрос а конструкцию “ как отрубить?
    >Т.е. echo `less /etc/passwd`; – как пример.
    http://php.net/manual/ru/language.operators.execution.php
    Замечание: Обратные кавычки недоступны, в случае, если установлен безопасный режим или отключена функция shell_exec().
    А shell_exec() отключен.

    Комментарий от Alex | 20 мая 2009

  8. Подтверждаю, при отключенном shell_exec обратные кавычки не работают.

    Комментарий от admin | 22 мая 2009

  9. Я обычно отключаю вот эти:
    ;disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open
    ;The first line disables URL-aware fopen wrappers that enable accessing URL object like files. The second one disables a l
    ;shows_source — an alias of highlight_file() which provides syntax highlighting for files;
    ;system — allows execution of external programs;
    ;shell_exec — allow execution of commands via a shell;
    ;exec — allow execution of commands;
    ;passthru — similar to the exec() function, allows execution of commands;
    ;phpinfo — outputs PHP information that could be used by potential intruders;
    ;popen — opens a pipe to a process being executed by a certain command;
    ;proc_open — similar to popen() but provides better control over command execution.

    Комментарий от Денис Юсупов | 30 сентября 2009

  10. disable_functions = system,exec,curl_exec,curl_multi_exec,passthru,shell_exec,proc_open,popen,parse_ini_file,show_source,ini_restore,com_load_typelib,symlink

    Комментарий от Pandora | 15 августа 2010

  11. Уважаемый Pandora, объясните чем так опасен то curl_exec и мультик? А по поводу show_source, parse_ini_file – может еще для надежности fopen() отключим а? ))

    Комментарий от admin | 17 августа 2010

Оставить комментарий