Критическая уязвимость в Gogs позволяет любому аутентифицированному пользователю выполнить произвольный код

Исследователи Rapid7 раскрыли неустранённую уязвимость класса argument injection в Gogs — популярном самохостящемся Git-сервисе на Go. Через имя ветки в pull request атакующий внедряет флаг --exec в git rebase и получает RCE на сервере. Патча на момент публикации нет, для эксплуатации опубликован модуль Metasploit.

Команда Rapid7 Labs сообщила о критической уязвимости в Gogs — самохостящемся Git-сервисе, написанном на Go и популярном как лёгкая альтернатива GitHub в компаниях, университетах и open source-проектах. Уязвимость отнесена к классу argument injection (CWE-88) и оценена авторами в 9,4 балла по CVSSv4. Подтверждённые затронутые версии — 0.14.2 и 0.15.0+dev (коммит b53d3162); предположительно уязвимы и все предыдущие выпуски, поддерживающие слияние через rebase.

Суть проблемы — в функции Merge() из internal/database/pull.go: имя базовой ветки pull request передаётся напрямую команде git rebase без разделителя --, ограничивающего разбор опций. Атакующий создаёт ветку с именем вида --exec=<команда> (пробелы заменяются на ${IFS}, запрещённые в именах рефов символы — на base64-обёртку), и при операции «Rebase before merging» Git выполняет переданную строку через sh -c после воспроизведения каждого коммита. Проверка имён рефов через git rev-parse --verify атаку не блокирует: ветка с таким именем действительно существует в репозитории, поэтому валидация проходит.

Сценарий эксплуатации не требует административных прав и взаимодействия с другими пользователями. В конфигурации по умолчанию у Gogs включена открытая регистрация (DISABLE_REGISTRATION = false) и не ограничено создание репозиториев (MAX_CREATION_LIMIT = -1), а владелец репозитория сам может включить rebase-слияние в настройках. На инсталляциях с ограниченным созданием репозиториев достаточно прав на запись в любой существующий репозиторий, где включён rebase. Опубликован модуль Metasploit, автоматизирующий атаку как против Linux, так и против Windows (на NTFS используется доставка полезной нагрузки через файл в репозитории из-за запрета символа | в именах рефов).

В результате злоумышленник получает выполнение произвольных команд от имени процесса Gogs (обычно пользователь git). Это даёт доступ ко всем репозиториям на инстансе, включая приватные, позволяет извлечь хеши паролей, API-токены, SSH-ключи и секреты 2FA из БД, перемещаться по сети и подменять код в любом размещённом репозитории. Поиск в Shodan по заголовку страницы входа возвращает около 1141 доступного из интернета инстанса, реальная установленная база значительно больше за счёт развёртываний за VPN и во внутренних сетях.

По данным Rapid7, об уязвимости сопровождающим Gogs сообщили 17 марта 2026 года, получение отчёта подтверждено 28 марта, однако исправление не выпущено и на дату публикации (28 мая 2026). Это уже не первая брешь подобного класса в проекте: ранее закрывались CVE-2024-39930, CVE-2024-39932, CVE-2024-39933 и CVE-2026-26194, но путь через Merge() использовал прямой вызов exec.Command в обход защищённого API библиотеки git-module и остался непропатченным.

В качестве временных мер администраторам рекомендуют отключить открытую регистрацию (DISABLE_REGISTRATION = true), запретить создание репозиториев пользователями (MAX_CREATION_LIMIT = 0) и аудитить настройки rebase-слияния, а также проверять логи на ошибки слияния с подозрительными именами веток, начинающимися с --, и список персональных API-токенов вида msf_<hex>, остающихся после атаки через модуль Metasploit.

Источник: rapid7.com

Связь с редакцией