Якщо ви отримали від мене лист із посиланням на цю сторінку, то це тому, що ваш сайт, вочевидь, використовує версію 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 (Високий), за оцінкою Wordfence. Мені не відомо про жодний публічний код експлойту для неї.

Немає жодної старішої версії, яка була б безпечною. Це не вада, яку внесли на якомусь етапі історії плагіна й пізніше виправили. Виведення без екранування, яке лежить в основі цієї проблеми, присутнє впродовж усієї історії плагіна - я підтвердив, що воно присутнє аж до версії 1.7.0 - тож “моя інсталяція занадто стара, щоб бути ураженою” тут не працює як виправдання. Єдині версії, які не уражені, це 2.12.2 і новіші.

Перш за все, кілька слів про те, чим є ця проблема і як вона реалізується, бо я краще скажу це прямо, ніж дозволю повідомленню здатися серйознішим, ніж воно є. Це збережений міжсайтовий скриптинг, і скрипт, який він може запустити, виконується у браузері адміністратора магазину, а не у браузері відвідувача. Щоб це сталося, мають збігтися дві окремі речі: той, хто оформлює замовлення як гість, має надіслати підготовлене значення в користувацьке поле замовлення під час оформлення, а потім адміністратор має відкрити це замовлення на екрані редагування замовлень у панелі адміністрування вашого WordPress. Надіслане значення зберігається разом із замовленням і виводиться на цьому екрані без екранування, тож воно запускається, коли замовлення переглядають.

Версію вашого Welcart я можу прочитати з публічного файлу, але не можу побачити ваші замовлення, не можу побачити, чи містить якесь замовлення підготовлене значення, і не можу побачити, чи хтось справді зробив це на вашому сайті. Тож це повідомлення є радше запобіжним попередженням на основі номера вашої версії, ніж підтвердженим висновком про ваш сайт.

Варто також точно визначити, чим ця проблема є, а чим ні. Міжсайтовий скриптинг, який спрацьовує в сеансі адміністратора, це справжня проблема, яку варто виправити: скрипт, що працює, поки адміністратор увійшов у систему, може діяти з правами цього адміністратора весь той час, поки сторінка відкрита. Але сам по собі це не повне захоплення сайту. Це не віддалене виконання коду на вашому сервері, і це не спосіб для неавтентифікованого стороннього просто надати собі обліковий запис адміністратора. Це вужче за проблеми повного компрометування, про які я пишу в інших місцях, і воно залежить як від того, що замовлення було надіслано, так і від того, що адміністратор його відкриє, тож я краще чесно вкажу масштаб, ніж залишу у вас враження страшніше, ніж підтверджують факти.

Це вада плагіна, а не ядра WordPress. Повністю оновлений WordPress не захистить вас, якщо сам плагін Welcart має уражену версію.

Чи справжнє це повідомлення?

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

Я лише переглянув сторінки й файли, які ваш сайт віддає кожному відвідувачеві (так само, як публічною є ваша головна сторінка), і занотував номер версії, який публікує плагін. Я свідомо не оформлював жодного замовлення, не надсилав нічого через ваше оформлення замовлення, не входив у систему і не надсилав нічого до ураженої функції. Ця перевірка жодним чином не торкається ваших даних, вашої панелі адміністрування, ваших замовлень чи будь-якої закритої частини сайту (докладніше нижче, у розділі Що я робив і чого не робив).

Якщо ви хочете перевірити, хто я, контактні дані наведено внизу цієї сторінки та на сторінці Про мене.

Чому це важливо

Welcart перетворює сайт на WordPress на інтернет-магазин і є найпоширенішим плагіном електронної комерції для WordPress в Японії. Частиною того, що він робить, є прийом даних клієнта під час оформлення замовлення, включно з будь-якими користувацькими полями замовлення, які магазин додав для збору додаткової інформації, і збереження їх разом із замовленням, щоб персонал міг переглянути їх пізніше.

В уражених версіях значення, надіслане в користувацьке поле замовлення під час гостьового оформлення, зберігається разом із замовленням і потім відображається на екрані редагування замовлень у панелі адміністрування вашого WordPress без екранування. Екранування це те, що перетворює текст, який має вигляд розмітки, назад на звичайний текст для відображення. Без нього значення, підготовлене так, щоб містити активний вміст, відображається не як текст, а натомість запускається браузером того адміністратора, який відкриває це замовлення. Оскільки гість може оформити замовлення без входу в систему, людині, яка надає це значення, взагалі не потрібен обліковий запис на вашому сайті.

Передумова, яку я вказую прямо, бо саме цю частину найлегше зрозуміти неправильно в обидва боки: для цього потрібно і щоб підготовлене замовлення було надіслано, і щоб адміністратор його відкрив. Воно не спрацьовує у вашій вітрині і нічого не робить звичайним відвідувачам. Чого воно досягає, так це сеансу адміністратора магазину, який переглядає замовлення у wp-admin.

Я описую це на тому рівні, який потрібен власникові сайту, щоб діяти, і не далі. Я не публікую подробиць, які дозволили б комусь відтворити проблему, і прошу вас не пробувати це ні на власному сайті, ні на чужому. Читання номера вашої версії, як описано нижче, дає все, що потрібно, щоб вирішити, що робити.

Якщо в моєму листі йшлося про цю проблему, це означає, що версія, про яку повідомляє ваш сайт, це 2.12.1 або старіша. Я не перевіряв, чи можна експлуатувати саме ваш сайт, і не можу побачити ваші замовлення. Усе, що я спостерігав, це версія.

Чи стосується це мене?

Усе зводиться до одного питання: яку версію Welcart ви використовуєте?

У панелі адміністрування WordPress (головне джерело):

  1. Увійдіть до консолі WordPress (зазвичай за адресою yourdomain.com/wp-admin).
  2. Перейдіть до Плагіни, потім Встановлені плагіни.
  3. Знайдіть 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= з адрес файлів - у такому разі скористайтеся readme.txt або екраном адміністрування.

Далі застосуйте це правило, зважаючи на те, що версії порівнюються числово, а не за алфавітом, тож 2.12.1 новіша за 2.9.1, навіть якщо текстово “12” виглядає меншим за “9”:

  • 2.12.1 або старіша: уражена. Оновіться до 2.12.2 або новішої. Немає такої межі, нижче якої старіший випуск знову стає безпечним.
  • 2.12.2 або новіша: уже виправлена щодо цієї проблеми. Найкращим кроком буде взяти найновішу доступну версію.

Як оновитися

Плагін безкоштовний, досі публікується й активно підтримується, тож виправлення полягає у звичайному оновленні. Найбезпечніший шлях: оновлюватися засобами самого WordPress, попередньо зробивши резервну копію:

  1. Зробіть резервну копію сайту (файлів і бази даних), перш ніж щось змінювати. Більшість хостинг-провайдерів пропонують резервне копіювання в один клік, або скористайтеся плагіном резервного копіювання для WordPress.
  2. У панелі адміністрування WordPress перейдіть до Консоль, потім Оновлення, або до Плагіни, потім Встановлені плагіни. Якщо оновлення Welcart є в переліку, встановіть його звідси.
  3. Якщо вам зручніше в командному рядку, WP-CLI робить те саме: wp plugin update usc-e-shop (команда використовує назву теки, а не назву, що відображається).
  4. Якщо оновлення не з’являється, ви можете взяти останній випуск безпосередньо зі сторінки плагіна в каталозі WordPress.org, Welcart e-Commerce, і оновитися через Плагіни, потім Додати плагін, потім Завантажити плагін.
  5. Після оновлення підтвердіть новий номер версії (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, дослідник безпеки

Я звертаюся з такими питаннями винятково для того, щоб допомогти операторам захистити свої сайти. Якщо ви волієте більше не отримувати від мене листів, просто скажіть, і я це врахую.

Джерела

Офіційні бюлетені та відстеження

Розробник / плагін