
Наступательный исследователь безопасности + ИИ против свежего n-day: создание первого публичного PoC для CVE-2026-53435 за одну пятничную ночь. Внутри сырой журнал продолжительностью 8ч20м.
Первое публичное доказательство концепции для CVE-2026-53435, созданное, когда существовало только уведомление, а PoC нигде не был опубликован. Восстановлено из расплывчатого однострочного уведомления за ~8,5 часов пятничным вечером — не путём написания эксплойта вручную, а направляя ИИ через тупики, развороты и проверку, пока не получилась рабочая цепочка.

PoC, обращающийся к
/etc/passwdна контроллере — произвольное чтение файлов подтверждено.
| CVE | CVE-2026-53435 (Jenkins SECURITY-3707) |
| Класс | Небезопасная десериализация (обход ClassFilter через config.xml) |
| Воздействие (данный PoC) | Произвольное чтение файлов на контроллере от аутентифицированного пользователя |
| Затронутые версии | Jenkins weekly ≤ 2.567, LTS ≤ 2.555.2 |
| Исправлено в | Jenkins weekly 2.568, LTS 2.555.3 |
| Уведомление | https://www.jenkins.io/security/advisory/2026-06-10/ (опубликовано 2026-06-10) |
| Статус на момент написания | Не было публичных PoC (репозитории PoC на GitHub: 0) |
Это эксперимент, показывающий процесс, а не только артефакт.
Долгое время результатом работы исследователя атак был один готовый эксплойт — 8 часов неверных поворотов, которые его породили, исчезали. Этот репозиторий сохраняет неверные повороты. Полная, слегка отредактированная стенограмма совместной работы человека и ИИ над свежей n-day-уязвимостью от уведомления до работающего PoC включена в приложение.
Смысл в том, что это намеренно не «ИИ сделал это». 8 часов — доказательство того, что это не так. ИИ ни разу не создал цепочку с одного захода. Работу продвигала экспертиза предметной области — понимание, что в уведомлении скрыт сток десериализации, знание, что нужно искать в основных типах Jenkins, а не в плагинах, знание, что DescribableList до исправления не проверяет тип элемента, и умение проверять утверждение, а не доверять ему. Ценность исследователя не исчезла; она сместилась с набора эксплойта на управление, отсев и валидацию.
Этот сдвиг — то, что стоит задокументировать.
Jenkins защищает десериализацию с помощью пользовательского ClassFilter, который разрешает только типы, определённые в ядре Jenkins или плагинах. CVE-2026-53435 заключается в том, что этого недостаточно: злоумышленник, способный отправить POST с config.xml, может заставить Jenkins десериализовать произвольный тип ядра/плагина в контекст, который его не ожидал, а затем получить доступ к этому объекту через HTTP с помощью маршрутизации Stapler.
Этот PoC внедряет hudson.Plugin$DummyImpl (тип ядра Jenkins, поэтому проходит белый список расположений) в список <properties> представления ListView — DescribableList<ViewProperty>, который до исправления не проверяет тип элемента. Внедрённый объект содержит baseResourceURL=file:/. При маршрутизации HTTP-запроса к нему файлы обслуживаются напрямую из файловой системы контроллера.
Обычная цепочка ysoserial здесь не сработает — гаджет должен быть типом, присутствующим в Jenkins/плагинах, чтобы пройти фильтр. Это ограничение и есть вся суть.
Используйте только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Эксплойт был запущен на двух контейнерах с идентичной конфигурацией — уязвимом 2.555.2 и исправленном 2.555.3 — чтобы подтвердить, что он использует этот CVE, а не какой-то другой примитив чтения файлов:
| 2.555.2 (уязвимая) | 2.555.3 (исправленная) | |
|---|---|---|
createView | HTTP 200 | HTTP 200 |
Сохранённые <properties> | <hudson.Plugin_-DummyImpl/> — выживает | <properties/> — удалено |
Запрос → /etc/passwd | root:x:0:0:... — прочитано | пусто — заблокировано |
Исправленная сборка принимает запрос, но исправление отклоняет внедрённый тип во время десериализации, поэтому список свойств возвращается пустым, и маршрутизировать нечего. Отказ происходит именно на том механизме, который описывает уведомление, — что и делает это настоящим PoC для CVE-2026-53435.
python3 exploit_cve_2026_53435_v2.py <base_url> <user> <pass> <remote_file> [view_name]
# example (against your own lab):
python3 exploit_cve_2026_53435_v2.py http://127.0.0.1:8080 <user> <pass> /etc/passwd
base_url — http://host:port цели (обычный HTTP; не добавляйте префикс https, если экземпляр на самом деле не завершает TLS).config.xml представления (View/Configure), а также Overall/Read.docker compose -f lab/docker-compose.yml up -d
# vulnerable: http://127.0.0.1:8080 (Jenkins LTS 2.555.2)
# patched: http://127.0.0.1:8081 (Jenkins LTS 2.555.3, negative control)
Лаборатория предоставляет локальную базу пользователей через инициализацию Groovy, чтобы путь с аутентифицированным низкопривилегированным пользователем можно было протестировать без внешнего IdP.
2026-06-12 (Пт) 15:00 → 23:23 ≈ 8ч 20м
15:00–15:12 Сборка лаборатории (docker: vuln 2.555.2 / patched 2.555.3) + первая разведка
15:12–21:00 Анализ стока десериализации и гаджетов
(Попытки обхода Commons-Collections провалились → переход
от properties к actions и обратно)
21:00–22:30 Анализ ClassFilter + повторный поиск гаджетов, ограниченных типами ядра
22:30–23:00 Рабочий PoC (v1 → v2) + дифференциальная верификация (vuln vs patched)
Большую часть этих часов занял анализ, а не набор. Сам эксплойт собрался за последние ~30 минут — как только были известны правильный сток и гаджет.
Создано с помощью Claude Code (Anthropic), интерактивно управлялось автором:
Полная, слегка отредактированная рабочая стенограмма находится в transcript/ — сохранена в сыром виде, включая тупики. (Отредактировано только для смягчения тона некоторых строк и маскировки деталей локальной сети; ничего технического не удалено.)
Только для авторизованного тестирования безопасности, исследований и образования. Автор и участники не несут ответственности за неправомерное использование. Целевая уязвимость исправлена — обновитесь до Jenkins LTS 2.555.3 / weekly 2.568 или новее.