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

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

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

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

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

Категории

Все категории
Loading categories
cve-2024-23897-jenkins-poc — Автономное воспроизведение и анализ в Docker уязвимости CVE-2024-23897 — произвольное чтение файлов в Jenkins CLI через раскрытие аргументов с @-синтаксисом в args4j. | Kitploit
Инструменты/GitHubGitHub/rivaedoardo62-boop/cve-2024-23897-jenkins-poc
Анализ уязвимостейЭксплуатацияВеб-безопасностьТестирование на ПроникновениеСтатьи и ИсследованияОбучение и Образование
GitHubrivaedoardo62-boop/cve-2024-23897-jenkins-poc

cve-2024-23897-jenkins-poc

Автономное воспроизведение и анализ в Docker уязвимости CVE-2024-23897 — произвольное чтение файлов в Jenkins CLI через раскрытие аргументов с @-синтаксисом в args4j.

Репозиторий
2 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2024-23897: произвольное чтение файлов в Jenkins (args4j @-синтаксис)

Полностью автономная локальная воспроизводимость CVE-2024-23897 — критической (базовая оценка CVSS 3.1 — 9.8) уязвимости произвольного чтения файлов в Jenkins CLI. Проект поднимает два Docker-стека, различающихся только минорной версией Jenkins, запускает один и тот же proof of concept против обоих и показывает, как уязвимость срабатывает на непропатченном контроллере и не даёт о себе знать на пропатченном.

Всё управляется одной Python-программой, poc.py. Обвязка лишь оркестрирует окружение (Docker Compose, официальный клиент jenkins-cli.jar и точный захват вывода). Сама уязвимость находится в Java-коде Jenkins и здесь заново не реализуется.

Полный письменный анализ, включая разбор патча и декомпозицию CVSS, — в report/report.pdf.

Уязвимость в одном абзаце

Jenkins CLI строит свой парсер аргументов с помощью библиотеки args4j. В args4j есть функция expandAtFiles, управляемая флагом atSyntax и включённая по умолчанию, которая раскрывает любой аргумент вида в содержимое этого файла перед запуском команды. Файл открывается с привилегиями процесса контроллера Jenkins. Поскольку все три CLI-транспорта (HTTP, WebSocket, SSH) сходятся в одном парсере, любой клиент, способный отправить любую CLI-команду, может читать произвольные файлы с контроллера. Исправление (коммит ) добавляет константу , по умолчанию равную , отключая раскрытие.

@/path/to/file
554f0378
ALLOW_AT_SYNTAX
false

Это не классический path traversal: здесь нет ../ и нет базового каталога, из которого нужно выходить. Путь открывается напрямую. По критерию результата это произвольное чтение файла; по критерию механизма — подстановка аргументов.

Структура репозитория

root@kitploit:~
cve-2024-23897-jenkins-poc/
  README.md                      # this file
  LICENSE
  poc.py                         # Python reproduction harness (all subcommands)
  Dockerfile.vuln                # jenkins/jenkins:2.426.2-lts + matrix-auth
  Dockerfile.fix                 # jenkins/jenkins:2.426.3-lts + matrix-auth
  docker-compose.vuln.yml        # jenkins-vuln + attacker-vuln
  docker-compose.fix.yml         # jenkins-fix  + attacker-fix
  init.groovy.d/
    01-create-users.groovy       # bootstraps admin + readuser via matrix-auth
  evidence/
    docker-versions.txt          # host Docker + Compose versions
    output-vulnerable.txt        # captured during `poc.py exploit`
    output-fixed.txt             # captured during `poc.py verify-fix`
  report/
    report.pdf                   # full written analysis
    report.tex                   # LaTeX source (self-contained, no external figures)

Предварительные требования

ТребованиеПримечания
Docker Engine 24 или новееточная использованная версия записана в evidence/docker-versions.txt
Docker Compose v2поставляется встроенным плагином docker compose
Python 3.8 или новеетолько стандартная библиотека, pip install не нужен
Место на дискеоколо 1,5 ГБ для двух образов Jenkins, образа temurin и плагина matrix-auth

JDK на хосте не требуется. Java работает внутри контейнера атакующего. В compose-файлах зафиксировано platform: linux/amd64, поэтому образы ведут себя одинаково на Apple Silicon; это операционное решение и не затрагивает уязвимость, которая не зависит от платформы.

Как запустить

Изнутри репозитория:

root@kitploit:~
python3 poc.py up-vuln       # build and start the vulnerable stack, fetch the CLI jar
python3 poc.py place-proof   # write the harmless marker file inside the controller
python3 poc.py exploit       # run the PoC, writes evidence/output-vulnerable.txt
python3 poc.py up-fix        # tear down vuln, build and start the patched stack
python3 poc.py verify-fix    # run the same PoC, writes evidence/output-fixed.txt
python3 poc.py teardown      # stop and remove both stacks

Первый запуск занимает несколько минут (загрузка образов плюс установка плагина). Последующие запуски значительно быстрее.

poc.py exploit завершается успешно, когда в захваченном выводе появляется маркерная строка POC-PROOF-LINE (утечка произошла). poc.py verify-fix завершается успешно при противоположном условии: маркер должен отсутствовать. Обе подкоманды при неудаче завершаются с ненулевым кодом, так что два файла свидетельств и их статус выхода и есть результат теста.

Архитектура

Оба compose-файла запускают одни и те же два сервиса в одной Docker-сети: контроллер Jenkins (жертва) и небольшой контейнер атакующего eclipse-temurin:17-jre. poc.py выполняется на хосте и управляет Docker через subprocess, но сам вызов java -jar jenkins-cli.jar ... происходит внутри контейнера атакующего. У атакующего нет доступа к тому данных Jenkins; он обращается к контроллеру только по сети, как это делал бы удалённый атакующий.

Модель авторизации

init.groovy.d/01-create-users.groovy использует плагин matrix-auth для создания двух учётных записей с намеренно разными правами:

Учётная записьПраваРоль в PoC
adminJenkins.ADMINISTERсуществует только для выполнения требования «хотя бы один администратор», для атаки не используется
readuserтолько Jenkins.READ (Overall/Read)аутентифицированный атакующий
anonymousнетнеаутентифицированный атакующий

Это воспроизводит точное разделение из официального бюллетеня: Overall/Read против anonymous, а не более широкое «любой вошедший пользователь против anonymous», которое дало бы значение по умолчанию ядра Jenkins. Таким образом, полная утечка файлов объясняется только самой CVE, а не административными полномочиями.

Результаты

PoC прогоняет четыре сценария против каждого контроллера. В таблице ниже сведено A/B-сравнение; полные захваты вывода — в evidence/.

НаблюдениеУязвимая 2.426.2Пропатченная 2.426.3
обработка @-токенараскрывается в содержимое файлаобрабатывается как литеральная строка
readuser + connect-nodeполное раскрытие файла (3 из 3 строк)нет раскрытия
anonymous + who-am-i / helpчастичная утечка (первая строка) через ошибку парсера до проверки аутентификациинет раскрытия
маркер POC-PROOF-LINE в выводеприсутствуетотсутствует

Единственная переменная, которая меняется между двумя колонками, — минорная версия Jenkins, а через неё — значение atSyntax по умолчанию после патча. Поэтому противоположные результаты объясняют изменение поведения исправлением парсера в коммите 554f0378.

Почему Docker не исправляет ошибку

Запуск Jenkins в контейнере не является мерой смягчения. Парсер читает файлы с привилегиями JVM Jenkins, и эти файлы находятся в той же файловой системе контейнера, где расположено хранилище учётных данных. Граница контейнера защищает хост от процесса Jenkins, а не процесс Jenkins от самого себя. Docker-окружение здесь — демонстрационная песочница, и не более.

Смягчение уязвимости

Обновитесь до пропатченного релиза: 2.442 (weekly) либо 2.426.3 или 2.440.1 (LTS); все они выпущены 24 января 2024 года. Если немедленное обновление невозможно, оставьте системное свойство hudson.cli.CLICommand.allowAtSyntax неустановленным (это значение по умолчанию); тогда ALLOW_AT_SYNTAX остаётся равным false, и раскрытие отключено. Отключение отдельных CLI-транспортов — лишь частичная мера, поскольку все три сходятся в одном и том же парсере.

Примечание о безопасности

Вся работа выполняется в локальном Docker-окружении с безобидным трёхстрочным файлом-маркером (/tmp/poc-proof.txt), который обвязка создаёт сама. Ни один публичный экземпляр Jenkins не сканируется и не опрашивается, и никакой реальный секрет, такой как secrets/master.key или credentials.xml, никогда не читается.

Ссылки

  • Бюллетень безопасности Jenkins от 2024-01-24 (SECURITY-3314, SECURITY-3315): https://www.jenkins.io/security/advisory/2024-01-24/
  • Запись NVD для CVE-2024-23897: https://nvd.nist.gov/vuln/detail/CVE-2024-23897
  • Коммит с исправлением 554f0378 в jenkinsci/jenkins: https://github.com/jenkinsci/jenkins/commit/554f03782057c499c49bbb06575f0d28b5200edb
  • args4j (ParserProperties.withAtSyntax): https://github.com/kohsuke/args4j
  • Анализ Zscaler ThreatLabz (от чтения файла к RCE): https://www.zscaler.com/blogs/security-research/jenkins-arbitrary-file-leak-vulnerability-cve-2024-23897-can-lead-rce
Скачать инструмент