Лабораторная валидация защитных механизмов и рекомендации по обнаружению для SOC по CVE-2026-48907 в Joomla JCE <= 2.9.99.4, включая телеметрию Apache/Joomla/auditd, артефакты веб-шеллов, правила Sigma, сопоставление с MITRE ATT&CK и рекомендации по смягчению последствий.
Отчёт о защитной валидации и ориентированные на SOC заметки по обнаружению для CVE-2026-48907, затрагивающего Joomla Content Editor (JCE) версий до 2.9.99.4 включительно.
Этот репозиторий документирует контролируемую лабораторную валидацию CVE-2026-48907 в Joomla JCE и сосредоточен на практической разработке правил обнаружения для команд SOC.
Цель — не предоставлять руководство по эксплуатации. Цель — показать, какие источники телеметрии были полезны при валидации, какие артефакты были созданы и как защитники могут обнаруживать эту активность и реагировать на неё.
| Область | Результат |
|---|---|
| Уязвимость | CVE-2026-48907 в Joomla Content Editor (JCE); неаутентифицированный рабочий процесс создания/импорта профилей, который может привести к загрузке PHP и выполнению кода. |
| Протестированная версия | JCE 2.9.99.4. Панель администратора Joomla показала доступное обновление до 2.9.99.7. |
| Результат в лаборатории | Валидация публичного PoC подтвердила RCE и создала PHP-веб-шелл в /tmp Joomla как jce*.xml.php. Команды выполнялись от имени www-data. |
| Наиболее ценная телеметрия | Apache access.log, Apache/PHP error.log, телеметрия auditd execve и артефакты файловой системы в joomla_html/tmp. |
| Журналы Joomla | Полезны как вспомогательный контекст, но сами по себе недостаточны. Журналы приложения Joomla не восстановили полную цепочку: эксплойт → веб-шелл → выполнение команд. |
| Приоритет для SOC | Критический для Joomla-инстансов, доступных из интернета, или Joomla-инстансов, достижимых из менее доверенных внутренних сетей. |
| Параметр | Значение |
|---|---|
| URL приложения | http://172.20.10.3:9999 |
| Контейнер Joomla | joomla-jce-lab, образ joomla:5-apache |
| Контейнер базы данных | joomla-jce-db, образ mariadb:11 |
| Проброс портов | 0.0.0.0:9999 -> 80/tcp |
| Apache | Apache/2.4.67 (Debian) |
| PHP | PHP 8.3.31 |
| MariaDB | 11.8.8-MariaDB |
| Joomla | Joomla 5.4.6 Stable |
| JCE | 2.9.99.4 |
| Источник теста | Windows 11, IP 172.20.10.2 |
| Логирование | Журналы доступа/ошибок Apache, журналы Joomla, auditd, журналы Docker, артефакты файловой системы |







Ключевой операционный вывод: журналов приложения Joomla было недостаточно.
Во время лабораторного теста журналы Joomla фиксировали контекст уровня приложения, например событие joomlafailure, но не показывали полную цепочку эксплуатации. Полезная цепочка была видна в основном в:
access.logerror.logexecvejoomla_html/tmpДля мониторинга SOC журналы Joomla следует рассматривать как вспомогательную телеметрию, а не как основной источник обнаружения данной уязвимости.
Обобщённая цепочка, наблюдавшаяся в ходе контролируемого теста:
JCE version discovery
↓
POST to Joomla JCE component
↓
PHP webshell written to Joomla /tmp
↓
HTTP request to /tmp/jce*.xml.php
↓
Command execution through webshell
↓
auditd confirms /usr/bin/dash and commands executed as www-data
Наиболее явные доказательства присутствовали в Apache access.log:
GET /plugins/editors/jce/jce.xml
GET /
POST /index.php?option=com_jce
GET /tmp/jceolxtshs3.xml.php
GET /plugins/editors/jce/jce.xml
POST /index.php?option=com_jce
GET /tmp/jce624jdcfx.xml.php
GET /tmp/jce624jdcfx.xml.php?c=id%20%26%26%20hostname%20%26%26%20pwd
GET /tmp/jce624jdcfx.xml.php?c=whoami
GET /tmp/jce624jdcfx.xml.php?c=hostname
GET /tmp/jce624jdcfx.xml.php?c=id
GET /tmp/jce624jdcfx.xml.php?c=pwd
Журнал ошибок Apache/PHP содержал ценные следы, связанные с работой парсера:
simplexml_load_string()
administrator/components/com_jce/helpers/profiles.php
RXST
RXEND
Маркеры RXST и RXEND были особенно полезными индикаторами для этого конкретного семейства PoC, поскольку они появлялись в пути обработки полезной нагрузки.
Журналы Joomla подтвердили, что логирование приложения было активным, но они не восстановили эксплуатацию:
#Software: Joomla! 5.4.6 Stable [ Kutegemea ] 26-May-2026 16:00 GMT
#Fields: datetime priority clientip category message
2026-06-18T20:37:57+00:00 INFO 172.20.10.2 joomlafailure Username and password do not match or you do not have an account yet.
Это означает, что сбор только журналов Joomla может пропустить наиболее важные доказательства эксплуатации CVE-2026-48907.
В ходе теста были созданы PHP-файлы веб-шелла в tmp Joomla:
/var/www/html/tmp/jce624jdcfx.xml.php
/var/www/html/tmp/jceolxtshs3.xml.php
Пути на стороне хоста в лаборатории:
/home/user/joomla-jce-lab/joomla_html/tmp/jce624jdcfx.xml.php
/home/user/joomla-jce-lab/joomla_html/tmp/jceolxtshs3.xml.php
Наблюдавшиеся SHA256-хеши:
b6fa303daef8aa8cb39566c73d2cb4a458efb2b1fba48052dd039d45c3beb0aa jce624jdcfx.xml.php
f8bcc802ab56b845c968ed6727228f200f8f4bcd332b8ce82c6980d93ac228fd jceolxtshs3.xml.php
Обнаружение на основе хешей следует считать низкоустойчивым, поскольку имена файлов и полезные нагрузки могут различаться. Более полезны корреляция по пути, расширению, владельцу и поведению.
auditd подтвердил, что пользователь веб-сервера выполнял команды из каталога tmp Joomla:
CWD=/var/www/html/tmp uid=www-data comm=sh exe=/usr/bin/dash
CWD=/var/www/html/tmp uid=www-data comm=id exe=/usr/bin/id
CWD=/var/www/html/tmp uid=www-data comm=hostname exe=/usr/bin/hostname
CWD=/var/www/html/tmp uid=www-data comm=whoami exe=/usr/bin/whoami
Это наиболее сильное подтверждение того, что активность была не просто сканированием, а реальным удалённым выполнением кода.
Наиболее надёжное обнаружение основано на корреляции:
GET /plugins/editors/jce/jce.xml
followed by
POST /index.php?option=com_jce
followed by
GET /tmp/jce*.xml.php
followed by
GET /tmp/jce*.xml.php?c=
and/or
auditd: www-data executes /usr/bin/dash from /var/www/html/tmp
| Серьёзность | Условие | Действие SOC |
|---|---|---|
| Низкая | GET /plugins/editors/jce/jce.xml из необычного источника | Расценивать как разведку и сопоставлять с последующими запросами. |
| Средняя | POST /index.php?option=com_jce без referer администратора или с неизвестного IP | Создать оповещение и проверить последующие запросы к /tmp. |
| Высокая | POST com_jce с последующим GET /tmp/*.php или /tmp/*.xml.php | Немедленно проверить артефакты файловой системы и журналы ошибок PHP. |
| Критическая | GET /tmp/jce*.xml.php?c= или auditd, показывающий запуск www-data оболочки/системных команд | Расценивать как подтверждённый RCE/веб-шелл, изолировать или ограничить хост и сохранить доказательства. |
/plugins/editors/jce/jce.xml
/index.php?option=com_jce
/tmp/jce[a-z0-9]{8}\.xml\.php
/tmp/.*\.(php|phtml|phar)(\?| )
cs-uri-query contains "c="
joomla_html/tmp/jce*.xml.php
/var/www/html/tmp/jce*.xml.php
RXST
RXEND
shell_exec
system
passthru
exec
$_GET['c']
Используйте их только на системах, которыми вы владеете или для исследования которых у вас есть разрешение.
grep -RniE "com_jce|profiles\.import|task=profiles|/tmp/.*\.php|RXST|RXEND" apache_logs joomla_html/administrator/logs 2>/dev/null
find ./joomla_html/tmp ./joomla_html/images ./joomla_html/media \
-type f \( -iname "*.php" -o -iname "*.phtml" -o -iname "*.phar" -o -iname "*.xml.php" \) -ls
sudo ausearch -k wwwdata_exec -i | grep -E "uid=www-data|comm=sh|/usr/bin/dash|/var/www/html/tmp|whoami|hostname| id |pwd"
Отдельные файлы Sigma-правил доступны в rules/sigma:
| Шаг | Действие | Цель |
|---|---|---|
| 1 | Проверить, работает ли инстанс на JCE <= 2.9.99.4 или показывает доступное обновление JCE. | Подтвердить уязвимое состояние. |
| 2 | Поискать в журналах доступа/ошибок com_jce, profiles.import, /tmp/*.php, jce*.xml.php. | Выявить попытку или успешную эксплуатацию. |
| 3 | Проверить tmp, images и media на наличие PHP/PHTML/PHAR-файлов и необычных имён. | Обнаружить веб-шеллы или бэкдоры. |
| 4 | Просмотреть auditd/EDR на предмет запуска www-data оболочек или системных утилит. | Подтвердить выполнение кода. |
| 5 | При подтверждении веб-шелла/RCE изолировать хост или ограничить трафик к приложению. | Остановить дальнейшую активность. |
| 6 | Сохранить артефакты, удалить веб-шеллы, проверить профили JCE, учётные записи Joomla, cron-задания и изменённые файлы. | Триаж и устранение угрозы. |
| 7 | Обновить JCE до последней поддерживаемой версии и проверить другие инстансы Joomla. | Смягчение последствий и снижение риска. |
| Приоритет | Рекомендация | Обоснование |
|---|---|---|
| P1 | Обновить JCE до последней поддерживаемой версии для ветки Joomla/PHP. | JCE 2.9.99.4 был уязвим в лаборатории, и Joomla показала обновление до 2.9.99.7. |
| P1 | После установки обновления проверить наличие веб-шеллов и подозрительных профилей JCE. | Обновление закрывает точку входа, но не удаляет артефакты, оставленные до установки обновления. |
| P1 | Заблокировать выполнение PHP в каталогах tmp, images, media, cache и загрузки. | Даже если загрузка удастся, блокировка выполнения PHP разрывает цепочку RCE. |
| P2 | Добавить WAF или фильтрацию запросов по option=com_jce и task=profiles.import. | Помогает обнаруживать и блокировать попытки эксплуатации до того, как они достигнут PHP. |
| P2 | Централизованно собирать журналы доступа Apache, журналы ошибок PHP и телеметрию auditd/EDR. | Одних журналов приложения Joomla было недостаточно. |
| P2 | Внедрить периодическую инвентаризацию расширений Joomla и проверки статуса обновлений. | Панель Joomla отображала сигнал об обновлении JCE; это должно питать процессы VM/SOC. |
| P3 | Поддерживать эталонную базу файлов и оповещать о новых PHP-файлах вне контролируемых каталогов. | Помогает обнаруживать веб-шеллы и закрепление после компрометации. |
Точная конфигурация зависит от модели развёртывания Apache/PHP. Цель — предотвратить выполнение PHP в каталогах, которые никогда не должны выполнять скрипты.
<Directory "/var/www/html/tmp">
php_admin_flag engine off
Options -ExecCGI
RemoveHandler .php .phtml .phar
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
<Directory "/var/www/html/images">
php_admin_flag engine off
Options -ExecCGI
RemoveHandler .php .phtml .phar
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
| Техника | Название | Обоснование |
|---|---|---|
| T1190 | Эксплуатация публично доступного приложения | HTTP-эксплуатация конечной точки Joomla/JCE без аутентификации. |
| T1505.003 | Компонент серверного ПО: веб-шелл | PHP-веб-шелл, созданный как /tmp/jce*.xml.php. |
| T1059.004 | Интерпретатор команд и сценариев: оболочка Unix | /usr/bin/dash, выполненный от имени www-data. |
| T1033 | Обнаружение владельца/пользователя системы | whoami и id, выполненные через веб-шелл. |
| T1082 | Обнаружение информации о системе | hostname, выполненный через веб-шелл. |
| T1083 | Обнаружение файлов и каталогов | pwd и активность в /var/www/html/tmp. |
Лаборатория подтвердила практическую эксплуатацию уязвимости в JCE 2.9.99.4. В наблюдаемом сценарии аутентификация в Joomla не требовалась, а публичный PoC автоматизировал определение версии и создание веб-шелла.
В реальных средах риск оценивается от высокого до критического, когда Joomla доступна из интернета или достижима из менее доверенных внутренних сетей. Успешная атака может оставить персистентный веб-шелл, поэтому после предполагаемого воздействия одного обновления без проверки артефактов недостаточно.
Этот репозиторий предназначен для оборонительных исследований, разработки правил обнаружения для SOC и управления уязвимостями. Он не содержит эксплойтов. Любое тестирование должно проводиться только на системах, которыми вы владеете или на оценку которых у вас есть явное разрешение.