Повідомлення про безпеку Bookly
Якщо ви отримали від мене лист із посиланням на цю сторінку, то це тому, що ваш сайт, вочевидь,
використовує версію Bookly (плагін WordPress для запису на послуги
bookly-responsive-appointment-booking-tool), яка потрапляє в діапазон, уражений відомою
проблемою безпеки. Ця сторінка пояснює, у чому річ, як перевірити свою версію, як оновитися та
який один крок варто зробити після оновлення.
Ідеться про CVE-2026-13395 – SQL-ін’єкцію без автентифікації в публічному сценарії запису. Уражені версії з 11.3 до 27.7; виправлено у 27.8, випущеній 10 липня 2026 року. Якщо у вас уражена версія, оновіть Bookly до 27.8 або новішої (27.9 – поточний випуск, він теж містить виправлення). Немає жодних ознак того, що цю проблему експлуатують ні проти вашого сайту, ні будь-де ще: ця сторінка – застереження з обережності, а не звіт про інцидент.
На відміну від деяких інших моїх повідомлень, це не залежить від налаштувань вашого сайту. Щоб уразливість була досяжною, не потрібно вмикати жодну опцію: уражений шлях запиту відкритий для неавторизованих відвідувачів на звичайній інсталяції. Якщо ваша версія Bookly потрапляє в уражений діапазон, оновитися варто швидко.
Це вразливість плагіна, а не ядра WordPress. Повністю оновлений WordPress не захистить вас, якщо сам плагін Bookly лишається на ураженій версії.
Чи справжнє це повідомлення?
Так. Це добросовісне повідомлення в межах відповідального розкриття від незалежного дослідника безпеки. Я не прошу у вас грошей, паролів чи доступу до сайту і не намагався до нього проникнути, щось йому надіслати чи щось експлуатувати.
Я лише переглянув загальнодоступні файли, які ваш сайт віддає кожному відвідувачеві (так само, як публічною є ваша головна сторінка), і занотував номер версії, який публікує плагін Bookly. Зокрема, я нічого не надсилав ані до вашої форми запису, ані на уражений шлях запиту, і ця перевірка не торкається ні ваших даних, ні панелі адміністрування, ні будь-якої закритої частини сайту (докладніше в розділі Що я робив і чого не робив).
Якщо ви хочете перевірити, хто я, контактні дані наведено внизу цієї сторінки та на сторінці Про мене.
Чому це важливо
Bookly – один із найпоширеніших плагінів запису на послуги для WordPress: він в офіційному каталозі з 2014 року й працює на десятках тисяч сайтів. Він публікує на відкритій частині сайту форму запису, у якій відвідувачі обирають послугу, працівника й час, не створюючи облікового запису.
В уражених версіях одне зі значень, які ця форма надсилає назад, – ідентифікатор обраного відвідувачем працівника – зберігається саме в тому вигляді, у якому надійшло, без перевірки, а згодом підставляється просто в запит до бази даних замість передавання як параметр. Той, хто надішле підготовлене значення замість звичайного ідентифікатора, може в такий спосіб змінити зміст цього запиту. Практичний наслідок: людина без облікового запису й без входу могла б прочитати з бази даних вашого сайту дані, які запит ніколи не мав повертати, зокрема хеші паролів ваших облікових записів WordPress.
Дві речі варто сказати прямо – в обидва боки.
По-перше, про співмірність: це проблема читання даних, а не захоплення сервера чи облікового запису адміністратора. Сама по собі вона не дозволяє виконати код на сервері чи увійти в панель адміністрування. Хеш пароля – не пароль: його ще треба зламати, щоб він перетворився на доступ. І свідчень експлуатації немає: організація, що присвоїла CVE, не опублікувала оцінки серйозності, проблеми немає в каталозі KEV американського агентства CISA, її показник ймовірності експлуатації (EPSS) не присвоєно, і мені не відомо про жодні повідомлення про експлуатацію.
По-друге, без применшення: між анонімним відвідувачем і цим шляхом не стоїть ані вхід у систему, ані nonce, ані будь-яке налаштування плагіна. Він досяжний на типовій інсталяції безкоштовного плагіна. Саме тому рекомендація – оновитися найближчим часом, а не відкладати до наступного технічного вікна.
Якщо в моєму листі згадувалася ця проблема, то версія, про яку повідомляє ваш сайт, потрапляє в уражений діапазон. Я не перевіряв, чи вразливий саме ваш сайт; я спостерігав лише версію.
Чи стосується це мене?
Усе зводиться до одного питання: яка у вас версія Bookly? Вірити мені на слово не треба – перевірити можна двома способами.
У панелі адміністрування WordPress (головне джерело):
- Увійдіть до консолі WordPress (зазвичай
вашдомен.ua/wp-admin). - Перейдіть до Плагіни, потім Встановлені плагіни.
- Знайдіть Bookly – запис, тека якого називається
bookly-responsive-appointment-booking-tool, – і подивіться версію під назвою.
З публічного маніфесту (без входу): відкрийте у браузері
вашдомен.ua/wp-content/plugins/bookly-responsive-appointment-booking-tool/readme.txt. Рядок
Stable tag: ближче до початку – це версія, про яку повідомляє ваша інсталяція; саме цей
публічний файл я й читав.
Далі застосуйте правило, пам’ятаючи, що версії порівнюються числово, а не за абеткою:
- З 11.3 до 27.7: уражена. Оновлюйтеся зараз.
- 27.8 або новіша: уже виправлена. Сюди належить і 27.9, яка зберігає виправлення.
- Старша за 11.3: цією проблемою не уражена. Небезпечної конструкції запиту в тих випусках не було – ідентифікатори працівників проходили через параметризований конструктор запитів плагіна. У такого старого випуску вистачає інших причин для оновлення, але це повідомлення до них не належить.
- Не читайте номери версій як текст. У Bookly двозначний старший номер, тож текстовий порядок
помиляється двічі:
3.3виглядає більшим за27.8, хоча значно старіше, а27.10виглядає меншим за27.7, хоча новіше. Порівнюйте число за числом.
Про доповнення Bookly. Платні розширення Bookly (Pro та різні пакети bookly-addon-*)
встановлюються як окремі плагіни з власними номерами версій, а адреси їхніх файлів можуть
нести версію основного плагіна замість власної. Для цього повідомлення важлива версія
основного плагіна Bookly, отримана одним із двох способів вище, – а не число, зчитане з
файлів доповнення.
Якщо ззовні ви не бачите файлів Bookly. У Bookly є налаштування, яке визначає, чи завантажуються його скрипти й стилі на кожній сторінці, чи лише на сторінках із формою запису. Якщо у вас обрано другий варіант, ззовні видно значно менше. Це налаштування впливає тільки на те, що відвідувач може побачити, – воно не визначає, чи присутня вразливість і чи є вона досяжною. Перевірте версію в панелі адміністрування.
Як оновитися
Найнадійніше оновлюватися засобами самого WordPress, попередньо зробивши резервну копію:
- Зробіть резервну копію сайту (файли й база даних) до будь-яких змін. Більшість хостингів пропонують копії в один клік, або скористайтеся плагіном резервного копіювання.
- У панелі WordPress перейдіть до Консоль, потім Оновлення, або до Плагіни та Встановлені плагіни. Якщо оновлення Bookly пропонується, встановіть його звідти.
- Якщо зручніше в командному рядку, WP-CLI робить те саме:
wp plugin update bookly-responsive-appointment-booking-tool. - Якщо оновлення не з’являється, останній випуск можна взяти просто зі сторінки плагіна в каталозі WordPress.org, Bookly, і оновитися через Плагіни, Додати плагін, Завантажити плагін.
- Після оновлення переконайтеся за кроками вище, що номер версії новий (27.8 або вищий), і перевірте, що форма запису та наявні записи працюють нормально.
Якщо ви користуєтеся платними доповненнями Bookly, оновіть їх разом з основним плагіном – їхні випуски зазвичай узгоджені.
Заразом варто переконатися, що ядро WordPress та інші плагіни актуальні: той самий принцип стосується всіх.
Після оновлення
Перехід на 27.8 або новішу закриває проблему, і ознак її експлуатації будь-де немає, тож жодного екстреного реагування не мається на увазі: вважати сайт скомпрометованим або вимикати його не потрібно.
Один подальший крок усе ж варто саме виконати, і він випливає прямо з того, до чого могла дотягнутися ця вразливість. Оскільки хеші паролів WordPress були серед даних, які міг повернути запит, а здобутий раніше хеш лишається корисним зловмиснику й після вашого оновлення, розумний запобіжний захід – після встановлення оновлення скинути паролі облікових записів адміністраторів. До цього природно додати два менші кроки:
- Перегляньте облікові записи адміністраторів і редакторів на предмет незнайомих – так само, як ви зазвичай переглядаєте доступ до сайту.
- Перегенеруйте секретні ключі та «солі» WordPress у
wp-config.php(нові значення – в один клік в офіційному генераторі; їх заміна одноразово завершить сеанси всіх користувачів).
Поставтеся до цього як до звичайної гігієни безпеки, а не як до реагування на інцидент.
Що я робив і чого не робив
Щоб бути цілком прозорим щодо перевірки, на якій ґрунтується мій лист: я читав лише публічні
файли, які ваш сайт і так віддає кожному відвідувачеві, а саме публічний readme.txt плагіна
Bookly і вашу головну сторінку. Я не звертався ні до панелі адміністрування WordPress, ні
до бази даних, ні до будь-якої закритої частини сайту.
Зокрема, я ніколи нічого не надсилав ані до вашої форми запису, ані на уражений шлях запиту – нічого не надсилалося, не тестувалося й не експлуатувалося. Тут це важить більше, ніж на більшості таких сторінок: вразливість і є неавтентифікованим запитом за цим шляхом, тож «я його не торкався» – уся різниця між розкриттям і вторгненням.
Це спостереження за версією: ваш сайт повідомляє версію з ураженого діапазону. Сайт у цьому діапазоні може бути вже захищений іншим чином – наприклад, міжмережевим екраном рівня застосунків або перенесеним виправленням. Це повідомлення не стверджує, що ваш сайт був вразливим у момент перевірки.
У мене немає вебмайстра / я не даю ради
Якщо сайтом опікуєтеся не ви, перешліть, будь ласка, цю сторінку тому, хто ним опікується (вашому розробнику, агенції або хостинг-провайдеру). Кроки вище він упізнає одразу.
Якщо ви ведете сайт самі й застрягли, я радо підкажу напрямок безкоштовно. Напишіть за контактами нижче.
Контакти
Evan Harris, дослідник безпеки
- Ел. пошта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я звертаюся з такими питаннями винятково для того, щоб допомогти операторам захистити свої сайти. Якщо ви волієте більше не отримувати від мене листів, просто скажіть – я це врахую.
Джерела
Офіційні бюлетені та відстеження
Розробник / плагін