Уведомление о безопасности Drag and Drop Multiple File Upload for Contact Form 7
Если вы получили от меня письмо со ссылкой на эту страницу, значит ваш сайт, по всей видимости,
использует версию плагина Drag and Drop Multiple File Upload for Contact Form 7 (плагин
WordPress, указанный на WordPress.org под этим названием, автор codedropz, который лежит у вас
в файлах по пути /wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/),
попадающую в затронутый диапазон известной проблемы безопасности. На этой странице описано, в чём
состоит проблема, как определить, применима ли она вообще к вашему сайту, как проверить свою версию,
не будучи введённым в заблуждение, и как обновиться.
Обратите внимание: это не версия для WooCommerce. Тот же автор публикует отдельный плагин,
“Drag and Drop Multiple File Upload for WooCommerce” (папка
drag-and-drop-multiple-file-upload-for-woocommerce), являющийся самостоятельным продуктом со
своей собственной нумерацией версий. Если плагин в ваших файлах относится к WooCommerce, а не к
Contact Form 7, эта страница не о нём. Всё, что написано ниже, касается только дополнения
Contact Form 7.
Прежде всего, самое важное о данном уведомлении: версия из затронутого диапазона сама по себе ещё не означает, что ваш сайт уязвим. Описанная ниже проблема проявляется только на сайтах с определённым типом поля загрузки, а как настроены ваши формы, снаружи увидеть невозможно:
- Проблема достижима только через форму Contact Form 7, в которой одно из полей загрузки этого плагина настроено на приём файлов любого типа.
- Поле, которое ограничивает принимаемые типы конкретным набором (например, изображениями или PDF), этой проблеме не подвержено, даже на затронутой версии. Ограничение принимаемых типов также используется по умолчанию, если для поля они не указаны.
Я могу узнать версию вашего плагина из публичного файла, но не могу увидеть настройки ваших форм, поэтому это уведомление является предупреждением на всякий случай, а не подтверждённой находкой о вашем сайте.
Проблема отслеживается как CVE-2026-18781: это уязвимость в обработке загрузки файлов плагином, доступная без аутентификации. Она затрагивает версии с 1.3.9.3 по 1.3.9.8 и исправлена в 1.3.9.9. Если у вас установлена затронутая версия, обновите Drag and Drop Multiple File Upload for Contact Form 7 до 1.3.9.9 или новее и следите за тем, чтобы сам Contact Form 7 тоже был обновлён.
Пару слов о срочности, поскольку это условное уведомление. Если ни одно из ваших полей загрузки не принимает файлы любого типа, обновление является обычным плановым обслуживанием. Если же хотя бы одно поле настроено так, пожалуйста, отнеситесь к обновлению как к приоритетной задаче: при такой настройке уязвимость может позволить посетителю без какой-либо учётной записи сохранить на вашем сервере произвольный файл по своему выбору, который сервер затем может выполнить, что способно привести к полному захвату сайта.
Это уязвимость плагина, а не ядра WordPress, и она не связана с самим Contact Form 7. Полностью обновлённые WordPress и Contact Form 7 не защитят вас, если само это дополнение остаётся на затронутой версии.
Это письмо настоящее?
Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к сайту и не пытался в него проникнуть, отправить какую-либо из ваших форм или что-либо на него загрузить.
Я лишь посмотрел общедоступные файлы, которые ваш сайт отдаёт любому посетителю (так же, как публична ваша главная страница), и отметил номер версии, который публикует плагин. Я специально не отправлял никакую форму, не загружал файл и не приближался к обработчику загрузки плагина. Эта проверка никак не затрагивает ваши данные, вашу панель управления или какую-либо закрытую часть сайта (подробнее ниже, в разделе Что я делал и чего не делал).
Если вы хотите убедиться, кто я, контактные данные приведены внизу этой страницы и на странице Обо мне.
Почему это важно
Этот плагин добавляет в формы Contact Form 7 поля для перетаскивания файлов при загрузке, чтобы посетители могли прикреплять файлы при отправке формы: заявку о приёме на работу, обращение в поддержку, фотографию. Чтобы это оставалось безопасным, плагин должен отклонять опасные типы файлов.
В затронутых версиях эту проверку можно было обойти. Плагин анализировал имя загружаемого файла, чтобы решить, допустим ли его тип, затем изменял это имя и сохранял файл без повторной проверки изменённого имени. Поскольку имя менялось уже после одобрения, его можно было составить так, чтобы проверяемая версия выглядела безобидной, а фактически сохранённая версия таковой не являлась, позволяя недопустимому типу файла попасть на сервер. Там, где сервер затем обрабатывает такой файл как то, что можно выполнить, результатом становится выполнение чужого файла на вашем сайте.
Отсюда следуют два вывода, которые тянут в разные стороны. Первый: это имеет значение только там, где в форме есть поле загрузки, настроенное на приём файлов любого типа. Там, где каждое поле загрузки ограничено конкретным набором типов, замаскированный файл не соответствует ни одному разрешённому типу и отклоняется, так что сайт в таком состоянии через эту проблему недостижим. Второй: там, где поле «принимать что угодно» всё же существует, не требуется ни учётной записи, ни пароля, ни чьего-либо содействия: форма открыта для всех по замыслу.
Я описываю это на том уровне, который нужен владельцу сайта, чтобы действовать, и не глубже. Я не публикую подробностей, которые позволили бы кому-то это воспроизвести, и прошу вас не пробовать это ни на своём сайте, ни на чужом. Чтение настроек вашей формы и номера вашей версии, как описано ниже, даёт всё необходимое, чтобы решить, что делать.
Если в моём письме упоминалась эта проблема, значит версия, о которой сообщает ваш сайт, попадает в затронутый диапазон. Я не проверял, эксплуатируем ли именно ваш сайт, и не могу увидеть, как настроены ваши формы. Всё, что я наблюдал, это версия.
Затронут ли я?
Всё решают два вопроса, в этом порядке.
Первый: принимает ли какое-либо поле загрузки файлы «любого типа»?
Это решающий вопрос, и ответить на него можете только вы. Проверить свои собственные формы совершенно безопасно, и в этом весь смысл данной страницы.
- Войдите в консоль WordPress и откройте в боковом меню пункт Контакты (Contact Form 7).
- Откройте каждую форму, где предусмотрена загрузка файла, и найдите поле загрузки этого плагина (оно добавляется рядом со стандартными тегами Contact Form 7).
- Посмотрите, ограничивает ли это поле принимаемые типы файлов.
- Если каждое поле загрузки ограничено конкретными типами (например,
jpg,png,pdf), эта проблема не достигает вашего сайта, даже на затронутой версии. Обновиться всё же стоит в рамках обычного планового обслуживания. - Если хотя бы одно поле загрузки настроено на приём файлов любого типа, проблема касается вас, и обновиться следует незамедлительно. Ограничить это поле теми типами, которые вам действительно нужны, само по себе разумный шаг, но именно обновление устраняет проблему.
Пожалуйста, не пытайтесь воспроизвести эту проблему ни на своём сайте, ни на чужом; чтобы ответить на вопрос выше, это не требуется.
Второй: какая у вас версия?
Вам не обязательно верить мне на слово. Для этого плагина есть один конкретный способ проверки, который вас введёт в заблуждение, так что эту часть стоит прочитать внимательно.
В панели управления WordPress (главный источник):
- В консоли WordPress перейдите в Плагины, затем Установленные плагины.
- Найдите Drag and Drop Multiple File Upload - Contact Form 7, запись, папка которой
называется
drag-and-drop-multiple-file-upload-contact-form-7, и посмотрите версию, указанную под названием.
Из публичного манифеста (без входа): откройте в браузере
вашдомен.ru/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/readme.txt.
Строка Stable tag: ближе к началу и есть версия, о которой сообщает ваша установка; это один
из публичных источников, которые я читаю.
Из исходного кода страницы (без входа): откройте исходный код какой-либо страницы вашего сайта и найдите один из клиентских файлов плагина строго по следующим путям:
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/css/dnd-upload-cf7.css?ver=...
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/js/codedropz-uploader-min.js?ver=...
Число после ?ver= у этих файлов именно в этой папке и есть собственная версия плагина. Для
этого плагина оно в точности соответствует выпуску, поэтому я считаю такую проверку надёжной.
Ловушка, которой здесь стоит избегать. Отдельный плагин автора для WooCommerce поставляется с
файлом, имеющим точно такое же имя, codedropz-uploader-min.js, но в своей собственной
папке (drag-and-drop-multiple-file-upload-for-woocommerce) и с никак не связанным номером
версии. Если вы считываете версию из исходного кода страницы, убедитесь, что папка в пути именно
drag-and-drop-multiple-file-upload-contact-form-7, а не папка WooCommerce; иначе вы прочитаете
версию совершенно другого продукта.
Затем примените это правило, учитывая, что версии сравниваются численно, а не по алфавиту:
- С 1.3.9.3 по 1.3.9.8: потенциально затронуто, в зависимости от ответа на вопрос о поле загрузки выше. Обновляйтесь сейчас.
- 1.3.9.9 или новее: уже исправлено в части этой проблемы. Лучше всего установить самую свежую доступную версию.
- Старше 1.3.9.3: этой проблемой не затронуто. Описанная выше конкретная уязвимость появилась начиная с 1.3.9.3. Тем не менее выпуск такой давности сильно отстал по всем остальным параметрам, и обновиться стоит и по общим соображениям.
Если ни одна из проверок выше не дала читаемой версии, в этом нет ничего необычного: плагины
кеширования или оптимизации нередко удаляют значение ?ver=, а сами файлы появляются только там,
где плагин загружается. Экран в панели управления из шага один даёт ответ всегда.
Как обновиться
Самый безопасный путь: обновиться средствами самого WordPress, предварительно сделав резервную копию.
- Сделайте резервную копию сайта (файлы и база данных), прежде чем что-либо менять. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, либо воспользуйтесь плагином резервного копирования для WordPress.
- В панели управления WordPress перейдите в Консоль, затем Обновления, либо в Плагины, затем Установленные плагины. Если обновление этого плагина есть в списке, установите его отсюда.
- Если вам удобнее командная строка, WP-CLI делает то же самое:
wp plugin update drag-and-drop-multiple-file-upload-contact-form-7(команда использует имя папки). - Если обновление не появляется, последний выпуск можно взять напрямую со страницы плагина в каталоге WordPress.org, Drag and Drop Multiple File Upload for Contact Form 7, и обновиться через Плагины, затем Добавить плагин, затем Загрузить плагин.
- После обновления подтвердите новый номер версии (1.3.9.9 или новее) описанными выше способами и проверьте, что ваши формы и загрузка файлов по-прежнему работают как обычно.
Раз уж вы этим занялись, стоит убедиться, что ядро WordPress, Contact Form 7 и остальные ваши плагины тоже обновлены, поскольку тот же принцип относится ко всем.
После обновления
Обновление до 1.3.9.9 или новее закрывает проблему, и для большинства сайтов на этом всё заканчивается. Эта страница является предупреждением на всякий случай, а не отчётом об инциденте: у меня нет возможности узнать, произошло ли что-то на вашем сайте, и я не проверял.
Стоит рассмотреть один дополнительный шаг, и он зависит от того же вопроса о поле загрузки. Если на вашем сайте была форма с полем загрузки, принимающим файлы любого типа, пока сайт работал на затронутой версии, то теоретически файл мог быть сохранён на вашем сервере. Обновление закрывает уязвимость, но не удаляет то, что уже могло быть сохранено, поэтому в таком случае разумны несколько обычных мер предосторожности:
- Просмотрите каталог загрузок (обычно находится в
wp-content/uploads/) на предмет файлов, которые вы не узнаёте, особенно таких, что не относятся к документам или изображениям, которые ваши формы должны принимать. - Проверьте учётные записи администраторов, недавние входы и все активные сеансы на предмет всего, что вы не можете объяснить.
- Сбросьте пароли на учётных записях администраторов. Разумным дополнительным шагом будет
перегенерировать секретные ключи и «соли» WordPress в
wp-config.php(новые значения находятся в одном клике в официальном генераторе секретных ключей, и их замена разово завершает сеансы всех пользователей).
Если вы обнаружите что-то, что вас беспокоит, правильным ответом будет отнестись к этому так же, как к любому другому подозрению на несанкционированный доступ. Если ни в одной из ваших форм не было поля загрузки, принимающего файлы любого типа, достаточно одного лишь обновления.
Что я делал и чего не делал
Чтобы полностью прояснить, на чём основана проверка за моим письмом: я читал только файлы, которые
ваш сайт и так отдаёт каждому посетителю, а именно публичный файл readme.txt плагина, вашу
главную страницу и адреса файлов, указанные на этой странице. Я не обращался ни к панели
управления WordPress, ни к базе данных, ни к какой-либо закрытой части сайта.
В частности, я ни разу не отправлял ни одну из ваших форм, не загружал файл и не касался обработчика загрузки плагина. Ничего не было отправлено, протестировано или проэксплуатировано. Здесь это важнее, чем на большинстве подобных страниц, потому что загрузка файла и есть то самое действие, которого касается эта проблема, так что «я к этому не прикасался» и составляет всю разницу между раскрытием и вторжением.
Я также намеренно не публикую подробностей, которые помогли бы кому-то воспользоваться этой проблемой. Описание выше останавливается на уровне, нужном владельцу сайта, и я не даю ссылок ни на какой демонстрационный код.
Это наблюдение по версии: ваш сайт сообщает версию из затронутого диапазона. Это не утверждение, что ваш сайт был эксплуатируем на момент проверки. Поскольку проблема зависит от настройки формы, которую я не могу увидеть, сайт из этого диапазона вполне может быть вообще не уязвим, а также отдельно может быть защищён другими средствами, например межсетевым экраном веб-приложений.
У меня нет вебмастера / я не справляюсь
Если сайтом занимаетесь не вы, перешлите, пожалуйста, эту страницу тому, кто им занимается (вашему веб-разработчику, агентству или хостинг-провайдеру). Шаги выше он узнает сразу.
Если вы ведёте сайт сами и застряли, я с удовольствием бесплатно подскажу вам направление. Напишите по контактам ниже.
Контакты
Evan Harris, исследователь безопасности
- Эл. почта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.
Источники
Официальные бюллетени и отслеживание
Разработчик / плагин