Подтвердить что ты не робот

Можно ли ограничить, какие команды php может пройти через exec на уровне ОС?

В настоящее время я размещаю сайт Drupal 6 на машине CentOS. Конфигурация Drupal (CMS) содержит несколько десятков сторонних модулей, которые не должны быть forked в качестве общего лучшая практика кодирования. Однако некоторые из этих модулей используют команду php exec для правильной работы.

Сайт позволяет администраторам вставлять фрагменты кода php на любую страницу через конфигурацию пользовательского интерфейса, если у них есть доступ к формату ввода кода php. Мне нужно, чтобы этот входной формат был доступным для админов, потому что есть несколько узлов (страниц) и панельных панелей, которые используют небольшие, безобидные фрагменты кода php, например, встраивание определенной формы в область содержимого.

Проблема заключается в том, что если кто-то должен был компрометировать учетную запись администратора, тогда они могли запускать произвольный PHP-код на сайте и, таким образом, запускать команды оболочки через php exec, passthru и т.д. Есть ли способ, с уровня операционной системы, ограничить, какие команды оболочки могут пройти php на машину? Может ли это быть сделано путем ограничения разрешений на файлы для некоторых программ с php?

Примечание. Я не могу использовать директиву php.ini disable_functions, поскольку мне все еще нужно exec нормально функционировать для многих случаев, где модули используют некоторые команды оболочки, например, видеокодирование.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос: теоретически, если вы создали учетную запись пользователя с использованием чрезвычайно ограниченной учетной записи, которую PHP мог бы выполнять как команды, вы можете настроить свою установку на более безопасную. Однако реальная проблема заключается в том, что пользователи-администраторы могут выполнять произвольные команды. Если это произойдет, у вас будет значительно больше проблем с вашими руками.

Реальное решение здесь:

  • Возможность отправки и запуска произвольного кода из Drupal является значительным риском, который вы можете смягчить, не выполняя этого. Я настоятельно рекомендую перепроектировать эти "безобидные" биты кода, поскольку они приведут к компромиссу; выполнение произвольного кода - это только один вид эксплойта, и о нем беспокоиться много других.
  • Модули, требующие запуска команд оболочки, также являются существенными уязвимостями безопасности. В некоторых случаях мне удалось развить/исправить или заменить модули, выполняющие команды теми, которые этого не делают, но в некоторых случаях (например, кодирование видео) этого избежать нельзя. В этой ситуации я бы установил очень ограниченную внутреннюю службу, с которой интерфейс может взаимодействовать. Это отделяет ваши проблемы и оставляет Drupal делать то, что было предназначено для: управления и обслуживания контента.

Ответ 2

Если ваши аккаунты администраторов будут взломаны, вы обречены. Вы пытаетесь быть менее обречены, но это не сработает.

Отключение exec()

Это всего лишь часть всех функций, способных совершать вызовы в системе. Есть еще много, например passthru(), shell_exec(), popen(), proc_open(), оператор обратного хода и т.д. Не поможет.

Ограничение доступных исполняемых файлов

Будет работать только в том случае, если злоумышленник не сможет принести свои собственные исполняемые файлы. Но file_put_contents() сможет записать исполняемый файл в жесткий диск, и тогда он может быть вызван. Также не поможет.

PHP не может навредить себе, не так ли?

Неправильно. Выполнение файлов на сервере с помощью exec() может показаться лучшей идеей, но сам PHP достаточно мощный, чтобы нанести ущерб вашему серверу и всему, что с ним связано.

Я думаю, что единственным реальным решением является:

Не разрешайте взломать учетные записи администратора.

И если они будут взломаны, узнайте об этом немедленно. Уметь отслеживать атаку администратора. Уметь знать, что именно атакующий сделал на вашей машине, чтобы вы могли его отменить. Очень важная часть заключается в том, что вы выполняете регистратор журналов аудита, который сохраняет данные на другой машине.

И вы, вероятно, будете применять более жесткие ограничения на то, кто может войти в качестве администратора в первую очередь. Например, вероятно, нет необходимости разрешать логин IP-адресов всего мира, если вы точно знаете, что один администратор всегда использует диапазон IP своего локального интернет-провайдера для работы. По крайней мере, позвоните в колокольчик и сообщите кому-нибудь еще, что логин из Китая продолжается, если этого не ожидается (и если вы не работаете в Китае:-)).

И есть двухфакторная аутентификация. Вы можете отправить SMS на номер телефона с дополнительным кодом входа. Или вы можете полностью перенаправить входной логин, выполнив аутентификацию Google или Facebook. У этих игроков уже есть инфраструктура для поддержки этого.

Кроме того, вы получаете более высокое сопротивление против внутренних заданий. Люди действительно ценят свои личные сетевые логины выше, чем логин для своего работодателя. Получение пароля somebook facebook будет стоить 30 долларов в среднем, но учетная запись компании уже используется для 8 $. Перейти фигурой...

Ответ 3

Это не на уровне ОС, но внутри ядра Drupal есть модуль под названием PHP. Вы можете использовать это как базу и создать настраиваемый модуль, расширяющий функциональные возможности этого модуля, а затем просто включите этот модуль в отличие от основного модуля Drupal 6. Большая проблема с этим, однако, связана с отключением основного модуля Drupal 6 и последующим включением нового модуля. Я бы тестировал его на dev-установке, чтобы убедиться, что предыдущий контент не удален и что новый модуль правильно разбирает хранимый ввод PHP. Это должно быть хорошо, поскольку установка модуля содержит предупреждение об отключении от PHP, которое теперь отображается в виде обычного текста.

Как и для расширения основного модуля, он запускает очень простой модуль. Вы можете выполнить hardcode в списке разрешенных или не разрешенных команд. Затем вы можете проверить оператор exec с разрешенными переменными на этот список и сделать все, что подходит. Это не идеальное совпадение с просто блокировкой самих программ уровня ОС, но это лучше, чем ничего. Чтобы скопировать список, вы просто захотите изменить привязку php_filter в нижней части файла модуля и перед выполнением drupal_eval выполнить свой тест.

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

Ответ 4

Другой подход:

Мы считаем, что нам нужно создать тестового пользователя, который имеет доступ только к системе для выполнения telnet на другой машине в сети. Поскольку нам нужно всего лишь запустить telnet, необходимо ограничить другие команды, доступные в стандартном сеансе bash. Отпустите шаг за шагом, настроив все.

1) Мы создаем пользовательский тест

Это будет обычный пользователь системы, поэтому мы должны быть обычным пользователем. Единственная особенность заключается в том, что мы меняем оболочку этого пользователя. По умолчанию обычно /bin/ bash, и мы будем устанавливать /bin/rbash. rbash на самом деле является копией bash, но на самом деле это "ограниченный bash". ​​

shell> adduser --shell /bin/test rbash

2) Мы создаем файл. Bash_profile

Мы должны создать этот файл в созданном вами доме пользователя и для которого мы хотим применить разрешения. Содержимое файла будет выглядеть следующим образом:

if [-f ~/.bashrc]; then
    . ~/.bashrc
fi

PATH = $HOME/apps
export PATH

3) Мы избегаем изменений

После того, как вы создали файл, мы останавливаем, чтобы никто не мог вносить изменения в файл.

shell> chattr +i /home/test/.bash_profile

4) Мы создаем каталог приложений и устанавливаем доступ к ним программ

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

shell> mkdir apps
shell> ln-s /usr/bin/telnet /home/test/apps/

5) Мы обнаружили, что работы

Теперь вы можете получить доступ к системе и убедиться, что она работает правильно.

shell> ssh [email protected]
[email protected] password:

[email protected]> ls
-rbash: ls: command not found
[email protected]> cd
-rbash: cd: command not found
[email protected]> telnet
telnet>

Ответ 5

Команда:

Здесь мой подход.....

Я создал небольшой script со списком принятых команд, и в зависимости от команды выполнение будет контролироваться, чтобы избежать проблем. Я не уверен, что это вопрос. Пример кода имеет команды в Windows, но вы также можете использовать его в Linux...

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);

function executeCommand($my_command){
    $commandExclusions = array ('format', 'del');

    if (in_array(strtolower($my_command),$commandExclusions)) {
        echo "Sorry, <strong>".$my_command." </strong> command is not allowed";
        exit();
    }
    else{
        echo exec($my_command, $result, $errorCode);
        implode("n", $result);
    }
}
echo "<h3>Is it possible to restrict what commands php can pass through exec at an OS level?</h3><br>";
echo "********************************<br>";
//test of an accepted command
echo "test of an accepted command:<br>";
executeCommand("dir");
echo "<br>********************************<br>";
echo "test of an unaccepted command:<br>";
//test of an unaccepted command
executeCommand("format");
echo "<br>********************************<br>";
?>

Вывод:

Можно ли ограничить, какие команды php может пройти через exec на уровне ОС?


проверка принятой команды: 117 Дир 11,937,468,416 байт бесплатно


тест непринятой команды: Извините, команда format не разрешена