Блог

Взломать Joomla за два запроса: CVE-2026-48907 в плагине JCE и как уже сейчас проверить свой сервер

Joomla_JCE_CVE-2026-48907_webshell
CVE / Joomla / Linux / Безопасность

Взломать Joomla за два запроса: CVE-2026-48907 в плагине JCE и как уже сейчас проверить свой сервер

Ваш Joomla-сайт работает без публичной регистрации. Нет форума, нет кабинета пользователя — посетители только читают. Вы справедливо считаете, что нечего взламывать: нет входа — нет угрозы. А 3 июня 2026 года разработчик самого популярного WYSIWYG-редактора для Joomla выпустил экстренный патч с формулировкой «critical vulnerability in all earlier versions» — и выяснилось, что именно такие сайты без регистрации под удар и попали. Не потому что их атаковали точечно. А потому что ботнет методично обходит весь интернет и кладёт webshell на каждый Joomla-сайт с уязвимой версией JCE — без какой-либо аутентификации, двумя HTTP-запросами.

CVE-2026-48907 — уязвимость типа Improper Access Control в JCE (Joomla Content Editor), самом устанавливаемом расширении для Joomla. Затронуты все версии до 2.9.99.5. Патч вышел 3 июня 2026 года. Рабочий эксплойт опубликован на GitHub 9 июня. 16 июня CISA добавила CVE-2026-48907 в каталог Known Exploited Vulnerabilities — это правительственная подтверждение активной эксплуатации в дикой природе, которое обязывает федеральные агентства США патчиться немедленно, и которое CISA выдаёт только при наличии реальных доказательств атак. Если у вас Joomla с JCE — читайте дальше. Быстро.

ЧТО ТАКОЕ JCE И ПОЧЕМУ ЭТО ВАЖНО

JCE расшифровывается как Joomla Content Editor — это визуальный редактор, который заменяет стандартный текстовый редактор Joomla на полноценный WYSIWYG с поддержкой вставки изображений, файлов, таблиц и медиа. По данным mysites.guru, это самое устанавливаемое расширение для Joomla вообще — не «одно из популярных», а именно самое распространённое. Разработчик — Widget Factory Limited, небольшая независимая команда под руководством Ryan Demmer, которая поддерживает JCE уже больше пятнадцати лет. Уязвимость обнаружил и сообщил Uwe Flottemesch из fc-hosting.de; David Jardin оказал техническое содействие в исправлении.

Ключевая концепция JCE — профили редактора. Профиль определяет что конкретная группа пользователей может делать в редакторе: какие типы файлов загружать, в какие директории, какие расширения разрешены. Например, авторам разрешены только JPG и PNG в папку images/, а администраторам — всё подряд. Это нормальная, правильная архитектура контроля доступа. Проблема в том, что механизм импорта профилей оказался доступен без аутентификации.

КАК РАБОТАЕТ УЯЗВИМОСТЬ

В JCE есть задача импорта профиля: POST-запрос к index.php?option=com_jce&task=profiles.import. По замыслу, этот эндпоинт должен быть доступен только авторизованному администратору — чтобы переносить настройки редактора между сайтами или восстанавливать профили из резервной копии. По факту, до версии 2.9.99.5 никакой проверки авторизации там не было. Любой HTTP-клиент мог отправить POST на этот URL — и Joomla послушно создавала новый профиль редактора.

Этого уже достаточно для атаки. Атакующий создаёт профиль, который разрешает загружать файлы с расширением .php при отключённой MIME-валидации. Затем через тот же JCE — уже через легитимную функцию загрузки файлов, которая теперь использует вредоносный профиль — закачивает на сервер PHP-webshell. Весь процесс: два HTTP-запроса, ноль кликов, ноль учётных данных.

КАК ЭТО ЭКСПЛУАТИРУЕТСЯ

Ботнет работает по одному и тому же сценарию — mysites.guru наблюдал одинаковый почерк на сотнях взломанных сайтов. Первый запрос: POST к index.php?option=com_jce&task=profiles.import создаёт вредоносный профиль. Профиль получает машиночитаемое имя вида J940401 или J938560, иногда откровенно — Pwned с описанием RCE via JCE. Ordering профиля выставляется в -99999 — чтобы он встал первым в списке выше всех легитимных профилей и применялся к следующим запросам. В параметрах профиля разрешены расширения php и phtml, MIME-валидация отключена.

Второй запрос: POST через функцию загрузки файлов JCE — теперь уже с использованием созданного профиля — загружает webshell. Если путь загрузки в профиле не задан, файл по умолчанию попадает в папку images/. Оттуда его можно запустить через браузер. Webshells, которые mysites.guru находил на скомпрометированных сайтах: классические конструкции eval(gzinflate(base64_decode(...))), командные шеллы через shell_exec, небольшие файлы-маркеры с именем Nxploited, дропперы формата .xml.php. В логах веб-сервера атака оставляет характерную двухзапросную подпись: POST к task=profiles.import, за которым немедленно следует POST к method=upload, оба возвращают 200, оба без аутентификации, часто с маркером id=RCExxx.

Всё описанное выше — автоматизированный ботнет, не таргетированная атака. Размер сайта, наличие или отсутствие регистрации, объём трафика — не имеет значения. Сканируются все Joomla-инсталляции подряд.

КАК ПРОВЕРИТЬ СВОЙ СЕРВЕР

Первым делом — логи веб-сервера. Ищите POST-запросы к эндпоинту импорта профилей без авторизации. На nginx это будет в access.log, самый простой способ:

grep "profiles.import" /var/log/nginx/access.log

Если используете Apache — замените путь на /var/log/apache2/access.log. Если логи в нестандартном месте — смотрите конфиг виртуального хоста. Любое попадание в вывод — это либо уже успешная атака, либо попытка. Самая ранняя запись показывает когда сайт впервые атаковали — именно от этой даты нужно отсчитывать резервную копию. Имейте в виду: многие хостинги хранят логи только несколько недель, ротация может уже скрыть следы.

Проверьте профили редактора в панели Joomla: Компоненты → JCE Editor → Профили редактора. Незнакомые профили с машиногенерированными именами, с ordering равным -99999 или очень большим отрицательным числом — признак атаки. Разрешение загружать .php или phtml при отключённой MIME-валидации — это именно то что создаёт ботнет. Если нашли такой профиль — не удаляйте сразу. Сначала сохраните его параметры, они помогут определить временной диапазон компрометации.

Проверьте директории на наличие чужих PHP-файлов — в норме в images/, media/, tmp/ не должно быть PHP-файлов вообще. Поиск по всему дереву сайта от корня:

find /var/www/html -path "*/images/*.php" -o \
  -path "*/media/*.php" -o \
  -path "*/tmp/*.php" | sort

Также стоит проверить файлы с .php в имени среди других расширений — это классический трюк дропперов:

find /var/www/html -name "*.php.*" 2>/dev/null

Если что-то нашли — не удаляйте немедленно. Сначала сохраните копию как улику (дата создания, содержимое), потом обновитесь до JCE 2.9.99.7, и только потом удаляйте — иначе ботнет восстановит всё пока уязвимость открыта.

ХРОНОЛОГИЯ

3 июня 2026 — разработчик JCE выпускает версию 2.9.99.5 с патчем CVE-2026-48907. Официальный advisory говорит: «critical vulnerability in all earlier versions», активная эксплуатация уже идёт на момент выпуска патча.

8 июня 2026 — выходит JCE 2.9.99.6 с дополнительным усилением защиты после полного аудита кода.

9 июня 2026 — рабочий эксплойт публикуется на GitHub. С этого момента атаки становятся полностью автоматизированными — любой может запустить готовый скрипт против всего интернета.

16 июня 2026 — CISA добавляет CVE-2026-48907 в каталог Known Exploited Vulnerabilities под официальным названием «Widget Factory Joomla Content Editor Improper Access Control Vulnerability». Федеральные агентства США получают дедлайн на патч.

18 июня 2026 — выходит JCE 2.9.99.7. Версия 2.9.99.6 содержала ложноположительное срабатывание при определении PHP-тегов, которое блокировало загрузку легитимных изображений и файлов. 2.9.99.7 исправляет эту регрессию, добавляет дополнительное усиление pipeline загрузки и импорта профилей, а также новую опцию Permitted User Groups — whitelist групп пользователей, которым разрешено назначать и импортировать профили. Текущая рекомендованная версия — 2.9.99.7.

ПОЧЕМУ ЭТО ВАЖНО

Эта атака неудобна своей простотой. Для эксплуатации не нужна учётная запись, не нужно угадывать пароль, не нужно ждать пока посетитель кликнет на ссылку. Два HTTP POST-запроса — и на сервере есть webshell. С этого момента у атакующего есть интерактивный доступ к файловой системе и возможность выполнять команды от имени процесса веб-сервера. Дальше — в зависимости от конфигурации сервера: чтение configuration.php с учётными данными базы данных, загрузка дополнительных инструментов, поиск других сайтов на том же хосте.

Масштаб атаки показывает как быстро эксплойт распространился: mysites.guru начал с трёх взломанных сайтов в одном портфеле, и в течение нескольких дней видел сотни. Автоматизированный сканнер с публичным PoC за несколько недель способен обойти весь видимый интернет. CISA добавляет CVE в каталог KEV только при наличии верифицированных свидетельств реальных атак — это не предупредительная мера, это констатация факта.

Отдельного внимания заслуживает то, что JCE — это именно тот компонент, который есть почти на любом Joomla-сайте с нестандартным редактором. Если сайт создавался агентством или фрилансером, вероятность наличия JCE очень высокая. Это не специализированный плагин для узкой аудитории — это базовая инфраструктура, которую устанавливают по умолчанию.

ЧТО ДЕЛАТЬ

Если сайт ещё не проверен на компрометацию — сначала проверьте логи и профили (секция выше), только потом обновляйтесь. Это важный порядок: обновление закрывает входную точку, но не очищает то что уже загружено. Если сначала обновиться без проверки — можно получить закрытую уязвимость и работающий webshell одновременно.

Обновитесь до JCE 2.9.99.7 — это текущая рекомендованная версия, исправляющая и саму уязвимость, и регрессию из 2.9.99.6. Обновление делается через стандартный менеджер расширений Joomla: Система → Обновления → Расширения. Проверить текущую версию JCE через командную строку можно так — команда ищет версию в манифесте расширения прямо на диске:

grep -r "version" /var/www/html/administrator/components/com_jce/jce.xml 2>/dev/null | head -3

После обновления текущая версия JCE должна быть 2.9.99.7 или выше.

Если обновление до 2.9.99.7 невозможно из-за требований к версии PHP (нужен PHP 7.4 и Joomla 3.9 или новее), разработчик выпустил бесплатный пакет исправлений для веток 2.7.x, 2.8.x и 2.9.x. Он доступен на официальном сайте JCE в разделе Downloads → Security Patch. Этот патч закрывает только уязвимость, без дополнительного усиления из 2.9.99.6, и не очищает уже скомпрометированный сайт. Это временная мера — план миграции на поддерживаемую версию всё равно нужен, потому что end-of-life PHP оставляет вас уязвимыми к другим неисправленным проблемам.

Если при проверке нашли вредоносный профиль или файлы: сохраните улики, обновите JCE, удалите профиль через интерфейс Joomla, удалите загруженные через него файлы. После очистки смените пароли: администратора Joomla, базы данных, хостинга и FTP — и те же пароли на других сайтах где они повторялись. Запустите серверное сканирование на вредоносные файлы — многие хостинги предоставляют Imunify или аналогичный инструмент.

Версия JCE 2.6.x по предварительной оценке разработчика не затронута в конфигурации по умолчанию — unauthenticated импорт профилей там заблокирован. Это не проверено независимо, и ветка 2.6.x больше не поддерживается. Если вы на ней — уязвимость, возможно, не затрагивает, но другие неисправленные проблемы никуда не делись.

ВЫВОДЫ

CVE-2026-48907 — хрестоматийный пример того как одна незащищённая точка API обнуляет всю остальную безопасность сайта. Не имеет значения насколько сложный пароль у администратора. Не имеет значения что на сайте нет публичной регистрации. Один открытый эндпоинт без проверки авторизации — и сервер скомпрометирован без единого введённого пароля.

Разработчик JCE отреагировал быстро и ответственно: патч вышел, бесплатный пакет для старых версий тоже, детальный advisory опубликован. Но атаки начались до патча, PoC появился на шестой день после него, а автоматизированный ботнет не делает паузы пока вы читаете эту статью. Единственное что сейчас актуально — проверить свой сервер по инструкции выше и обновить JCE до 2.9.99.7.

Leave your thought here

Ваш адрес email не будет опубликован. Обязательные поля помечены *