Исследование безопасности Liferay CE 7.0.3 GA4: RCE до аутентификации с правами root (класс CVE-2020-7961) воспроизведена от начала до конца, плюс ещё 16 находок — 8+ без известного CVE. Agentic loop-hunt: 25 генераторов, 22 судьи, 9 работающих валидаторов на Docker. Прилагаются цепочка доказательств и чекер в один заход.
Аудит безопасности Liferay Portal CE 7.0.3 GA4 (git-тег 7.0.3-ga4, коммит
b2d7cc68a), выполненный по методологии RAPTOR loop-hunt:
детерминированная разведка → 25 изолированных агентов-генераторов, читающих исходники → 22 независимых
агента-судьи, опровергающих по исходникам → 9 живых валидаторов, атакующих реальный экземпляр GA4 в Docker.
Главное: неаутентифицированный RCE с правами
root, воспроизведённый по всей цепочке (класс CVE-2020-7961), плюс ещё 8 подтверждённых вживую уязвимостей — у нескольких из них нет известных CVE.
⚠️ Правовые/этические аспекты: всё здесь нацелено на самостоятельно развёрнутый тестовый экземпляр. Liferay CE 7.0 достиг конца жизненного цикла (последний релиз 7.0.6 GA7, 2018); эти проблемы не исправлены в апстриме. Используйте этот материал только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Статус: ✅ подтверждено вживую на Docker-экземпляре GA4 · 🔬 подтверждено кодом (независимый судья восстановил полную цепочку по исходникам) · 🧪 зависит от конфигурации.
| ID | Находка | Критичность | Аутентификация | Статус | Доказательства |
|---|---|---|---|---|---|
| F-1 | Переопределение типа в JSONWS → создание произвольного класса + сеттеры → RCE с правами root (c3p0 HexAsciiSerializedMap → ObjectInputStream → запись файла через AspectJWeaver → JSP) | Критическая | не требуется | ✅ | verified/f1-jsonws-deser-rce.md |
| F-2 | Подсказка javaClass в jabsorb на /poller/* → создание произвольного класса + инъекция полей до проверки userId | Высокая (потенциально) | любая учётная запись (саморегистрация включена по умолчанию) | ✅ сток подтверждён / RCE-ветка открыта | verified/F-2-poller.md |
| F-4 | В XML-RPC pingback.ping загрузка происходит до проверки → слепой SSRF + оракул внутренних портов (добрались до Gogo-shell на 127.0.0.1:11311) | Средняя | не требуется | ✅ | verified/f4-xmlrpc-pingback-ssrf.md |
| F-5 | SyncDownloadServlet IDOR по versionId → чтение любой версии файла DL (межсайтовое; у передаваемого объекта право VIEW не проверяется) | Высокая | не требуется (через «ветку», видимую гостям) | ✅ | verified/F-5.md |
| F-6 | Шаблонизатор XSL игнорирует песочницу (secureProcessing=false, restricted отбрасывается) → SSRF через document() и выполнение команд через XSLTC rt:exec | Критическая | автор шаблонов сайта | ✅ | verified/F-6-F-7-template-engines.md |
| F-7 | Ограниченные шаблоны Velocity и FreeMarker отдают сырые propsUtil / saxReaderUtil → раскрытие свойств портала и file:// для гостей | Высокая | автор шаблонов | ✅ | verified/F-6-F-7-template-engines.md |
| F-8 | IDOR над таблицей Image_ через /image/*?img_id=N — токена нет, проверки, привязанные к префиксу, обходятся подменой префикса, последовательные id перечислимы | Средняя | не требуется | ✅ | verified/f-8-image-idor.md |
| F-11 | SimpleCaptcha — это 4-значный PIN, который не аннулируется при неверных попытках, а гостевой счётчик не увеличивается → вскрытие примерно за 5 тыс. запросов | Средняя | не требуется | ✅ | verified/f11-f12-captcha-reminder.md |
| F-12 | «Забыли пароль»: перечисление пользователей + оракул ответа на контрольный вопрос без капчи (обход через новую сессию); пустой ответ создаёт настоящий reset-тикет для учётных записей без контрольных вопросов | Средне-высокая | не требуется | ✅ | verified/f11-f12-captcha-reminder.md |
| F-13 | Переопределение параметров запроса в Web Content Display (groupId/articleId/ddmTemplateKey) → межсайтовое чтение материалов, предназначенных не для гостей (по умолчанию journal.article.view.permission.check.enabled=false) | Высокая | не требуется (нужен WCD на гостевой странице) | ✅ | verified/F-13-wcd-param-override.md |
| F-3 | OSGi axis-extender пропускает ServiceAccessPolicy / пометку удалённого доступа у модульных SOAP-сервисов | Средняя (высокая с WSDD-модулем) | не требуется | 🔬 | judge/axis-spring-remoting.md |
| F-9 | OpenID привязывает учётную запись жертвы к OpenID атакующего до проверки assertion → захват учётной записи | Высокая | не требуется (OpenID включён, не по умолчанию) | 🔬 🧪 | judge/sso-autologin.md |
| F-10 | readObject в TunnelServlet защищён только чёрным списком классов; на classpath есть гаджеты ROME/JdbcRowSetImpl/c3p0/AspectJWeaver | Потенциально критическая | доверенный узел (общий секрет + разрешённый хост) | ✅ барьеры держатся до аутентификации | verified/f10-f20-tunnel-auth-pipeline.md |
| F-14 | TokenAutoLogin доверяет голому заголовку SM_USER (без проверки, без IP-allowlist) | Средняя | не требуется (токенный SSO включён, не по умолчанию) | 🔬 🧪 | judge/sso-autologin.md |
| F-15 | Импорт LAR администратором сайта протаскивает RolesAdminPortletDataHandler → массовое удаление ролей компании / зачистка прав | Средняя | администратор сайта | 🔬 | judge/export-import-lar.md |
| F-16 | OpenSocial (не в стандартной сборке): SSRF в makeRequest до аутентификации, JS с подменой origin в /gadgets/ifr, подделываемые security-токены → выдача себя за другого, хранимый XSS | Высокая ×4 | не требуется / участник сайта | 🔬 (зависит от развёртывания) | judge/opensocial-shindig.md |
| F-17 | WSRP (не в стандартной сборке): SSRF в ProxyServlet до аутентификации; markup-эндпоинт → рендер произвольного портлета + сохранение typeSettings макета | Средняя | не требуется | 🔬 (зависит от развёртывания) | judge/wsrp.md |
Полный курируемый список с отклонёнными кандидатами: FINDINGS.md · повествовательный отчёт: REPORT.md
Каталог из ~50 известных проблем Liferay 7.0.x, использованный как предшествующий материал: PRIOR-ART.md
(OSV [email protected], прочёсывание NVD, бюллетени Code White / CERT-EU).