Apache Struts: выполнение кода через старый REST-маппер (CVE-2026-104711)
Java-сайт на старом REST-маппере Struts мог выполнить код из запроса. Обновитесь минимум до 6.12.0 или 7.4.0. Обычный маппер, restful2 и REST-плагин бюллетень не затрагивает.
Коротко о главном
- Чем опасно
- Специально составленный запрос мог выполнить код на сервере
- С чего начать защиту
- На линии 6 обновитесь до 6.12.0 или новее. На линии 7 — до 7.4.0 или новее.
- Как подтвердить
- Нужны ручной аудит и проверка реализации. Отсутствие находок во внешнем скане не подтверждает безопасность.
- Продукт
- Apache Struts
- Оценка риска
- CVSS 9.8 / 10
Как проверить и что учитывать
Нужна ручная проверка
Снаружи обычно не видно, что сайт написан на Struts и какой включён маппер. FindRisk не подтверждает CVE-2026-104711. Это проверка конфигурации приложения. Не делайте вывод о наличии уязвимости только по одному внешнему признаку: подтвердите результат в настройках и версии компонента.
Что нужно для подтверждения
Дефект требует устаревший RESTful action mapper.
Ограничения вывода
- Приложение на Spring и другой Java-сайт без Struts сюда не относятся.
- Записи KEV нет.
Что произошло
Старый REST-маппер Struts принимал выражение OGNL из запроса. При выключенной защите это вело к выполнению кода.
Бюллетень S2-075 прямо исключает обычный маппер, restful2 и REST-плагин. Вопрос владельца простой: какой маппер включён и какая версия стоит.
Кого это касается
Затронуты Struts 2.0.0–2.3.37, 2.5.0–2.5.33, 6.0.0–6.11.0 и Struts 7.0.0–7.3.0 только при выключенном OGNL allowlist. Первые две линейки помечены как снятые с поддержки.
Класс CWE-917 совпадает с текстом бюллетеня про внедрение выражения. KEV нет. Это не соседний дефект гонки в CVE-2026-104714.
| Линия | Условие | Что делать |
|---|---|---|
| 2.0–2.3 и 2.5 | Старый REST-маппер, линии сняты | Перейти на поддерживаемую линию |
| 6.0.0–6.11.0 | Старый REST-маппер | 6.12.0 |
| 7.0.0–7.3.0 | Выключен OGNL allowlist | 7.4.0 |
Как проверить установленную версию
Версию берите из зависимости проекта и из собранного приложения. Публичная страница её не показывает.
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
</dependency>Как снизить риск
Обновите линию 6 или 7 и отключите старый маппер. Для снятых с поддержки линий патча нет: их заменяют.
Внешняя проверка домена не определяет маппер Struts и не заменяет просмотр конфигурации.
Что может произойти
- Специально составленный запрос мог выполнить код на сервере
- Ветки 2.0, 2.3 и 2.5 уже сняты с поддержки, для них отдельного патча нет
- Struts 7 в настройке по умолчанию, где список OGNL включён, бюллетень не считает затронутым
Как защититься
- 1На линии 6 обновитесь до 6.12.0 или новее. На линии 7 — до 7.4.0 или новее.
- 2Уйдите со старого RESTful action mapper на обычный маппер, restful2 или REST-плагин. Одного переключателя мало для веток без патча: их нужно заменить.
- 3На Struts 7 не выключайте OGNL allowlist.
Как проходит проверка
Снаружи обычно не видно, что сайт написан на Struts и какой включён маппер. FindRisk не подтверждает CVE-2026-104711. Это проверка конфигурации приложения. Автоматический результат показывает внешний признак риска и требует проверки специалистом с учётом конкретной конфигурации.
Проверить другие внешние рискиЧто делать после обнаружения
- Найдите в конфигурации имя маппера и версию Struts до изменений.
- Если старый маппер был включён на публичном сайте, проверьте журналы приложения и новые учётные записи на сервере.
- Обновите все узлы, а не только балансировщик.
Частые вопросы
Что означает риск «Struts: выполнение кода через старый REST»?
Java-сайт на старом REST-маппере Struts мог выполнить код из запроса. Обновитесь минимум до 6.12.0 или 7.4.0. Обычный маппер, restful2 и REST-плагин бюллетень не затрагивает.
Можно ли подтвердить проблему только внешней проверкой?
Снаружи обычно не видно, что сайт написан на Struts и какой включён маппер. FindRisk не подтверждает CVE-2026-104711. Это проверка конфигурации приложения. Итог нужно сопоставить с конфигурацией, версиями и правами доступа на вашем сайте.
Что сделать в первую очередь?
На линии 6 обновитесь до 6.12.0 или новее. На линии 7 — до 7.4.0 или новее.