Обнаруживает CVE-2026-19478 в GitLab CE/EE с помощью неразрушающего шаблона Nuclei, который запускает вызов метода резервного поля GraphQL через touch и подтверждает уязвимые экземпляры без деструктивных вызовов.
Неразрушающий шаблон обнаружения Nuclei для CVE-2026-19478 — критической (CVSS 9.4) неаутентифицированной уязвимости произвольного вызова методов в GraphQL API GitLab, исправленной GitLab 17 августа 2026 года.
Схема GraphQL в GitLab поддерживает директиву @gl_introduced(version: "X.Y.Z"), которая ограничивает поле минимальной версией GitLab. Когда директива ссылается на версию , чем у запущенного экземпляра, GitLab генерирует для (иначе неизвестного) имени поля. Этот резервный резолвер вызывает напрямую на базовом Ruby-объекте — , и других — .
object.public_send(method_name)ProjectUserРезультат: неаутентифицированный злоумышленник, имеющий доступ к /api/graphql и знающий fullPath любого публичного проекта (или имя пользователя любого публичного профиля), может вызывать любой публичный метод без аргументов этого объекта. Это включает методы только для чтения, такие как touch, а также разрушительные, например destroy / delete, и изменяющие состояние, такие как deactivate / block / ban.
Шаблон из этого репозитория вызывает только touch (обновляет updated_at, возвращает true) — см. Безопасность ниже.
| Линейка | Затронуто | Исправлено |
|---|---|---|
| 18.2.x – 18.11.x | >= 18.2, < 18.11.11 | 18.11.11 |
| 19.0.x | < 19.0.8 | 19.0.8 |
| 19.1.x | < 19.1.6 | 19.1.6 |
| 19.2.x | < 19.2.4 | 19.2.4 |
Только self-managed GitLab CE/EE — GitLab.com и GitLab Dedicated не были затронуты.
Этот шаблон намеренно «обезврежен» для сканирования парков серверов, на тестирование которых у вас есть разрешение:
touch через резервное поле (метод ActiveRecord, который просто обновляет updated_at и возвращает true).destroy, delete, deactivate, block или ban — все они достижимы через ту же ошибку и действительно разрушительны.root по умолчанию. Если ни то, ни другое недоступно, он просто сообщает «не обнаружено», а не гадает.Не используйте GraphQL-запрос из этого шаблона для вызова изменяющих состояние методов против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.
| Шаг | Запрос | Назначение |
|---|---|---|
| 1 | GET /api/v4/projects?visibility=public | Найти публичный проект в качестве безвредной цели |
| 2 | POST /api/graphql — touch @gl_introduced(version: "999.0.0") для этого проекта | Запустить резолвер резервного поля; уязвимый экземпляр возвращает "touch": true |
| 3 (запасной) | POST /api/graphql — тот же запрос к user(username: "root") | Используется, только если в шаге 1 не найден ни один публичный проект |
Исправленный экземпляр сразу отклоняет неизвестное поле ("... doesn't exist on type ..."), поэтому матчер шаблона требует положительный сигнал touch и отсутствие этого сообщения об отклонении.
# single target
nuclei -t CVE-2026-19478.yaml -u https://gitlab.example.com
# validate the template itself
nuclei -t CVE-2026-19478.yaml -validate
# a list of targets, JSON output
nuclei -t CVE-2026-19478.yaml -l targets.txt -j -o results.json
Требуется nuclei v3 (в этом шаблоне используется блок протокола http: и jq-подобный извлекатель json, появившиеся в шаблонном движке v3; на nuclei v2.x он не загрузится).
[CVE-2026-19478] [http] [critical] https://gitlab.example.com/api/graphql
Обновитесь до 18.11.11, 19.0.8, 19.1.6 или 19.2.4 (или более поздней версии). Полный бюллетень см. в примечаниях GitLab к выпуску патча 19.2.4.
Этот шаблон опубликован в целях защитной безопасности — для сканирования инфраструктуры, которой вы владеете или на тестирование которой у вас есть явное разрешение. Запуск его (или связанного PoC) против систем без авторизации незаконен в большинстве юрисдикций. Автор не несёт ответственности за неправомерное использование.