CVE-2017-5638 · CVSS 9.8 CRITICAL · опубликована 11.03.2017

11 марта 2017 года был опубликован CVE-2017-5638 — критическая уязвимость (CVSS 9.8 CRITICAL) в Apache Struts, популярном фреймворке для Java-приложений. На этой уязвимости и строится одна из самых известных киберкатастроф в истории: взлом Equifax в 2017 году, в результате которого были похищены персональные данные более чем 147 миллионов человек. Инцидент стал классическим примером того, как неуправляемая техдолговая позиция превращает известную уязвимость с готовым патчем в национальную катастрофу.

Как это работает

Уязвимость находилась в Jakarta Multipart parser — компоненте, обрабатывающем загрузку файлов и форм. Когда Struts получает HTTP-запрос с телом в «мультипартном» формате, парсер должен определить, какая часть запроса — метаданные, а какая — содержимое файла. Для этого он опирается на заголовок Content-Type, описывающий тип данных. Проблема в том, что обработчик ошибок этого парсера интерпретировал содержимое заголовка, если в нём была некорректная конструкция, как выражение, которое нужно вычислить.

Struts построен на языке выражений (OGNL) — механизме, позволяющем конфигурационным файлам и интерфейсам фреймворка обращаться к Java-объектам и вызывать их методы. Это мощная штука внутри приложения, но когда выражение может быть подано извне — через заголовок HTTP-запроса — граница между данными и кодом рушится. Атакующий отправляет запрос с лишь одним изменённым заголовком Content-Type, содержащим выражение, которое заставляет сервер выполнить произвольную команду. Никакой аутентификации, никакой загрузки файла — просто один вредоносный заголовок.

Реальные последствия

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

Что делать

Первая линия защиты — немедленное обновление Struts до исправленной версии и инвентаризация всех приложений на этом фреймворке в организации. WAF с правилами для S2-045 может служить временным экраном, но не заменой патча. Долгосрочные меры: управление жизненным циклом зависимостей (SCA-инструменты, отслеживание security-рассылок фреймворков), сегментация приложений с доступом к чувствительным данным, усиленный мониторинг. Главный урок Equifax: скорость патчинга — не задача «айтишников», а показатель управленческой зрелости; известная уязвимость с известным эксплойтом, оставшаяся без патча, становится вопросом времени, а не «если».

Источники

Карточка CVE-2017-5638 в NVD

Exploit-DB: EDB-41570

Каталог CISA KEV