
Forgejo 16.0.5 — высокий — удалённый — чтение файлов — restore-repo следует за file:// со стороны дампа в attachments
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-restore-file-open
Класс: Чтение файлов Достижимость: Локальная
Forgejo 16.0.5 (8d24b7d) - Forgejo
forgejo restore-repo недоверенного дампа перезаписывает URL-адреса ресурсов релиза с помощью сырого filepath.Join(baseDir, download_url) и добавляет префикс file://. uri.Open всё ещё выполняет os.Open для этого пути. Пустой --units восстанавливает релизы. В Gitea 1.27.0 добавлен localFileURL и пропущено экранирование записей. Этого помощника здесь нет.
Восстановление оператором недоверенного дампа копирует файл хоста, который может открыть uid forgejo, во вложение релиза.
| ID | CVE пока нет |
| Класс | Чтение файлов |
| Достижимость | Локальная (оператор forgejo restore-repo недоверенного дампа) |
| CWE | CWE-22 / CWE-73 |
| CVSS | Высокий: 7.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| Продукт | Forgejo |
| Затронуто | по v16.0.5 (8d24b7d); локальное восстановление оператором |
| Аутентификация | локальное восстановление оператором недоверенного дампа |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Передайте оператору каталог дампа (или уже имейте INTERNAL_TOKEN и путь, который сервер может прочитать). Юниты включают releases / release_assets.
| Привилегия | Метод / точка сброса | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Прочитать файл хоста, который может открыть uid forgejo, через .. из дампа | release.yml download_url: ../FORGEJO-FILE-WITNESS.txt; восстановление объединяет, uri.Open выполняет os.Open, байты сохраняются как witness.txt | Разведка (конфиденциальность файлов хоста) | Доказано в лаборатории. Тело вложения — FORGEJO-RESTORE-FILE-OPEN-WITNESS. Приманка внутри дампа INSIDE-DUMP-NOT-HOST не была отдана |
| Тот же результат с символической ссылкой, помещённой внутрь дампа | Объединённый путь остаётся под baseDir; os.Open следует по ссылке | Разведка | Выведено из uri.Open file -> os.Open. В лаборатории использовался .., а не символическая ссылка |
| Тот же сток на патчах PR | pull_request.yml PatchURL перезаписывается так же, затем uri.Open в repo/pulls/<n>.patch | Разведка | Выведено из restore.go GetPullRequests. В лаборатории восстанавливались только релизы |
| Читатели восстановленного репозитория скачивают файл хоста | GET /<owner>/<repo>/releases/download/<tag>/<name> | Разведка | Доказано в лаборатории как labadmin Basic на восстановленном публичном репозитории |
Типичные файлы хоста: app.ini, INTERNAL_TOKEN, SECRET_KEY, пароль БД | uid forgejo может читать дерево конфигурации | Разведка | Выведено. Свидетелем в лаборатории был подложенный файл рядом с дампом, а не реальные секреты |
Закрыто здесь: живой POST /repos/migrate file:// LFI (DownloadFunc установлен; PR PatchURL проверяется на префикс относительно HTTP-базы клона). Побег из объединения с корнем дампа через абсолютный DownloadURL (Go filepath.Join("/dump", "/etc/passwd") остаётся /dump/etc/passwd). Неаутентифицированное HTTP-восстановление (только CLI / внутренний токен). Упаковка app.ini в резервный dump (секреты по замыслу, режим архива 0600). Не OS LPE. Не удалённый LFI.
У меня было две идеи по восстановлению. Сначала я мысленно проверил абсолютное объединение в Gitea. Go filepath.Join не отбрасывает абсолютный второй аргумент так, как это делает Python os.path.join. Рабочий ввод — относительный ... localFileURL из Gitea в этом дереве отсутствует.
Уже зафиксированные неверные пути: побег из объединения с корнем дампа через абсолютный DownloadURL; живой migrate file:// LFI; X-Forgejo-Internal-Auth (восстановление — это CLI от имени uid forgejo, а не /api/internal); трактовка HTTP-восстановления как удалённого неаутентифицированного; обратная оболочка. Театр.
python3 forgejo-restore-file-open-Abraxas-Labs.py
или:
cd lab
./run.sh
Цель только http://127.0.0.1:19340. Образ codeberg.org/forgejo/forgejo:16.0.5. Свидетель FORGEJO-RESTORE-FILE-OPEN-WITNESS.
IOC asset name='witness.txt' ...
IOC download status=200 bytes=34 snippet=b'FORGEJO-RESTORE-FILE-OPEN-WITNESS\n'
SUCCESS forgejo-restore-file-open how=live ..-join file:// os.Open FORGEJO-RESTORE-FILE-OPEN-WITNESS
Удерживайте объединённые пути под baseDir после EvalSymlinks (Gitea PR 38215 localFileURL). Отклоняйте ... Не следуйте по символическим ссылкам на стороне дампа за пределы дампа. Уберите file:// из uri.Open, кроме помощника с корнем дампа.
restore.go · uri.goGNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.