
Автономный CLI-сканер без зависимостей, который находит fastjson внутри JAR-файлов и fat-JAR-файлов Spring Boot, отмечает подверженность CVE-2026-16723 и обнаруживает затенённые зависимости для CI-гейтинга.
Одна команда — и вы точно узнаете, есть ли в вашем Java-приложении fastjson, где он скрывается и затронут ли он CVE-2026-16723.
Без зависимостей · полностью офлайн · один jar на 23 КБ · поддержка Java 8+
21 июля 2026 года официальный проект fastjson опубликовал CVE-2026-16723 (CVSS 9.0, удалённое выполнение кода):
Множество бюллетеней по безопасности (включая ряд англоязычных ИБ-изданий) до сих пор утверждают, что «ветка 1.x снята с поддержки (EOL), патча не будет никогда, остаётся только миграция на fastjson2». С 2026-07-29 это утверждение не соответствует действительности. Можете проверить сами:
| Доказательство | Ссылка |
|---|---|
В центральном репозитории Maven есть com.alibaba:fastjson:1.2.84, jar загружен 2026-07-29 | repo1 |
GitHub release 1.2.84, опубликован 2026-07-29T08:24:51Z | release |
Ключевой коммит fix: strengthen autoType type name validation and whitelist verification | 2026-07-29T07:02:55Z |
1.2.83 был выпущен в мае 2022 года, после чего ветка 1.x четыре года не получала коммитов — 1.2.84 выпущен специально как исключение ради этой уязвимости.
В заголовке его release не указано исправление безопасности: в заголовке 1.2.83 написано «(исправление безопасности)», а в 1.2.84 — только
«Выпуск версии 1.2.84». Но в тексте это указано — есть полный раздел Security Fixes, где по пунктам перечислены четыре усиления AutoType,
и так было с самого дня выпуска (2026-07-29) (проверяется по архиву Wayback 20260729094935).
Что касается того, почему после выпуска патча большинство бюллетеней и сканеров так и не обновились, я не выяснил, и здесь гадать не буду.
📌 Исправление от 2026-08-14: здесь ранее было написано «в тексте ни слова о безопасности, поэтому обновления не последовало». Первая половина по результатам проверки текста release и архивной копии Wayback за тот день оказалась неверной (не был помечен только заголовок), вторая половина из-за этого тоже лишилась основания и удалена.
👉 Практическое следствие для пользователей 1.x: обновление до 1.2.84 — самое дешёвое решение (минорная версия той же ветки, обычно не требует изменения кода), и не нужно принудительно сразу делать крупную миграцию на fastjson2. Инструмент даёт рекомендации именно исходя из этого.
⚠️ Условие — JDK 8 и выше (проверено 2026-10-14): все 274 класса в 1.2.84 — байт-код Java 8 (major 52), а в 1.2.83 — Java 5 (major 49). На JDK 7 (Zulu 7u352)
javacвыдаёт лишь предупреждение и код возврата 0, а во время выполнения сразу выбрасываетсяUnsupportedClassVersionError: com/alibaba/fastjson/JSON : Unsupported major.minor version 52.0. Кроме того: константаJSON.VERSIONв 1.2.84 по-прежнему равна"1.2.83", поэтому определять по ней версию нельзя — ошибётесь; этот инструмент читаетpom.propertiesи не подвержен этой проблеме.
А самое неприятное вот что:
fastjson обычно является транзитивной зависимостью — его никто не устанавливает намеренно, он приходит вместе с другими библиотеками. Многие команды вообще не знают, что используют его.
mvn dependency:tree может перечислить зависимости, но бессилен в двух случаях:
Этот инструмент написан именно для этих двух случаев.
Скачайте fastjson-check.jar из Releases, затем:
# 扫一个 jar(Spring Boot fat-JAR 会自动逐层展开)
java -jar fastjson-check.jar ./myapp.jar
# 扫一整个目录(递归查找所有 jar/war)
java -jar fastjson-check.jar /opt/apps
# 输出 JSON,接入流水线
java -jar fastjson-check.jar /opt/apps --json
Не требует установки, не требует учётной записи, не требует подключения к сети, не загружает никаких данных.
Один и тот же артефакт является одновременно CLI и Maven-плагином. При таком использовании не нужно сначала скачивать jar:
# 在你的项目目录下直接跑,扫的是 Maven 解析后的依赖
mvn io.github.xiaoqimikko:fastjson-check:0.3.1:check
Или привязать к жизненному циклу сборки (фаза verify):
<plugin>
<groupId>io.github.xiaoqimikko</groupId>
<artifactId>fastjson-check</artifactId>
<version>0.3.1</version>
<executions>
<execution>
<goals><goal>check</goal></goals>
</execution>
</executions>
</plugin>
pom.xml через CLIКогда CLI сканирует pom.xml, он читает текст, а в реальных проектах версия fastjson часто отсутствует в этом тексте:
<version>${fastjson.version}</version><parent>, в вашем pom этой строки нетПлагин получает набор зависимостей Maven после разрешения, каждая зависимость несёт реальный путь к jar в локальном репозитории.
Таким образом, используется именно тот путь, в котором этот инструмент наиболее силён: сканирование com/alibaba/fastjson(2)/JSON.class в настоящем jar,
а не доверие к тому, что написано в pom.
⚠️ Но граница распознавания от этого не изменилась: ключом определения по-прежнему остаётся этот путь к классу, поэтому зависимости, подвергшиеся relocate / переупаковке с изменением имени пакета, по-прежнему не распознаются (см. ниже «Чем это не является»). Плагин решает вопрос «где записана версия», а не «имя пакета изменено».
| Параметр | По умолчанию | Описание |
|---|---|---|
-Dfastjson-check.failOnFound | false | Прерывать сборку при обнаружении CRITICAL / HIGH |
-Dfastjson-check.path | не задан | Не сканировать дерево зависимостей, а сканировать этот путь (каталог / jar / war / fat-jar) |
-Dfastjson-check.skip | false | Пропустить выполнение |
🔴 По умолчанию сборка не завершается ошибкой, и это сделано намеренно, семантика отличается от кодов выхода CLI:
командную строку вводите вы сами, и код выхода 1 — именно то, что вам нужно; а плагин висит на конвейере,
инструмент самопроверки не должен окрашивать сборку в красный, когда вы к этому не готовы. Чтобы использовать как шлюз CI, явно добавьте
-Dfastjson-check.failOnFound=true.
💡 Если на Windows отчёт выводится в виде кракозябр, переключите консоль обратно на GBK (
chcp 936) — кодировка вывода в режиме плагина определяется Maven, переключатели CLI--utf8/--gbkздесь недоступны.
fastjson-check 0.1.0 —— fastjson 应急排查(离线,不外传任何数据)
扫描目标:myapp.jar
已展开归档:3 个
发现 2 处 fastjson:
[CRITICAL] fastjson 1.2.83
位置 :myapp.jar!/BOOT-INF/lib/fastjson-1.2.83.jar
版本来源:pom.properties
场景 :Spring Boot fat-JAR ← CVE-2026-16723 的主要在野利用场景
结论 :命中 CVE-2026-16723(CVSS 9.0 远程代码执行),默认配置即可利用
处置 :1.x 已停止维护,不会有修复版本。应急处置二选一:①(推荐)迁移至
fastjson2 2.0.63 或更高版本;② 无法立即迁移时,先启用 SafeMode
彻底关闭 AutoType 以缓解,但这不是长期方案。