В Apache Struts закрыли четыре уязвимости, три из которых относятся к разным компонентам фреймворка. Эксплуатация зависит от конфигурации приложения: где-то достаточно одного запроса, где-то нужен нестандартный маппер или включённый REST-плагин. Одна из дыр позволяет выполнить код на сервере через OGNL-инъекцию, остальные ведут к отказу в обслуживании и раскрытию данных.
Исправленные версии — Struts 7.4.0 и новее, а для тех, кто остался на ветке 6.x, — Struts 6.12.0 и новее. Сведений об активной эксплуатации в предоставленных материалах нет.
CVE-2026-104711: OGNL-инъекция в legacy RESTful action mapper
Самая опасная из четырёх — уязвимость в устаревшем RESTful action mapper. По документации Apache, этот маппер извлекает имена действий и значения параметров из URL запроса. Специально сформированный запрос может внедрить OGNL-выражение, что при определённых условиях приводит к удалённому выполнению кода.
Затронуты выпуски Struts 2.0.0–2.3.37, 2.5.0–2.5.33 и 6.0.0–6.11.0. Ветка 7.0.0–7.3.0 уязвима только при отключённом OGNL allowlist. Приложения, использующие маппер по умолчанию, restful2 или REST-плагин Struts, этой уязвимости не подвержены: в конфигурации по умолчанию Struts 7 защита сохраняется. Проблему обнаружил исследователь под ником LeaveSong.
CVE-2026-104712: маленький запрос, огромный ответ
Вторая уязвимость позволяет малым запросам вызывать несоразмерно большие ответы. Она проявляется, когда параметры запроса заполняют свойства java.math.BigDecimal, которые затем отрисовываются через библиотеку тегов Struts. Неаутентифицированный атакующий может долго и малым объёмом трафика расходовать процессорное время сервера и исходящую пропускную способность.
Затронуты Struts 2.5.14–2.5.33, 6.0.0–6.11.0 и 7.0.0–7.3.0. Приложения, использующие другие числовые типы или формирующие ответы через JSON- или REST-плагины, под описанный риск не попадают. Уязвимость нашёл исследователь 0xCc.Zhang.
Временное обходное решение — собственный конвертер для BigDecimal, ограничивающий scale до отрисовки. Apache поддерживает регистрацию конвертера для всего приложения через файл struts-conversion.properties в корне classpath.
CVE-2026-104713: REST-плагин читает тело запроса без ограничения
Третья проблема затрагивает приложения, принимающие тело запроса через опциональный REST-плагин. Уязвимая реализация читает тело в память без ограничения размера, поэтому один слишком большой запрос способен исчерпать heap.
Уязвимы выпуски Struts 2.1.8–2.3.37, 2.5.0–2.5.33, 6.0.0–6.11.0 и 7.0.0–7.3.0. Автор находки — исследователь n0mi1k. В исправленных версиях введён лимит по умолчанию — 2 097 152 символа. Тем, кто не может обновиться, стоит ограничить размер тела запроса на обратном прокси или в контейнере сервлетов. Плагин обрабатывает входящие представления контента, включая XML и JSON.
CVE-2026-104714: чужие данные в ответе из-за общего форматтера
Четвёртая уязвимость связана с общими локализованными форматтерами сообщений, которые обрабатывают аргументы даты или времени. Одновременные запросы могут помешать друг другу: значение одного пользователя появится в ответе другому или возникнет ошибка отрисовки.
Проблема затрагивает перечисленные ветки Struts до 6.11.0 и 7.3.0 включительно, её также обнаружил n0mi1k. Обычный конкурентный трафик способен вызвать сбой без вредоносного ввода.
Что делать администратору
Обновите затронутые развёртывания и проверьте настройки маппера, отрисовку десятичных чисел, REST-эндпоинты и локализованные сообщения. Для форматтера временное обходное решение — форматировать даты до интерполяции сообщения.
Схожие истории с массовой эксплуатацией веб-приложений уже были: в прошлом месяце закрыли уязвимости Citrix NetScaler, а PaperCut NG/MF попал в каталог KEV с цепочкой, дающей RCE без аутентификации. Обе напоминают, что отложенный патч в веб-приложении почти всегда превращается в инцидент.
Частые вопросы
Кого касается эта история?
Всех, кто использует Apache Struts в веб-приложениях. Степень риска зависит от конфигурации: одни уязвимости требуют нестандартного маппера или REST-плагина, другие срабатывают на обычном конкурентном трафике.
Какие версии нужно установить?
Struts 7.4.0 или новее. Если приложение работает на ветке 6.x, минимальная исправленная версия — Struts 6.12.0.
Есть ли сведения об активной эксплуатации?
В предоставленных Apache материалах активная эксплуатация не подтверждена. Это не отменяет срочности патча: уязвимость с OGNL-инъекцией даёт потенциальное выполнение кода.
Как понять, уязвимо ли моё приложение к CVE-2026-104711?
Проверьте, какой action mapper используется. Уязвим устаревший RESTful action mapper; маппер по умолчанию, restful2 и REST-плагин Struts этой проблеме не подвержены. На ветке 7.0.0–7.3.0 риск возникает только при отключённом OGNL allowlist.
Что делать, если обновиться прямо сейчас нельзя?
Для CVE-2026-104712 можно зарегистрировать собственный конвертер BigDecimal, ограничивающий scale, через struts-conversion.properties в корне classpath. Для CVE-2026-104713 ограничьте размер тела запроса на обратном прокси или в контейнере сервлетов. Для CVE-2026-104714 форматируйте даты до интерполяции сообщения.
Какие приложения не затронуты уязвимостью с большими ответами?
Те, что используют другие числовые типы вместо BigDecimal или формируют ответы через JSON- и REST-плагины. Для CVE-2026-104711 исключение — приложения на маппере по умолчанию, restful2 и REST-плагине.
Насколько опасна уязвимость форматтера, если она срабатывает без атакующего?
Она может раскрыть данные одного пользователя другому или сломать отрисовку при обычном конкурентном трафике. Вредоносный ввод для этого не нужен, поэтому риск сохраняется и без целенаправленной атаки.
Источник: cybersecuritynews.com