Новости

CVE-2026-20896 в Gitea: проверь Docker-образ и доступ к порту

Дмитрий Потоцкий 1 мин чтения
CVE-2026-20896 в Gitea: проверь Docker-образ и доступ к порту

Один запрос к HTTP-порту Gitea с заголовком X-WEBAUTH-USER: admin может открыть административную сессию. Пароль, API-токен и действие пользователя не нужны — если контейнер запущен с уязвимой связкой настроек.

Проверка занимает несколько минут. Нужно выяснить четыре вещи: версию Docker-образа, состояние reverse-proxy-аутентификации, список доверенных прокси и доступность HTTP-порта из недоверенной сети. Если совпали все четыре условия, закрывай порт и обновляй Gitea сегодня.

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

CVE-2026-20896 затрагивает официальные Docker-образы Gitea 1.26.2 и старше. Бинарные установки и самостоятельно собранные конфигурации на основе app.example.ini не получили ошибочный параметр из Docker-шаблона.

Сам по себе старый образ ещё не доказывает уязвимость. Для атаки должны одновременно выполняться четыре условия:

  • используется официальный Docker-образ Gitea ≤ 1.26.2;
  • ENABLE_REVERSE_PROXY_AUTHENTICATION = true;
  • REVERSE_PROXY_TRUSTED_PROXIES = *;
  • HTTP-порт контейнера доступен недоверенному источнику.

Reverse-proxy-аутентификация в Gitea по умолчанию выключена. Штатное значение доверенных прокси — 127.0.0.0/8,::1/128. Ошибка Docker-шаблона подменяла его на *, то есть разрешала приложению доверять заголовкам от любого IP-адреса.

Проверь секцию [service] в действующем app.ini:

[service]
ENABLE_REVERSE_PROXY_AUTHENTICATION = true
REVERSE_PROXY_TRUSTED_PROXIES = *

Если видишь такую пару, переходи к сетевой проверке. Контейнер за закрытым внутренним ingress не равен контейнеру с опубликованным портом: атакующему нужно обратиться к HTTP-порту Gitea напрямую.

Один заголовок превращается в административную сессию

В режиме reverse-proxy-аутентификации Gitea принимает X-WEBAUTH-USER как имя уже проверенного пользователя. Обычно этот заголовок добавляет прокси после собственной аутентификации.

Параметр REVERSE_PROXY_TRUSTED_PROXIES = * ломает границу доверия. Запрос может прийти не от прокси, а от любого узла, который достигает порта контейнера. Gitea всё равно считает заголовок авторитетным.

Дальше запрос выглядит концептуально так:

X-WEBAUTH-USER: admin

На уязвимой конфигурации приложение открывает сессию пользователя admin без его пароля или токена.

После входа атакующий получает чтение и запись приватных репозиториев. Он также может добраться до SSH-ключей, изменить вебхуки и извлечь учётные данные из репозиториев и конфигурации CI/CD (excello.digital, lemma.frame00.com). Если секреты хранятся рядом с кодом, пригодится отдельный разбор о том, как защитить секреты CI.

Ставь 1.26.4, а не 1.26.3

Gitea исправила CVE-2026-20896 в версии 1.26.3 от 20 июня 2026 года. На следующий день вышла 1.26.4: она устранила регрессию кодовой страницы, появившуюся в 1.26.3. Поэтому обновляться лучше сразу до 1.26.4 или новее (excello.digital, lemma.frame00.com).

После обновления проверь конфигурацию вручную. Патч закрывает дефект образа, но wildcard в старом volume с app.ini может пережить замену контейнера.

Если reverse-proxy-аутентификация не нужна, выключи её:

[service]
ENABLE_REVERSE_PROXY_AUTHENTICATION = false

Если нужна, ограничь доверие loopback-сетями:

[service]
ENABLE_REVERSE_PROXY_AUTHENTICATION = true
REVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.0/8,::1/128

Именно такое значение Gitea указывает как штатное; его также рекомендуют для устранения риска CVE-2026-20896 (rescana.com, penligent.ai). Если прокси работает на другом хосте, укажи его реальную подсеть вместо * и закрой порт Gitea от остальных источников.

Внешний порт меняет патч в расследование

Первые попытки поиска уязвимых серверов заметили через 13 дней после публикации исправления. Наблюдатели насчитали около 6200 доступных из интернета инстансов, которые могли попасть под сканирование (rescana.com, lemma.frame00.com).

Источники расходятся в оценке активности. Secarma сообщает об эксплуатации, а данные Sysdig подтверждают сканирование, но не дальнейшие действия на найденных серверах (secarma.com, lemma.frame00.com). Поэтому нельзя считать каждый открытый инстанс взломанным. Нельзя и считать его чистым только потому, что контейнер уже обновлён.

Если уязвимый порт был доступен извне, проверь журналы прокси и Gitea за период до обновления. Ищи запросы в обход штатного прокси, неожиданные входы, изменения SSH-ключей, вебхуков, пользователей и репозиториев.

При следах доступа отзывай API-токены и SSH-ключи. Меняй пароли, ключи деплоя и учётные данные, найденные в приватных репозиториях или CI/CD: у административной сессии был доступ к коду, вебхукам и секретам (secarma.com, lemma.frame00.com).

Закончи проверку сегодня

Инстанс требует немедленного обновления, если ты подтвердил все четыре условия: официальный Docker-образ ≤ 1.26.2, включённую reverse-proxy-аутентификацию, REVERSE_PROXY_TRUSTED_PROXIES = * и доступ к HTTP-порту из недоверенной сети.

Пройди один чек-лист:

  1. Определи версию запущенного образа, а не только тег в Compose-файле.
  2. Найди в действующем app.ini оба параметра reverse-proxy-аутентификации.
  3. Проверь публикацию HTTP-порта, ingress и правила firewall.
  4. Обнови Gitea до 1.26.4 или новее и убери wildcard из доверенных прокси.
  5. Если порт был открыт извне, проверь журналы и смени доступные Gitea секреты.

Результат должен быть однозначным: либо четыре условия атаки не сходятся и ты фиксируешь почему, либо считаешь инстанс затронутым, закрываешь вход и переходишь к аудиту.