Повідомлення про безпеку Ultimate Member
Якщо ви отримали від мене електронний лист із посиланням на цю сторінку, це сталося тому, що ваш
сайт, судячи з усього, використовує версію Ultimate Member (плагіна членства та профілів
користувачів для WordPress від Ultimate Member, який розташований у ваших файлах у
/wp-content/plugins/ultimate-member/), що потрапляє в діапазон, уражений відомою проблемою
безпеки. Ця сторінка пояснює, у чому полягає проблема, як з’ясувати, чи стосується вона вашого
сайту, як дізнатися свою версію, не давши себе заплутати, і до якої версії оновитися.
Проблема має ідентифікатор CVE-2026-19423: це неавтентифікована слабкість підвищення привілеїв у формах реєстрації та профілю плагіна. Вона уражає версії Ultimate Member з 2.6.7 по 2.12.1 і виправлена у 2.13.0, випущеній 24 серпня 2026 р. Якщо ви використовуєте версію з цього діапазону, оновіть Ultimate Member до 2.13.0 або новішої. Для цієї проблеми не опубліковано оцінку CVSS (ідентифікатор присвоєно WPScan без вектора серйозності), тому я не називатиму вам жодної, і мені не відомий публічний код експлойта для неї.
Версії, старші за 2.6.7, цією проблемою не уражені, і тут я хочу бути точним, а не дозволяти повідомленню звучати ширше, ніж воно є. Це не вада, наявна від початків плагіна: шлях у коді, на якому вона ґрунтується, з’явився у 2.6.7. Тож установка, старша за 2.6.7, тут не є ціллю, і сайтам із такою версією я не писав. Якщо ваша версія виявиться нижчою за 2.6.7, ви можете не зважати на це повідомлення щодо цієї проблеми (хоча підтримувати настільки відсталий плагін в актуальному стані варто з інших причин).
Насамперед застереження, яке визначає, наскільки це важливо для вашого сайту, бо я волію сказати його прямо, ніж дозволити повідомленню звучати масштабніше, ніж воно є: ця проблема сягає лише того сайту, де одна з ваших форм реєстрації або профілю Ultimate Member пропонує людині, що її заповнює, вибір ролі, і де реєстрація відкрита для всіх. Стандартне налаштування Ultimate Member не розміщує селектор ролі на формі реєстрації (адміністратор має додати його навмисно), тому багато сайтів з ураженою версією взагалі не наражені. Я можу дізнатися версію вашого плагіна з загальнодоступного файлу, але не бачу, як побудовані ваші форми і чи відкрита реєстрація, тому це повідомлення є запобіжним попередженням, а не підтвердженим висновком про ваш сайт.
Кілька слів про терміновість, бо це умовне повідомлення. Якщо жодна з ваших форм Ultimate Member не дозволяє відвідувачеві обрати роль, оновлення належить до звичайного обслуговування плагінів. Якщо якась дозволяє, а реєстрація відкрита, поставтеся до оновлення як до пріоритету: у такій конфігурації відвідувач, що реєструє собі обліковий запис, міг би присвоїти цьому запису підвищені привілеї, потенційно аж до рівня, еквівалентного адміністратору, без жодного попереднього доступу до вашого сайту. Там, де це застосовно, наслідки серйозні, тому я і пишу, замість того щоб відкласти це як малозначуще; але застосовно це лише за наведених вище умов, а оновлення усуває проблему незалежно від них.
Це вада плагіна, а не ядра WordPress. Повністю оновлений WordPress не захищає вас, якщо сам плагін Ultimate Member перебуває на ураженій версії.
Чи справжнє це повідомлення?
Так. Це добросовісне повідомлення в межах відповідального розголошення від незалежного дослідника безпеки. Я не прошу у вас грошей, паролів чи доступу до сайту і не намагався зламати його, зареєструватися на ньому чи будь-що експлуатувати.
Усе, що я зробив, це переглянув сторінки та файли, які ваш сайт віддає кожному відвідувачеві (так само публічно, як і вашу головну сторінку), і записав номер версії, який публікує плагін. Я навмисно не створював обліковий запис, не надсилав форм реєстрації чи профілю, не входив у систему і нічого не надсилав ураженій функціональності. Ніщо в цій перевірці не торкається ваших даних, панелі адміністратора чи будь-якої приватної частини сайту (докладніше в розділі Що я робив і чого не робив нижче).
Якщо ви хочете перевірити, хто я, перегляньте контактні дані внизу цієї сторінки та сторінку Про мене.
Чому це важливо
Ultimate Member формує сторінки реєстрації, входу та профілів учасників на дуже багатьох сайтах WordPress. Коли хтось реєструється, плагін вирішує, яку роль має отримати новий обліковий запис. На формі з селектором ролі він має приймати лише ті ролі, які цю форму було налаштовано дозволяти.
В уражених версіях, коли список дозволених ролей такої форми виявляється порожнім, плагін більше не відкидає роль, надіслану відвідувачем. Натомість він зберігає це значення і перевіряє його лише за ролями, які взагалі існують на вашому сайті, а не за ролями, які мала пропонувати форма. Наслідок такий: відвідувач, що реєструє собі обліковий запис, міг спрямувати його до ролі, якої ніколи не мав отримати, аж до рівня, еквівалентного адміністратору.
Передумова, повторена тому, що саме її найлегше неправильно зрозуміти в обидва боки: потрібні селектор ролі на публічній формі та відкрита реєстрація. Ані те, ані інше не є типовим налаштуванням. Штатна форма реєстрації Ultimate Member не містить поля ролі, тому на типовій установці тут нічого досягати. Там, де адміністратор додав поле ролі й залишив реєстрацію відкритою, бар’єр рівно такий, як відповідь на питання, хто може надіслати цю форму, а за відкритої реєстрації це будь-хто.
Я описую це на рівні, потрібному власникові сайту для дій, і не далі. Я не публікую деталей, які дозволили б комусь відтворити проблему, і прошу вас не пробувати це ані на своєму сайті, ані на чужому. Читання номера версії та перевірка власних форм, як описано нижче, дає все, що потрібно для рішення, що робити.
Якщо в моєму листі згадувалася ця проблема, це означає, що версія, яку повідомляє ваш сайт, перебуває в діапазоні від 2.6.7 до 2.12.1. Я не перевіряв, чи саме ваш сайт піддається експлуатації, і не бачу, як побудовані ваші форми. Усе, що я спостерігав, це версія.
Чи стосується це мене?
Це вирішують два питання, у такому порядку.
Перше: чи пропонує якась із ваших форм вибір ролі за відкритої реєстрації?
Це вирішальне питання, і відповісти на нього можете лише ви, бо воно залежить від того, як побудовані ваші форми, а ззовні цього не видно. Перевірка цілком безпечна і є головною метою цієї сторінки.
- У майстерні WordPress перейдіть до Ultimate Member, потім Форми (Forms) і по черзі відкрийте кожну форму реєстрації та профілю.
- Перегляньте поля кожної форми в пошуках поля вибору ролі (випадного списку або набору варіантів, що дозволяє людині, яка реєструється, обрати роль; іноді воно підписане «Роль»). На більшості сайтів його немає, бо стандартна форма реєстрації його не містить.
- Перевірте, чи відкрита реєстрація: Налаштування, потім Загальні, потім Членство, прапорець «Будь-хто може зареєструватися» (ядро WordPress), а також чи доступна відвідувачам ваша форма реєстрації Ultimate Member.
- Якщо вибір ролі не пропонує жодна форма, ця проблема не сягає вашого сайту навіть на ураженій версії, хоча оновитися все одно варто в межах звичайного обслуговування.
- Якщо вибір ролі пропонує будь-яка форма і реєстрація відкрита, поставтеся до оновлення як до пріоритету (див. Як оновитися). Якщо оновитися негайно неможливо, проміжний крок полягає в тому, щоб прибрати поле ролі з усіх загальнодоступних форм реєстрації та профілю або закрити публічну реєстрацію, поки ви не оновитеся. Справжнім виправленням є оновлення.
Будь ласка, не намагайтеся відтворити проблему ні на своєму сайті, ні на чужому; для відповіді на питання вище це не потрібно.
Друге: яка версія у вас працює?
Вам не обов’язково вірити мені на слово. Є два публічні способи дізнатися версію і один усередині майстерні, і вони мають збігатися.
З панелі адміністратора WordPress (авторитетне джерело):
- Увійдіть до майстерні WordPress (зазвичай за адресою
yourdomain.com/wp-admin). - Перейдіть до Плагіни, потім Встановлені плагіни.
- Знайдіть Ultimate Member, запис, тека якого називається
ultimate-member, і запишіть версію, зазначену під назвою.
З публічного маніфесту (вхід не потрібен): відкрийте
yourdomain.com/wp-content/plugins/ultimate-member/readme.txt
у браузері та прочитайте рядок Stable tag: ближче до початку. Це і є публічне джерело, яке
читав я. Якщо за цією адресою повертається «не знайдено», спробуйте README.txt великими
літерами: деякі хостинги чутливі до регістру, а окремі пакети постачають файл із назвою великими
літерами.
З вихідного коду сторінки (вхід не потрібен): перегляньте вихідний код головної сторінки та знайдіть власні таблиці стилів плагіна рівно за цими шляхами:
/wp-content/plugins/ultimate-member/assets/css/um-styles.min.css?ver=...
/wp-content/plugins/ultimate-member/assets/css/um-profile.min.css?ver=...
Число ?ver=, приєднане до цих файлів, є власною версією плагіна. Ultimate Member типово
завантажує ці таблиці стилів на кожній публічній сторінці, незалежно від того, чи показує сторінка
розділ учасників, тому головної сторінки зазвичай достатньо.
Пастка, якої тут варто уникнути, і потрапити в неї легко. Ultimate Member постачає вбудовані
копії кількох сторонніх бібліотек усередині власної теки плагіна, і кожна з них несе свій
власний, зовсім не пов’язаний номер версії. У вихідному коді сторінки можуть траплятися бібліотека
обрізання зображень із ?ver=1.6.1, Font Awesome із ?ver=6.5.2 або Select2 із ?ver=3.6.2, і
все за шляхами, що починаються з теки плагіна Ultimate Member. Оператор, який шукає у вихідному
коді теку плагіна і читає перше-ліпше значення ?ver=, легко може піти з одним із цих чисел, що
не має жодного стосунку до версії плагіна. Читайте версію лише з власних таблиць стилів плагіна з
префіксом um- (um-styles, um-profile, um-account тощо) та ігноруйте будь-які інші ?ver=
на сторінці. Якщо з вихідного коду взагалі не вдається отримати читабельне число, це звична річ і
ні про що не свідчить: плагіни кешування та оптимізації регулярно прибирають значення ?ver=;
скористайтеся тоді readme.txt або екраном адміністратора.
Потім застосуйте це правило, пам’ятаючи, що версії порівнюються чисельно, а не за абеткою, тому 2.12.1 новіша за 2.6.7, хоча «12» як текст виглядає меншим за «6»:
- з 2.6.7 по 2.12.1: уражена, із застереженням щодо форм вище. Оновіться до 2.13.0 або новішої.
- 2.13.0 або новіша: щодо цієї проблеми вже виправлена. Найкращий крок полягає в тому, щоб узяти найсвіжішу доступну версію.
- Усе, що старше за 2.6.7: цією проблемою не уражене. Оновитися все одно варто в межах звичайного обслуговування.
Як оновитися
Плагін безплатний, досі публікується та активно підтримується, тому виправлення зводиться до звичайного оновлення. Найбезпечніший шлях полягає в оновленні через сам WordPress, попередньо зробивши резервну копію:
- Зробіть резервну копію сайту (файли та базу даних), перш ніж вносити зміни. Більшість хостинг-провайдерів пропонують резервні копії одним кліком, або скористайтеся плагіном резервного копіювання WordPress.
- В адміністративній частині WordPress перейдіть до Майстерня, потім Оновлення, або Плагіни, потім Встановлені плагіни. Якщо оновлення Ultimate Member є в списку, встановіть його звідси.
- Якщо ви віддаєте перевагу командному рядку, WP-CLI робить те саме:
wp plugin update ultimate-member(команда використовує назву теки, а не показувану назву). - Якщо оновлення не з’являється, найновіший випуск можна отримати просто зі сторінки плагіна в каталозі WordPress.org, Ultimate Member, і оновитися через Плагіни, потім Додати новий плагін, потім Завантажити плагін.
- Після оновлення підтвердьте новий номер версії (2.13.0 або новішу) кроками вище і зареєструйте тестовий обліковий запис (або перевірте наявні процеси членства та реєстрації), щоб переконатися, що все й далі працює як очікується.
Заразом варто переконатися, що ядро WordPress і решта ваших плагінів актуальні: той самий принцип стосується всіх.
Після оновлення: чи не використали це вже проти вас?
Оновлення до 2.13.0 або новішої закриває проблему, і для багатьох сайтів на цьому завдання вичерпане. Ця сторінка є запобіжним повідомленням, а не звітом про інцидент: я не маю відомостей про те, чи щось відбувалося на вашому сайті, і не дивився.
Одну подальшу перевірку варто виконати, і вона обумовлена тим самим питанням про форми. Оскільки результатом цієї проблеми, там де вона застосовна, є обліковий запис із підвищеними привілеями, то, якщо на вашому сайті була форма реєстрації або профілю з вибором ролі за відкритої реєстрації та ураженої версії, варто переконатися, що ніхто не скористався цим для створення облікового запису, якого не мало би бути:
- Перегляньте облікові записи користувачів, особливо адміністраторів. У розділі Користувачі, потім Всі користувачі, відфільтруйте за роллю Адміністратор (та іншими ролями з високими привілеями) і пошукайте облікові записи, яких ви не впізнаєте, або записи, створені приблизно в період використання ураженої версії чи після нього. Зверніть увагу на нещодавно зареєстрованих користувачів, чия роль вища за роль звичайного учасника.
- Якщо ви знайшли обліковий запис, який не можете пояснити, поставтеся до нього як до будь-якої іншої підозри на несанкціонований доступ: видаліть його або понизьте роль, примусово скиньте паролі адміністраторів, а якщо у вашій організації є команда ІТ-безпеки, залучіть її.
- Якщо все виглядає як належить, і особливо якщо жодна форма від початку не пропонувала вибір ролі, достатньо самого оновлення.
Для ясності щодо рамок: це самоперевірка, а не заява про те, що ваш сайт було атаковано. Це повідомлення ґрунтується на номері версії, а не на будь-яких свідченнях інциденту.
Що я робив і чого не робив
Щоб бути повністю прозорим щодо перевірки, яка стоїть за моїм листом: я читав лише файли, які ваш
сайт і так віддає кожному відвідувачеві, а саме головну сторінку та записані в ній адреси таблиць
стилів Ultimate Member, а також публічний readme.txt плагіна всередині
wp-content/plugins/ultimate-member/. Я не отримував доступу до вашої панелі адміністратора
WordPress, бази даних, налаштувань форм чи будь-якої приватної частини сайту.
Зокрема, я ніколи не створював облікового запису, не надсилав ваших форм реєстрації чи профілю, не входив у систему і нічого не надсилав ураженій функціональності. Нічого не було надіслано, протестовано чи використано. Тут це важливо, бо надсилання реєстрації близьке до тієї самої дії, якої стосується ця проблема, тому «я цього не торкався» становить усю різницю між розголошенням і вторгненням.
Я також навмисно не публікую деталей, які допомогли б комусь скористатися цією проблемою. Опис вище зупиняється на рівні, потрібному власникові сайту, і я не даю посилань на жодний код proof-of-concept.
Це спостереження, засноване на версії: ваш сайт повідомляє версію в діапазоні від 2.6.7 до 2.12.1. Це не твердження, що ваш сайт піддавався експлуатації в момент моєї перевірки. Оскільки проблема залежить від того, як побудовані ваші форми і чи відкрита реєстрація (чого я не бачу), сайт в ураженому діапазоні цілком може бути взагалі не наражений, а сайт у цьому діапазоні може бути окремо захищений іншими засобами, наприклад міжмережевим екраном веб-застосунків або перенесеним назад виправленням. Якщо ви вже оновилися або усунули проблему в інший спосіб, жодних дій не потрібно, і я перепрошую за турботу.
У мене немає вебмайстра / я не даю ради
Якщо не ви обслуговуєте сайт, будь ласка, передайте цю сторінку тому, хто це робить (вашому веброзробникові, агенції чи хостинг-провайдеру). Вони швидко впізнають наведені вище кроки.
Якщо ви обслуговуєте сайт самостійно і застрягли, я радо безплатно підкажу правильний напрямок. Зв’яжіться зі мною за контактами нижче.
Контакти
Evan Harris, дослідник безпеки
- Електронна пошта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я звертаюся щодо подібних проблем виключно для того, щоб допомогти операторам захистити їхні сайти. Якщо ви волієте, щоб із вами більше не зв’язувалися, просто повідомте мені, і я це поважу.
Джерела
Офіційні повідомлення та відстеження
Виробник / плагін