Какие проблемы безопасности следует учитывать при установке FS_METHOD в значение "direct" в wp-config?

27 мая 2015 г., 12:36:20
Просмотры: 125K
Голосов: 60

Недавно я столкнулся с проблемой невозможности установить плагин WP Smush Pro, так как у меня отсутствовали опции ручной установки или установки в один клик.

Я наткнулся на эту публикацию, где предлагалось изменить настройки в wp-config.php. Я добавил предложенные настройки, однако самой важной из них оказалась:

define('FS_METHOD', 'direct');

Я хотел бы узнать, какие реальные риски существуют при установке FS_METHOD в значение direct? Есть ли альтернативные способы установки плагина?

Вот что говорится в официальной документации:

FS_METHOD принудительно устанавливает метод файловой системы. Он может быть только "direct", "ssh2", "ftpext" или "ftpsockets". Как правило, его следует менять только если у вас возникают проблемы с обновлениями. Если изменение не помогло, верните прежнее значение или удалите его. В большинстве случаев, установка значения 'ftpsockets' будет работать, если автоматически выбранный метод не подходит.

(Основной приоритет) "direct" принуждает использовать прямые запросы File I/O из PHP, что может вызвать проблемы с безопасностью на плохо настроенных хостингах. Этот метод выбирается автоматически, когда это уместно.

0
Все ответы на вопрос 3
1
47

Это просто мое понимание идеи WordPress File API. Если оно неверно, пожалуйста, понизьте рейтинг :)

Хорошо. Когда вы загружаете файл, у этого файла есть владелец. Если вы загружаете файл через FTP, вы входите в систему, и файл будет принадлежать пользователю FTP. Поскольку у вас есть учетные данные, вы можете изменять эти файлы через FTP. Владелец обычно может выполнять, удалять, изменять и т.д. этот файл. Конечно, вы можете изменить это, поменяв права доступа к файлу.

Если вы загружаете файл с помощью PHP, файл будет принадлежать пользователю Linux, под которым выполняется PHP. Этот пользователь теперь может редактировать, удалять, выполнять и т.д. файл. Это нормально, пока только вы являетесь пользователем, который выполняет PHP на вашей системе.

Давайте предположим, что вы находитесь на "плохо" настроенном shared-хостинге. Множество людей запускают свои PHP-сайты на этой системе. Допустим, только один пользователь Linux выполняет PHP для всех этих людей. Один из вебмастеров на этом shared-хостинге имеет плохие намерения. Он видит вашу страницу и вычисляет путь к вашей установке WordPress. Например, WP_DEBUG установлен в true, и появляется сообщение об ошибке, такое как:

[warning] /var/www/vhosts/userxyz/wp-content/plugins/bad-plugin/doesnt-execute-correctly.php on line 1

"Ха!" — говорит злоумышленник. Давайте проверим, установил ли этот парень FS_METHOD в direct, и напишем скрипт вроде:

<?php
unlink( '/var/www/vhosts/userxyz/wp-content/plugins/bad-plugin/doesnt-execute-correctly.php' );
?>

Поскольку только один пользователь выполняет PHP, и этот же пользователь используется злоумышленником, он может изменять/удалять/выполнять файлы в вашей системе, если вы загрузили их через PHP и тем самым сделали владельцем пользователя PHP.

Ваш сайт взломан.

Или, как сказано в Codex:

Во многих хостинг-системах веб-сервер работает под другим пользователем, чем владелец файлов WordPress. В этом случае процесс записи файлов от пользователя веб-сервера приведет к тому, что результирующие файлы будут принадлежать учетной записи пользователя веб-сервера, а не реальной учетной записи пользователя. Это может привести к проблеме безопасности в ситуациях shared-хостинга, где несколько пользователей используют один и тот же веб-сервер для разных сайтов.

27 мая 2015 г. 15:38:33
Комментарии

Итак, как FS_METHOD помогает в этом?

Jānis Elmeris Jānis Elmeris
19 июн. 2021 г. 14:49:08
2
39

Каков риск?

На плохо настроенном shared-хостинге PHP всех пользователей выполняется от одного и того же пользователя (например, apache для примера). Такая конфигурация удивительно распространена.

Если вы используете такой хостинг и устанавливаете плагины в WordPress через прямой доступ к файлам, все файлы ваших плагинов будут принадлежать пользователю apache. Другой пользователь на этом же сервере сможет атаковать ваш сайт, написав PHP-скрипт, который внедрит вредоносный код в ваши файлы плагинов. Он загрузит свой скрипт на свой сайт и запросит его URL. Ваш код будет успешно скомпрометирован, потому что его скрипт выполняется от имени apache — того же пользователя, которому принадлежат ваши файлы плагинов.

Какое отношение имеет FS_METHOD 'direct'?

Когда WordPress нужно установить файлы (например, плагин), он использует функцию get_filesystem_method(), чтобы определить, как получить доступ к файловой системе. Если вы не определили FS_METHOD, WordPress выберет метод по умолчанию, в противном случае он будет использовать ваш выбор, если это возможно.

По умолчанию WordPress попытается определить, находитесь ли вы в опасной среде, подобной описанной выше. Если он решит, что всё безопасно, то использует метод 'direct'. В этом случае WordPress создаст файлы напрямую через PHP, и они будут принадлежать пользователю apache (в нашем примере). В противном случае он переключится на более безопасный метод, например, запросит SFTP-данные и создаст файлы от вашего имени.

FS_METHOD = 'direct' принудительно заставляет WordPress пропустить проверку на риск и всегда создавать файлы через метод 'direct'.

Зачем тогда использовать FS_METHOD = 'direct'?

К сожалению, логика WordPress для определения опасной среды несовершенна и может выдавать как ложные срабатывания, так и пропускать реальные угрозы. Упс. Проверка включает создание файла и сравнение его владельца с владельцем родительской директории. Предполагается, что если пользователи совпадают, PHP выполняется от вашего аккаунта, и установка плагинов от его имени безопасна. Если владельцы разные, WordPress считает, что PHP работает от общего аккаунта, и прямой метод небезопасен. К сожалению, оба предположения — всего лишь догадки, которые часто оказываются неверными.

Вы можете использовать define('FS_METHOD', 'direct' ); в случае ложного срабатывания, например, когда вы работаете в доверенной команде, где все участники загружают файлы через свои аккаунты, а PHP выполняется от отдельного пользователя. WordPress решит, что это опасная среда, и не станет использовать 'direct' режим. На самом деле сервер используется только доверенными пользователями, поэтому прямой метод безопасен. В таком случае стоит принудительно включить define('FS_METHOD', 'direct' );, чтобы WordPress записывал файлы напрямую.

14 июл. 2016 г. 23:02:41
Комментарии

Спасибо @mark, это было очень полезно! Возможно, вам нужно обновить ссылку на get_filesystem_method() на эту: https://developer.wordpress.org/reference/functions/get_filesystem_method/

szegheo szegheo
8 янв. 2021 г. 17:42:03

Так в чем же фактическая разница между (результатами использования) FS_METHOD, если говорить о владельце установленных файлов плагина?

Jānis Elmeris Jānis Elmeris
18 июн. 2021 г. 17:28:51
0

Существует "правильно настроенная" ситуация, когда использование 'direct' приведёт к проблемам.

Также возможно настроить общий хостинг WordPress с разными пользователями для выполнения PHP и владения файлами/каталогами. В итоге файлы принадлежат пользователю user1, а PHP-код выполняется от имени php-user1.

В такой ситуации взломанные плагины или код ядра (a) не смогут записывать (или даже читать, в зависимости от прав) в каталоги других пользователей; (b) не смогут записывать файлы этого пользователя и, следовательно, не смогут добавить троянский код в ядро или код плагинов.

Поэтому если хостинг настроен таким образом, вы ДОЛЖНЫ использовать FTP для обновлений, и метод 'direct' не будет работать.

Если вы установите 'direct' в wp-config.php, а пользователь, от имени которого выполняется PHP, не имеет прав на запись, вы получите сообщения "Update Failed" (Обновление не удалось) без всплывающего окна с запросом FTP-данных.

24 февр. 2017 г. 00:56:11