
Forgejo 16.0.5 — высокий уровень — удалённо — SSRF — OpenID discovery загружает URL-адреса, контролируемые атакующим
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-openid-discovery-ssrf
Класс: SSRF Доступ: Удалённый
Forgejo 16.0.5 (8d24b7d) - Forgejo
Когда включён [openid] ENABLE_OPENID_SIGNIN, неаутентифицированный POST /user/login/openid передаёт URL атакующего в yohcop openid-go v1.0.1. Помощники уровня пакета этой библиотеки используют http.DefaultClient. На этом пути нет hostmatcher. Вебхуки и миграции фильтруют исходящие HTTP-запросы. OpenID — нет.
Тот, кто может добраться до формы входа, может инициировать Yadis GET на loopback, RFC1918, CGNAT и IMDS с хоста Forgejo.
| ID | CVE пока нет |
| Класс | SSRF |
| Доступ | Удалённый (неаутентифицированный, когда включён вход через OpenID) |
| CWE | CWE-918 |
| CVSS | Высокий: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Продукт | Forgejo |
| Затронуто | вплоть до v16.0.5 (8d24b7d) с ENABLE_OPENID_SIGNIN; остаток от Gitea CVE-2026-58314 |
| Аутентификация | неаутентифицированный |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Без аккаунта. Отправьте POST с OpenID URL. Хост Forgejo его загрузит.
| Привилегия | Метод / sink | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
| Инициировать Yadis GET на loopback | Неаутентифицированный POST /user/login/openid с openid=http://127.0.0.1:18080/ | Разведка (исходящий HTTP с хоста Forgejo) | Доказано в лаборатории. Oracle увидел GET / с Accept: application/xrds+xml от 127.0.0.1 |
| Проверка RFC1918, CGNAT, link-local, IMDS | Тот же http.DefaultClient Discover, без фильтра IP | Разведка | Выведено из клиента. В лаборатории использовался только loopback |
| Повтор из аутентифицированного add-OpenID | POST /user/settings/security/openid также вызывает RedirectURL и пропускает allowedOpenIDURI | Разведка | Выведено из обработчика. В лаборатории использовался неаутентифицированный POST входа |
| Чтение тел ответов в ошибке входа | После CVE-2021-45325 ошибки больше не выдают содержимое запроса | Разведка | Доказано в лаборатории как закрытое. Этот остаток — это запрос, а не утечка HTML |
Закрыто на этом пине: CSRF ассоциации OpenID (nonce сессии openIDState), hostmatcher вебхуков/миграций (там всё ещё используется), git followRedirects=false, миграция LookupIP CVE-2026-82556. Лаборатория не завершает вход через OpenID и не возвращает шелл.
Флажок веб-установщика по умолчанию включён (EnableOpenIDSignIn = MustBool(!InstallLock) пока не заблокирован, затем записывается в app.ini). После блокировки отсутствующий ключ — false. Шаблон Docker app.ini не содержит секции [openid], поэтому предварительно заблокированный образ без мастера настроек выключен, если оператор не установит ключ. Пустой WHITELISTED_URIS разрешает любой URI.
v16.0.5 закрыл CSRF ассоциации OpenID. Я всё равно задержался на этой поверхности. Gitea PR 38406 / CVE-2026-58314 поместил клиент с фильтрацией hostmatcher в выделенный экземпляр openid-go. Этот пин всё ещё вызывает помощники уровня пакета.
Уже зафиксированные неверные пути: повторная подача CSRF ассоциации (этот nonce есть в дереве); трактовка предварительно заблокированного Docker-образа как значения по умолчанию (мастер настроек записывает флажок); ожидание старой утечки строки ошибки OpenID; обратный шелл. Театр.
python3 forgejo-openid-discovery-ssrf-Abraxas-Labs.py
или:
cd lab
./run.sh
Цель только http://127.0.0.1:19330. Образ codeberg.org/forgejo/forgejo:16.0.5. Oracle использует общий netns с Forgejo и привязывается к 127.0.0.1:18080.
IOC post-openid status=200
IOC xrds-hits count=1
SUCCESS forgejo-openid-discovery-ssrf how=live post=/user/login/openid openid=http://127.0.0.1:18080/ path=/ accept=application/xrds+xml peer=127.0.0.1 post-status=200 FORGEJO-OPENID-DISCOVERY-WITNESS
То же, что и в Gitea PR 38406: http.Client с фильтрацией hostmatcher в выделенном экземпляре openid-go. Оставьте WHITELISTED_URIS в качестве второго барьера. Блокируйте loopback, RFC1918, CGNAT, link-local и метаданные.
modules/auth/openid/openid.goGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.