Docker-лаборатории + защитный сканер для RCE через удалённую загрузку классов fastjson. fastjson 1.2.66-1.2.83: ресурсный зонд @JSONType (CVE-2026-16723). fastjson2 2.0.57: @type атакующего достигает loadClass при ОТКЛЮЧЁННОМ autoType через полиморфные типы (@JSONType(seeAlso) / Jackson @JsonSubTypes). Только маркерные нагрузки; проверки safeMode + JDK17.
@JSONType и её детектированиеЭтот репозиторий теперь содержит два независимых направления исследований Fastjson:
modern-fd/ — рекомендуемая реконструкция только с маркером цепочки remote-JAR/файловых дескрипторов Fastjson 1.2.83 в одном теле запроса на Spring Boot 3, обычном встроенном Tomcat и JDK 17. Она использует буквальный приёмник фиксированного DTO JSON.parseObject(body, BoundEnvelope.class) с отключённым AutoType.scanner/ содержит пассивное детектирование запросов/логов, статическую инвентаризацию артефактов и неисполняющий зонд достижимости.Суть бага:
ParserConfig.checkAutoTypeпроверяет каждое значение@typeна наличие аннотации@JSONType, выполняяgetResourceAsStream(typeName.replace('.','/') + ".class"). На современных комбинациях Linux/JDK удалённый зондjar:httpможет оставить JAR закэшированным за открытым дескриптором; последующие зондыjar:file:/proc/self/fd/Nв том же теле могут переоткрыть его под допустимыми именами классов и инициализировать аннотированный класс. Точная композиция 1.2.83 работает с отключённым AutoType и через фиксированный DTO, содержащийList<Object>. Поэтому одно лишь связывание не является смягчением. Полный разбор:docs/MECHANISM.md.
Сопутствующий обзор всего проекта охватил 2 041 строку вызываемых/статических инициализаторов во всех 193 производственных Java-файлах Fastjson 1.2.83. В таблице ниже приоритизированы результаты с наибольшим влиянием; это не утверждение, что каждое развёртывание Fastjson затронуто. Данный репозиторий напрямую воспроизводит F105. Остальные записи обобщают отдельно опечатанный обзор исходного кода и ограниченные лабораторные доказательства.
| Приоритет | Находка | Доказанный результат | Важная граница |
|---|---|---|---|
| 1 | F105 — удалённое исполнение байткода через @JSONType | Инициализация класса, предоставленного атакующим, через совместимые загрузчики Spring Boot, включая прямой маршрут JDK 8 и продолжение Linux/JDK 17 с удержанным JAR через /proc/self/fd/N | Требуется достижимый для парсера носитель @type, совместимый загрузчик Boot/TCCL, исходящий доступ, отключённые SafeMode/IgnoreAutoType и точный JAR атакующего. Современный маршрут с фиксированным DTO дополнительно требует канал обобщённых значений (в лаборатории используется List<Object>), procfs в Linux, удержанный дескриптор и точное совпадение имён; не универсален для всех JDK, загрузчиков и ОС |
| 2 | F1/F45 — исполнение команд через TemplatesImpl | Маркерное исполнение команд через API фиксированного DTO, включая игнорируемое свойство тела | Требуется ослабленная политика сервера: допуск классов, AutoType и заполнение приватных полей или эквивалентные пути; неизменные настройки по умолчанию блокируют это |
| 3 | F70/C016 — неограниченная буферизация и расширение GZIP | Типизированные пути byte/InputStream и аннотированного DTO расширяются или буферизуются без ограничения вывода; воспроизведён OOME Java при ограниченной куче | Требуются достижимость конечной точки/схемы и байтов атакующего; массовый простой производства не установлен |
| 4 | F18/C089 — исчерпание стека потока парсера | Глубоко вложенные обычные значения объектов могут вызвать StackOverflowError при парсинге по умолчанию | Влияние на доступность потока запроса; не инвариантный сбой JVM или всего сервиса |
| 5 | F120/C162 — HTTP SSRF/загрузка локальных ресурсов при фиксированной схеме | Управляемый телом JEditorPane/JTextPane.page выполняет HTTP-запросы и может загружать ограниченное содержимое file: в состояние Document | Требуется, чтобы приложение объявляло тип Swing; автоматическая эксфильтрация ответов или RCE не доказаны |
| 6 | F118/C160 — сбой авторизации/целостности данных из-за коллизии хеша | Отдельная коллизия Unicode FNV-1a-64 может привязаться к привилегированной константе перечисления или направить мутацию JSONPath не на тот сеттер бина | Требуются рабочая коллизия и доверие ниже по цепочке или открытая операция мутации JSONPath; допуск классов или RCE не требуются |
| 7 | F121/C163 — достижимость JNDI через фиксированный JdbcRowSet | Точный порядок сеттеров вызвал одно исходящее соединение JNDI/LDAP, выбранное телом | Доказательства ограничиваются соединением: нет ответа именования, объектной фабрики, загрузки байткода или RCE |
| 8 | F2/F45 — разрешение DNS по умолчанию | Управляемое атакующим разрешение имени хоста работает в конфигурации по умолчанию и через игнорируемое свойство фиксированного DTO | Только DNS/OOB-взаимодействие, не обобщённый HTTP SSRF или RCE |
См. findings/FINDINGS.md с метками валидации, предварительными условиями, второстепенными находками, приоритетами устранения и явными отрицательными границами.
Этот репозиторий предназначен для обучения, оборонительных исследований и авторизованного тестирования систем, которыми вы владеете или которые вам явно разрешено тестировать. Публикация хоста, когда она предусмотрена для внутренней сети современной лаборатории, допускается только на 127.0.0.1; его скрипты полностью выполняют тест внутри этой изолированной сети. В современной лаборатории нет примитива исполнения процессов — она устанавливает только фиксированный внутри-JVM маркер. Унаследованная лаборатория JDK 8 действительно исполняет id и записывает вывод в /tmp/PWNED; держите её изолированной. Не направляйте унаследованный эксплойт или активный зонд на неавторизованные системы.
Каталог scanner/ содержит четыре инструмента на Python 3 без зависимостей (без установки через pip).
fjdetect.py — пассивно проверяет декодированные тела JSON-запросов или структурированные JSON-логи на наличие затравок remote-JAR и последовательностей /proc/self/fd или /dev/fd.fjscan_static.py — инвентаризирует jars/wars/ears на предмет уязвимой комбинации (подтверждённая содержимым, проверенная по метаданным версия 1.2.83 × фактическое содержимое класса загрузчика Spring Boot). Релизы 1.2.48–1.2.82, несущие зонды, и кандидаты только по метаданным/имени файла сообщаются отдельно для рассмотрения. Удобен для CI-гейтов (код выхода 2 при EXPOSED).fjscan_probe.py — активная безопасная проверка достижимости: отправляет @type на подконтрольный вам канареечный приёмник (встроенный слушатель или Burp Collaborator / interactsh) и коррелирует callback выборки ресурса. Его встроенный слушатель возвращает пустой 404; внешние слушатели настраивайте аналогично. Callback не доказывает загрузку класса или RCE.fjpayload.py — генерирует тела выборки удалённых ресурсов для ручного тестирования; используйте только пустой слушатель или 404, если исполнение не предполагается.# 1) passive request/log inspection
python3 scanner/fjdetect.py --ndjson gateway.jsonl
# 2) inventory build artifacts / unpacked images (parallel)
python3 scanner/fjscan_static.py /path/to/artifacts --threads 16