Apache Struts 7.4.0 закрывает четыре уязвимости, включая внедрение OGNL с выполнением кода

Apache Struts

Четыре уязвимости в Apache Struts позволяют выполнить произвольный код на сервере, устроить отказ в обслуживании и показать одному пользователю данные, предназначенные другому. Исправления вошли в версии 7.4.0 и 6.12.0. Уведомления выходили с 3 августа по 4 сентября 2026 года, уязвимости получили идентификаторы от CVE-2026-104711 до CVE-2026-104714. Затронутые компоненты у всех четырёх разные, поэтому не всякая установка уязвима ко всему списку.

Детали уязвимостей

Struts остаётся рабочим инструментом для множества организаций на Java. Часть из них годами не уходила с давно выпущенных веток, а именно там уязвимостей больше всего. Свежие версии фреймворка защищены настройками по умолчанию, старые - нет.

Одна из уязвимостей, CVE-2026-104711, касается устаревшего механизма сопоставления REST-запросов с действиями приложения. Специально сформированный запрос подставляет в него выражение на языке OGNL - языке навигации по объектному графу, через который Struts обращается к данным приложения. В результате возникает внедрение OGNL, а за ним - возможность выполнить на сервере чужой код.

Разработчики оценили степень опасности как умеренную. Уязвимы ветки 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. Приложения, которые используют штатный механизм или REST-плагин, под угрозу не попадают. До обновления администраторы могут сменить устаревший компонент на защищённую альтернативу. Сам механизм сопоставления считается отжившим, и разработчики советуют перейти на REST-плагин.

Вторая уязвимость приводит к отказу в обслуживании. Она срабатывает, когда параметр запроса привязывается к десятичному свойству с произвольной точностью, а затем выводится через библиотеку тегов Struts. Маленький запрос порождает ответ, который в тысячи раз больше исходного. Атакующему не нужна ни учётная запись, ни широкая полоса: поток слабых запросов выжигает процессорное время и исходящий канал сервера.

Уязвимы ветки 2.5.14-2.5.33, 6.0.0-6.11.0 и 7.0.0-7.3.0. Другие числовые типы, а также ответы JSON- и REST-плагинов такой уязвимости не подвержены. В качестве временной меры разработчики советуют задать собственный преобразователь типа, который ограничивает разрядность числа перед выводом. Побочный эффект исправления затрагивает округление: десятичные значения с очень большим числом знаков после запятой теперь выводятся округлёнными, а не целиком.

Третья уязвимость, CVE-2026-104713, получила от разработчиков уровень Important, тогда как остальным трём достался умеренный. Она связана с REST-плагином, который читает тело запроса в память без ограничения размера. Один большой запрос исчерпывает память, отведённую приложению, и остальные пользователи получают отказ в обслуживании. Плагин входит в сборку начиная с версии 2.1.8, поэтому уязвимы ветки до 2.3.37, 2.5.0-2.5.33, 6.0.0-6.11.0 и 7.0.0-7.3.0. Похожие ошибки в этом же компоненте исправляли и раньше. Тогда ограничение действовало только при включённой дополнительной настройке, а сейчас плагин уязвим в обычной конфигурации.

По умолчанию обновлённые версии принимают не больше 2 097 152 символов в теле запроса, то есть примерно два мегабайта. Приложения, которым нужно принимать больше, поднимают планку через параметр struts.rest.content.maxLength и остаются под защитой нового предела. Если обновиться прямо сейчас нельзя, ограничение размера запроса ставят перед приложением - в обратном прокси или контейнере сервлетов. Отправку обычных форм и загрузку файлов плагин не разбирает, поэтому их лимит не касается.

Четвёртая уязвимость устроена иначе. 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. Уязвимость проявляется только на наборах сообщений самой организации: ни одно сообщение, поставляемое со Struts, дату или время не форматирует. Обходной путь простой: отформатировать значение до подстановки в сообщение.

Общая черта трёх уязвимостей из четырёх - зависимость от конфигурации. Механизм сопоставления REST-запросов включают отдельно, REST-плагин применяют не все, а вывод десятичных чисел через библиотеку тегов встречается лишь в отдельных приложениях. Поэтому организациям стоит сначала понять, какие компоненты задействованы в их сборке, и только потом оценивать остроту ситуации. Четвёртая уязвимость оговорок не имеет: она касается всех, кто форматирует дату или время в локализованных сообщениях.

Решение для всех четырёх одно: обновление до 7.4.0 или до 6.12.0 на линии 6.x. Ветка 6.12.0 несёт те же исправления, что и 7.4.0. Организациям, которые держат выпуски без поддержки, разработчики предлагают перейти на поддерживаемые версии, а не полагаться только на временные меры.

Из четырёх уязвимостей две ведут к отказу в обслуживании и не требуют ни учётной записи, ни большой полосы пропускания. Одна раскрывает чужие данные без всякого вмешательства злоумышленника. Такой набор означает, что откладывать обновление стоит только тем, кто готов к простоям и разбирательствам с пользователями.

Ссылки

Комментарии: 0