Критична уязвимост в BeyondCart — задължителен ъпдейт за всички клиенти
В края на миналата седмица забелязахме критична zero-day уязвимост (CVE-2025-8570 с оценка 9.8) в REST API на плъгина BeyondCart (BeyondCart Connector), която позволяваше неавтентикирани заявки да достъпват и модифицират данни за потребители. При определена последователност това може да доведе до ескалиране на привилегии и сдобиване с администраторски акаунт в сайта ви – както се случи в нашия казус.
Самата уязвимост е открита на 10 септември от потребителя kr0d и е публикувана в базите на WordFence и PatchStack. Лошото в случая е, че имаме доказателства, че се използва активно буквално от 11 септември, затова – още преди да продължите да четете, ъпдейтнете модула.
Атаката протича на няколко етапа
- първоначално разузнаване на публични endpoint-и (в нашия случай от Индонезия – пълен списък на IP адресите по-долу),
- експлоатация с PUT заявка за промяна на администраторски акаунт (подмяна на имейл и парола)
- последвано от вход в админ панела
- деактивиране на BeyondCart Connector (хакерите не искат някой да ги надхака, явно)
- инсталиране на WP File Manager и качване на модната версия на ядрото на WordPress, в която има persistent backdoor – class-action.php
- модификация на functions.php на темата и добавка: скрипт за ексфилтриране на администраотски акаунти
- прикриване на следите от атаката
Причината за казуса
Уведомихме веднага екипа на BeyondCart. Те потвърдиха проблема и вече са премахнали уязвимия код от публичното хранилище. Към момента плъгинът е временно недостъпен за изтегляне в WordPress.org, докато тече проверка.
Коренът на проблема е липсата на правилна последователност: автентикацията трябва да се валидира преди проверката на разрешенията за даден customer ID. В сегашната реализация endpoint-ът може да върне данни и за неаутентифицирани потребители, което отваря врата за по-нататъшна ескалация.
public function user_permissions_check( $request ) {
$id = (int) $request['id'];
if(!isset($request['id'])) {
$id = (int) $request['customer'];
}
if ( get_current_user_id() != $id ) {
return new WP_Error( 'BeyondCart', __( 'Sorry, you are not allowed to do this.', "grind-mobile-app" ), array( 'status' => rest_authorization_required_code() ) );
}
return true;
} За какво да се оглеждате
- Ако имате версия на плъгина, по-ниска от 3.Х и той е деактивиран, без да знаете защо – най-вероятно сте компрометирани
- Провете администраторските акаунти – ако броят на администраторите, които виждате в списъка с потребители, не съвпада с този, който виждате до линка Администратори в таба – най-вероятно има компрометиран акаунт
- Проверете директорията wp-content/plugins – ако в нея видите нещо като hide-user или hide-user.php, най-вероятно сте засегнати, а вътре ще видите потребителското име на вече създадения администратоски акаунт
Самият плъгин е делистнат без предупреждение от WordPress – които дори не са уведомили авторите му за уязвимостта (а може би трябваше, за да бъде своевременно отстранена). Според екипа разработчици, вече седмица се чака да се качи одобрената версия на модула в публичното репо с плъгини на платформата.
Какво да правите
Ако използвате BeyondCart, ъпдейтнете плъгина незабавно до версия 3.Х (може да я получите директно от авторите му, след като се свържете с тях тук). След това:
- сменете всички администраторски пароли;
- завъртете AUTH_KEY и SALT стойностите в wp-config.php (wp config shuffle-salts в WP CLI конзолата – като това ще изиска от всички ваши клиенти да се логнат);
- активирайте двуфакторна автентикация а администратори;
- сканирайте файловата система и базата за скрити потребители и непознати скриптове;
- провете за заявки от следните IP адреси:2400:9800:16c:6071:e181:be8:5a56:ce88
172.81.132.152
Поуката е ясна — дори „малки“ грешки в проверките могат да имат сериозни последствия, когато REST API е публично достъпен. Препоръчваме на всички клиенти да въведат мониторинг, WAF правила за ограничаване на PUT/POST заявки и одит на външните интеграции.