Разработчики fastjson опубликовали предупреждение о критической уязвимости в версиях библиотеки с 1.2.68 по 1.2.83 включительно. Ошибка позволяет удалённо выполнить код в приложении при стандартных настройках библиотеки. Обязательное условие — приложение должно быть собрано и запущено как исполняемый Spring Boot fat JAR.
Что известно об уязвимости
Для эксплуатации не требуется включать AutoType или добавлять в путь классов специальный класс, пригодный для построения цепочки атаки. Уязвимый сценарий работает при настройках fastjson по умолчанию:
-
AutoType отключён;
-
SafeMode отключён;
-
приложение запущено как исполняемый Spring Boot fat JAR через
java -jar.
Работоспособность атаки подтвердили на Spring Boot 2.x, 3.x и 4.x, а также на JDK 8, 11, 17 и 21. Уязвимый код достижим через следующие методы:
JSON.parse(...)JSON.parseObject(String)JSON.parseObject(String, Class)
Передача целевого класса в JSON.parseObject, например DTO, проблему не решает. Злоумышленник может поместить вредоносные данные во вложенное поле типа Object или Map.
Какие версии затронуты
Уязвимы версии fastjson от 1.2.68 до 1.2.83 включительно. Версия 1.2.83 стала последним выпуском ветки 1.x.
В предупреждении отдельно указано, что уязвимого пути нет в fastjson 1.2.60 и более ранних версиях. Статус промежуточных выпусков 1.2.61–1.2.67 отдельно не уточняется, поэтому ориентироваться следует на явно обозначенный разработчиками уязвимый диапазон — начиная с 1.2.68.
Условия для эксплуатации также отсутствуют в следующих случаях:
-
включён SafeMode;
-
используется сборка
noneautotype; -
приложение не запускается как исполняемый Spring Boot fat JAR;
-
используется fastjson2.
Почему fastjson2 не затронут
По словам разработчиков, в fastjson2 причина уязвимости устранена на уровне архитектуры библиотеки.
В механизме разрешения типов больше не выполняется поиск ресурсов через getResourceAsStream с использованием управляемого пользователем имени класса. Для загрузки классов применяются ClassLoader.loadClass() и Class.forName().
Аннотация @JSONType используется только для настройки сериализации и не считается признаком доверия при разрешении типов. Кроме того, fastjson2 применяет модель на основе разрешённых типов: класс должен входить в список разрешённых либо быть явно одобрен через AutoTypeBeforeHandler.
Поддержка AutoType в fastjson2 по умолчанию отключена, а возможность JSONReader.Feature.SupportAutoType помечена как устаревшая и сопровождается предупреждением о безопасности. Пользователям fastjson2 принимать меры именно из‑за этой уязвимости не требуется.
Как защитить приложение
Для проектов, которые продолжают использовать fastjson 1.x, разработчики рекомендуют в первую очередь включить SafeMode. Это можно сделать через параметр при запуске JVM:
-Dfastjson.parser.safeMode=true
Либо программно:
ParserConfig.getGlobalInstance().setSafeMode(true);
Настройку также можно указать в файле fastjson.properties.
Другой вариант — перейти на сборку, из которой поддержка AutoType удалена во время компиляции:
com.alibaba fastjson 1.2.83_noneautotype
В качестве долгосрочного решения рекомендуется миграция на fastjson2.
Пользователям fastjson2 советуют не включать JSONReader.Feature.SupportAutoType без необходимости. Когда автоматическое разрешение типов действительно требуется, следует использовать ContextAutoTypeBeforeHandler со строгим списком разрешённых классов.
Уязвимость обнаружил Кирилл Фирсов из FearsOff Cybersecurity и передал информацию разработчикам в рамках ответственного раскрытия. Предупреждение опубликовано 21 июля 2026 года.
Если хотите глубже разобраться в безопасной разработке и современных подходах к созданию серверных приложений, подключайтесь к бесплатным урокам:
-
3 августа, 20:00. «Какие результаты должен давать DevSecOps‑проект бизнесу и команде». Записаться
-
5 августа, 20:00. «Битва нативных платформ: Spring Boot 4, Quarkus, Micronaut, KMP, Go и Rust». Записаться
Источник: habr.com