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

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

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

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

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

Категории

Все категории
Loading categories
cve-2026-85706 — Анализ первопричины, уязвимая лаборатория Docker и PoC-скрипты для CVE-2026-85706 — неаутентифицированного произвольного чтения файлов в GitLab через расхождение парсеров. | Kitploit
Инструменты/GitHubGitHub/0xenesbayram/cve-2026-85706
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHub0xenesbayram/cve-2026-85706

cve-2026-85706

Анализ первопричины, уязвимая лаборатория Docker и PoC-скрипты для CVE-2026-85706 — неаутентифицированного произвольного чтения файлов в GitLab через расхождение парсеров.

Репозиторий
9 ч 26 мин назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-85706 — Неаутентифицированное произвольное чтение файлов в GitLab

CVSS 10.0 · Без аутентификации · Активно эксплуатируется (CISA KEV)

Различие в парсинге между GitLab Workhorse (обратный прокси на Go) и Puma/Grape (Ruby) позволяет неаутентифицированному злоумышленнику обойти ускоренную передачу загрузок Workhorse и достичь трёх эндпоинтов загрузки с контролируемым злоумышленником file.path, что приводит к произвольному чтению файлов на хосте GitLab.

Кодирование одного символа в files как %66iles заставляет маршрут загрузки Workhorse промахнуться (он сопоставляет по закодированному пути), в то время как Rails декодирует его обратно и попадает в реальный обработчик (он маршрутизирует по декодированному пути). Обработчик доверяет сырому параметру file.path, который Workhorse должен был перезаписать — поэтому file.path=/etc/passwd читается с диска без учётных данных.

root@kitploit:~
POST /api/v4/projects/1/repository/%66iles/x?file=&file.path=/etc/passwd&file.size=1
                                   ^^^^^^  Workhorse misses -> raw file.path survives to Rails

Уязвимые / исправленные версии

Версия
УязвимыеCE/EE 18.7 → 19.1.8, 19.2 → 19.2.6, 19.3 → 19.3.2
Исправленные19.1.8 / 19.2.6 / 19.3.2 (2026-09-10)

Что в этом репозитории

ПутьСодержимое
docs/ANALYSIS.mdПолный анализ первопричины — различие в парсинге, два JWT Workhorse, баг доверия к сырому file.path, диф патча и канал эксфильтрации через отражённые ошибки. Анализ выполнен по реальному исходному коду (v19.3.1-ee против v19.3.2-ee).
lab/Уязвимая лаборатория на базе Docker (gitlab-ce:19.3.1-ce.0) + инструкции по развёртыванию.
poc/detect.sh (неразрушающий оракул существования) и exploit.sh (чтение файлов через отражённые ошибки). Одна цель, с обязательной авторизацией.

Предыстория — конвейер обработки запросов GitLab

Не знакомы с внутренним устройством GitLab? Вот что делает каждый слой — в порядке прохождения запроса через них. Более глубокий глоссарий с ключевыми концепциями находится в docs/ANALYSIS.md §0.

root@kitploit:~
  Internet
     │
     ▼
 ┌────────┐     ┌───────────┐     ┌────────┐     ┌──────────────────────┐
 │ NGINX  │────▶│ Workhorse │────▶│  Puma  │────▶│  Grape / Rails app  │
 │(proxy) │     │   (Go)    │     │ (Ruby) │     │      (Ruby)         │
 └────────┘     └───────────┘     └────────┘     └──────────────────────┘
КомпонентЧто это
NGINXВнешний обратный прокси. Завершает TLS, обслуживает статические файлы, перенаправляет всё остальное внутрь. Напрямую не участвует в этой уязвимости.
WorkhorseОбратный прокси на Go, специфичный для GitLab. Его основная задача — снять нагрузку, с которой Ruby справляется медленно, особенно потоковую передачу больших загрузок. Для эндпоинтов загрузки Workhorse буферизует тело во временный файл, подписывает JWT и перезаписывает file.path, чтобы Ruby никогда не видел сырые байты загрузки. Он также проставляет JWT Gitlab-Workhorse-Api-Request для каждого запроса, который пересылает (доказывая «это пришло через прокси», а не «этот пользователь аутентифицирован»).
PumaСервер приложений на Ruby, который запускает приложение Rails. Получает запросы от Workhorse, выполняет middleware (Rack) и передаёт их маршрутизатору.
RackИнтерфейсный слой веб-сервера на Ruby. Middleware Rack обрабатывает парсинг строки запроса, управление сессиями и — что критично здесь — проверку JWT загрузки Workhorse и создание объектов UploadedFile. Rack::Utils.parse_nested_query — это функция, сообщения об ошибках которой утекают содержимое файлов в этом эксплойте.
GrapeФреймворк REST API, используемый GitLab для всех эндпоинтов /api/v4/*. Предоставляет определения маршрутов и before-фильтры, такие как require_gitlab_workhorse! (проверка прокси) и authenticate! (проверка личности пользователя). Работает внутри Rails, на Puma, за Workhorse — поэтому видит декодированный путь URL.
RailsОбщий веб-фреймворк (Ruby on Rails). GitLab — это монолит на Rails — модели, сервисы и middleware работают здесь внутри Puma.

Уязвимость живёт в разрыве между Workhorse (который сопоставляет маршруты по закодированному пути) и Grape/Puma (которые маршрутизируют по декодированному пути). См. ниже.

Кратко о механизме

  1. Различие в парсинге. Workhorse сопоставляет маршруты по r.URL.EscapedPath() (закодированному); Puma/Grape маршрутизирует по декодированному пути. %66iles ≠ регулярному выражению files для Workhorse, но декодируется в files для Rails.
  2. Передача пропущена. Поскольку маршрут загрузки промахнулся, Workhorse никогда не буферизует тело во временный файл, никогда не перезаписывает file.path на подписанный временный путь и никогда не устанавливает заголовок Gitlab-Workhorse-Multipart-Fields — но он всё равно проксирует запрос (с действительным JWT Gitlab-Workhorse-Api-Request).
  3. Отсутствие аутентификации + доверие к сырому параметру. У эндпоинта не было authenticate!, и обработчик читал params['file.path'] напрямую (строку злоумышленника) вместо проверенного Workhorse и ограниченного путём params[:file] UploadedFile.
  4. Эксфильтрация через сообщения об ошибках. Содержимое утекает через строки ошибок Rack::Utils.parse_nested_query ("invalid %-encoding (<file bytes>)") — ответ отражает байты файла до первого недопустимого %.

Патч добавляет authenticate!, переключается на проверенный UploadedFile и перестаёт отражать e.message. См. docs/ANALYSIS.md §5.

Быстрый старт

root@kitploit:~
# 1. Stand up the vulnerable lab (see lab/README.md for details)
cd lab && docker compose up -d      # wait ~5 min for GitLab to become healthy

# 2. Non-destructive detection
../poc/detect.sh http://localhost:8929

# 3. File-read PoC against a file you're authorized to read on your own lab
../poc/exploit.sh http://localhost:8929 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

⚠️ Ответственное использование

Это опубликовано в защитных и образовательных целях: понимание, обнаружение и исправление раскрытой и уже исправленной CVE, которая находится в списке CISA KEV. Скрипты здесь работают с одной целью и требуют явной передачи цели.

  • Запускайте их только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
  • Лаборатория рассчитана на запуск на localhost. Не направляйте её на сторонние хосты.
  • Несанкционированный доступ к компьютерным системам в большинстве юрисдикций незаконен.

Если вы используете GitLab, обновитесь до исправленной версии — это единственное реальное средство устранения.

Ссылки

  • watchTowr — Rapid Reaction: GitLab Path Traversal (CVE-2026-85706)
  • Nuclei Templates — PR #17231
  • Диф исходного кода: gitlab-org/gitlab @ v19.3.1-ee против v19.3.2-ee

Лицензия

MIT — только анализ и код PoC. GitLab является товарным знаком GitLab Inc.; этот репозиторий не связан с GitLab Inc. и не одобрен ею.

Скачать инструмент