Уведомление о безопасности Welcart e-Commerce
Если вы получили от меня письмо со ссылкой на эту страницу, то это потому, что ваш веб-сайт, судя по
всему, работает на версии Welcart e-Commerce (бесплатного плагина электронной коммерции для
WordPress от Welcart / Collne, который находится в ваших файлах по пути
/wp-content/plugins/usc-e-shop/), попадающей в диапазон, затронутый известной проблемой
безопасности. Эта страница объясняет, в чём заключается проблема, насколько она важна для вашего
сайта, как прочитать вашу версию, не будучи введённым в заблуждение, и как обновиться.
Проблема - это CVE-2026-19914, неаутентифицированный хранимый межсайтовый скриптинг (XSS). Она затрагивает каждый выпуск вплоть до 2.12.1 включительно и исправлена в 2.12.2, выпущенной 31 августа 2026 года. Если вы используете 2.12.1 или что-либо более старое, обновите Welcart до 2.12.2 или новее. Проблеме присвоена оценка CVSS 7.2 (High) по шкале Wordfence. Мне не известно о каком-либо публичном коде эксплуатации для неё.
Нет ни одной более старой версии, которая была бы безопасной. Это не изъян, который появился где-то в середине истории плагина и был позже исправлен. Вывод без экранирования, лежащий в основе этой проблемы, присутствовал на протяжении всей истории плагина - я подтвердил, что он присутствует ещё в версии 1.7.0, - поэтому «моя установка слишком стара, чтобы быть затронутой» здесь не выход. Единственные версии, которые не затронуты, - это 2.12.2 и новее.
Прежде всего - несколько слов о том, что представляет собой эта проблема и как она реализуется, потому что я предпочитаю изложить это прямо, а не позволять уведомлению звучать серьёзнее, чем оно есть. Это уязвимость хранимого межсайтового скриптинга, и скрипт, который она может выполнить, выполняется в браузере администратора магазина, а не посетителя. Чтобы это произошло, должны совпасть две отдельные вещи: тот, кто оформляет заказ в качестве гостя, должен отправить специально составленное значение в настраиваемое поле заказа при оформлении, а затем администратор должен открыть этот заказ на экране редактирования заказов в вашей административной части WordPress. Отправленное значение сохраняется вместе с заказом и отображается на этом экране без экранирования, поэтому оно выполняется при просмотре заказа.
Я могу прочитать версию вашего Welcart из общедоступного файла, но я не могу видеть ваши заказы, не могу видеть, содержит ли какой-либо заказ специально составленное значение, и не могу видеть, делал ли кто-либо это на самом деле на вашем сайте. Поэтому это уведомление - предупредительная мера, основанная на номере вашей версии, а не подтверждённый вывод о вашем сайте.
Стоит также быть точным в том, чем эта проблема является, а чем нет. Межсайтовый скриптинг, срабатывающий в сеансе администратора, - это реальная проблема, которую стоит исправить: скрипт, выполняющийся, пока администратор вошёл в систему, может действовать с привилегиями этого администратора всё время, пока страница открыта. Но сам по себе это не полный захват сайта. Это не удалённое выполнение кода на вашем сервере и не способ для неаутентифицированного незнакомца просто выдать себе учётную запись администратора. Это уже, чем проблемы полной компрометации, о которых я пишу в других местах, и зависит и от того, что заказ отправлен, и от того, что администратор его открыл, поэтому я предпочитаю честно обозначить масштаб, а не оставлять вас с более пугающим впечатлением, чем то, что подкрепляют факты.
Это изъян плагина, а не изъян ядра WordPress. Полностью обновлённый WordPress не защищает вас, если сам плагин Welcart находится на затронутой версии.
Это письмо настоящее?
Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к вашему сайту и не пытался взломать его, оформить на нём заказ или что-либо использовать в своих целях.
Всё, что я сделал, - это просмотрел страницы и файлы, которые ваш веб-сайт отдаёт каждому посетителю (точно так же, как ваша главная страница является общедоступной), и отметил номер версии, который публикует плагин. В частности, я не оформлял заказ, не отправлял ничего через ваше оформление покупки, не входил в систему и не отправлял ничего в затронутую функцию. Ничто в этой проверке не касается ваших данных, вашей административной части, ваших заказов или любой закрытой части вашего сайта (подробнее в разделе Что я делал и чего не делал ниже).
Если вы хотите проверить, кто я, см. контактные данные внизу этой страницы и страницу Обо мне.
Почему это важно
Welcart превращает сайт WordPress в интернет-магазин и является самым широко используемым плагином электронной коммерции для WordPress в Японии. Часть того, что он делает, - это сбор данных клиента при оформлении покупки, включая любые настраиваемые поля заказа, которые магазин добавил для сбора дополнительной информации, и их сохранение вместе с заказом, чтобы персонал мог просмотреть их позже.
В затронутых версиях значение, отправленное в настраиваемое поле заказа во время оформления покупки в качестве гостя, сохраняется вместе с заказом, а затем отображается на экране редактирования заказов в вашей административной части WordPress без экранирования. Экранирование - это то, что для отображения превращает обратно в обычный текст то, что выглядит как разметка. Без него значение, составленное так, чтобы содержать активное содержимое, отображается не как текст, а выполняется браузером того администратора, который открывает этот заказ. Поскольку гость может оформить заказ, не входя в систему, тому, кто предоставляет это значение, вообще не нужна учётная запись на вашем сайте.
Предварительное условие, повторю его, потому что это та часть, которую вероятнее всего понять неверно в любую из сторон: для этого нужно и чтобы специально составленный заказ был отправлен, и чтобы администратор его открыл. Оно не срабатывает на вашей витрине и ничего не делает обычным посетителям. То, чего оно достигает, - это сеанс администратора магазина, просматривающего заказы в wp-admin.
Я описываю это на уровне, который нужен владельцу сайта, чтобы действовать, и не далее. Я не публикую подробности, которые позволили бы кому-либо это воспроизвести, и попросил бы вас не пробовать это против вашего собственного сайта или чьего-либо ещё. Чтение номера вашей версии, как описано ниже, говорит вам всё, что нужно, чтобы решить, что делать.
Если в моём письме упоминалась эта проблема, это означает, что версия, о которой сообщает ваш сайт, - 2.12.1 или более старая. Я не проверял, уязвим ли именно ваш сайт, и не могу видеть ваши заказы. Всё, что я наблюдал, - это версию.
Затронут ли я?
Всё сводится к одному вопросу: какую версию Welcart вы используете?
Из административной части WordPress (авторитетный источник):
- Войдите в вашу панель управления WordPress (обычно по адресу
yourdomain.com/wp-admin). - Перейдите в Плагины, затем Установленные плагины.
- Найдите Welcart e-Commerce, запись, папка которой -
usc-e-shop, и посмотрите версию, показанную под её названием.
Из общедоступного манифеста (вход не требуется): откройте
yourdomain.com/wp-content/plugins/usc-e-shop/readme.txt
в браузере и прочитайте строку Stable tag: ближе к началу. Если этот адрес возвращает «не
найдено», попробуйте README.txt с заглавными буквами - некоторые хостинги учитывают регистр, а
несколько пакетов поставляют файл с заглавными буквами.
Из исходного кода вашей страницы (вход не требуется): просмотрите исходный код вашей главной страницы и найдите собственную таблицу стилей плагина точно по этому пути:
/wp-content/plugins/usc-e-shop/css/usces_default.css?ver=...
Номер ?ver=, прикреплённый к этому файлу, - это версия самого плагина, и это тот общедоступный
источник, который я читал. Welcart загружает эту таблицу стилей на своих страницах магазина, поэтому
страница магазина или корзины - надёжное место, чтобы её найти. Читайте версию только из
usces_default.css: другие файлы, вписанные в вашу страницу, несут собственные, совершенно
не связанные номера ?ver=, и чтение первого попавшегося может оставить вас с версией другого
программного обеспечения. Если вы вообще не можете получить читаемый номер из исходного кода страницы,
это обычное дело и ни о чём не говорит - плагины кэширования и оптимизации регулярно удаляют значение
?ver= из URL-адресов ресурсов, - поэтому используйте вместо этого readme.txt или экран
администрирования.
Затем примените это правило и учтите, что версии сравниваются численно, а не по алфавиту, так что 2.12.1 новее, чем 2.9.1, хотя «12» и выглядит меньше, чем «9», как текст:
- 2.12.1 или старше: затронута. Обновите до 2.12.2 или новее. Нет порога, ниже которого более старый выпуск снова становится безопасным.
- 2.12.2 или новее: уже исправлена в том, что касается этой проблемы. Установка последней доступной версии - лучший выбор.
Как обновиться
Плагин бесплатный, всё ещё публикуется и активно поддерживается, поэтому исправление - это обычное обновление. Самый безопасный путь - обновиться через сам WordPress, предварительно сделав резервную копию:
- Сделайте резервную копию вашего сайта (файлы и база данных) перед внесением изменений. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, или используйте плагин резервного копирования WordPress.
- В администрировании WordPress перейдите в Консоль, затем Обновления, или в Плагины, затем Установленные плагины. Если обновление Welcart есть в списке, установите его отсюда.
- Если вы предпочитаете командную строку, WP-CLI делает то же самое:
wp plugin update usc-e-shop(команда использует имя папки, а не отображаемое имя). - Если обновление не появляется, вы можете получить последнюю версию непосредственно со страницы плагина в каталоге WordPress.org, Welcart e-Commerce, и обновиться через Плагины, затем Добавить новый плагин, затем Загрузить плагин.
- После обновления подтвердите новый номер версии (2.12.2 или новее) с помощью приведённых выше шагов и откройте недавний заказ в вашей административной части, чтобы убедиться, что экраны заказов по-прежнему отображаются нормально.
Выпуск 2.12.2 также устранил другие проблемы безопасности помимо этой, поэтому обновиться стоит в любом случае. Раз уж вы там, стоит подтвердить, что ядро WordPress и ваши другие плагины актуальны, поскольку тот же принцип применим ко всем им.
После обновления
Обновление до 2.12.2 или новее закрывает проблему, и для большинства сайтов это вся задача. Эта страница
- предупредительное уведомление, а не отчёт об инциденте: у меня нет никакой видимости того, произошло ли что-то на вашем сайте, и я не смотрел.
Одну небольшую вещь стоит сделать, пока обновление свежее:
- Подтвердите, что версия действительно изменилась, той из приведённых выше проверок, которая была проще всего, и откройте заказ в вашей административной части, чтобы убедиться, что экраны заказов по-прежнему отображаются.
Вы заметите, что на этой странице нет контрольного списка в духе «считайте, что вас скомпрометировали», и это сделано намеренно, а не по недосмотру. То, что даёт эта проблема, - это скрипт, выполняющийся в браузере администратора, и только там, где специально составленный заказ был отправлен, а администратор затем его открыл. Она не выполняет код на вашем сервере и сама по себе не создаёт учётную запись администратора, поэтому аудит администраторов и смена паролей, которые я рекомендую после изъяна класса захвата, здесь были бы несоразмерны. Обновите, подтвердите и продолжайте работу. Если у вас есть конкретная причина полагать, что это было использовано против вашего сайта, - чего это уведомление, основанное лишь на номере версии, никак не подтверждает, - то отнестись к входам администраторов с обычной осторожностью разумно, но одна лишь версия этого не требует.
Что я делал и чего не делал
Чтобы быть полностью прозрачным относительно проверки, стоящей за моим письмом: я читал только файлы,
которые ваш сайт уже отдаёт каждому посетителю, а именно вашу главную страницу и адрес таблицы стилей
Welcart, вписанный в неё, а также общедоступный readme.txt плагина внутри
wp-content/plugins/usc-e-shop/. Я не получал доступа к вашей административной части WordPress,
вашей базе данных, вашим заказам или любой закрытой части сайта.
В частности, я никогда не оформлял заказ, не отправлял ничего через ваше оформление покупки, не входил в систему и не отправлял ничего в затронутую функцию. Ничего не было отправлено, испытано или использовано в своих целях. Здесь это важно, потому что отправка специально составленного значения при оформлении покупки очень близка к тому самому действию, которого касается эта проблема, поэтому «я это не трогал» - это вся разница между раскрытием и вторжением.
Я также намеренно не публикую подробности, которые помогли бы кому-либо воспользоваться этой проблемой. Приведённое выше описание останавливается на уровне, который нужен владельцу сайта, и я не даю ссылок ни на какой код-доказательство концепции.
Это наблюдение, основанное на версии: ваш сайт сообщает о версии 2.12.1 или более старой. Это не утверждение, что ваш сайт был уязвим в момент моей проверки. Поскольку эта проблема зависит и от отправки специально составленного заказа, и от его открытия администратором - вещей, которых я не могу видеть, - сайт в затронутом диапазоне вполне может не быть уязвимым, а сайт в этом диапазоне может быть отдельно защищён другими средствами, такими как межсетевой экран веб-приложений или обратно портированное исправление. Если вы уже обновились или иным образом устранили это, никаких действий не требуется, и я приношу извинения за беспокойство.
У меня нет вебмастера / я не справляюсь
Если вы не тот, кто обслуживает сайт, пожалуйста, перешлите эту страницу тому, кто это делает (вашему веб-разработчику, агентству или хостинг-провайдеру). Они быстро узнают приведённые выше шаги.
Если вы обслуживаете сайт сами и застряли, я буду рад бесплатно помочь вам сориентироваться в верном направлении. Свяжитесь со мной, используя контактные данные ниже.
Контакты
Evan Harris, исследователь безопасности
- Эл. почта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.
Источники
Официальные бюллетени и отслеживание
Разработчик / плагин