Какие проблемы безопасности следует учитывать при установке FS_METHOD в значение "direct" в wp-config?
Недавно я столкнулся с проблемой невозможности установить плагин 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, что может вызвать проблемы с безопасностью на плохо настроенных хостингах. Этот метод выбирается автоматически, когда это уместно.

Это просто мое понимание идеи 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-хостинга, где несколько пользователей используют один и тот же веб-сервер для разных сайтов.

Каков риск?
На плохо настроенном 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 записывал файлы напрямую.

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

Существует "правильно настроенная" ситуация, когда использование 'direct' приведёт к проблемам.
Также возможно настроить общий хостинг WordPress с разными пользователями для выполнения PHP и владения файлами/каталогами. В итоге файлы принадлежат пользователю user1, а PHP-код выполняется от имени php-user1.
В такой ситуации взломанные плагины или код ядра (a) не смогут записывать (или даже читать, в зависимости от прав) в каталоги других пользователей; (b) не смогут записывать файлы этого пользователя и, следовательно, не смогут добавить троянский код в ядро или код плагинов.
Поэтому если хостинг настроен таким образом, вы ДОЛЖНЫ использовать FTP для обновлений, и метод 'direct' не будет работать.
Если вы установите 'direct' в wp-config.php, а пользователь, от имени которого выполняется PHP, не имеет прав на запись, вы получите сообщения "Update Failed" (Обновление не удалось) без всплывающего окна с запросом FTP-данных.
