Nextcloud 35.0.0 — секрет федеративного общего доступа представляет собой app password без ограничения области действия для всего дерева Files владельца общего доступа
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-federated-ocm-token
Nextcloud Server 35.0.0 - Nextcloud GmbH
Секрет федеративного общего доступа создаётся как неограниченный PERMANENT_TOKEN app password для владельца общего доступа. API получателя возвращает его как refresh_token. При повторном использовании его как Bearer на WebDAV отправителя происходит вход от имени владельца и чтение файлов, которые никогда не были расшарены.
Злоумышленник, с которым вы поделились одним файлом через федеративный общий доступ, может войти от вашего имени в ваш Nextcloud, обойти 2FA и читать или перезаписывать все ваши файлы, а не только тот, которым вы поделились.
| ID | пока нет CVE |
| CWE | CWE-269, CWE-287 |
| CVSS | Critical: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N (федеративный получатель). Конвертация публичной ссылки хуже (нет аккаунта получателя на пире). |
| Продукт | Nextcloud Server |
| Затронуто | 35.0.0 (da02f41) официальный nextcloud:35.0.0-apache |
| Аутентификация | федеративный получатель (или конвертер публичной ссылки) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Вы делитесь одним файлом или папкой с bob на другом Nextcloud. Nextcloud создаёт 32-символьный секрет, сохраняет его как ваш app password и передаёт этот секрет Bob'у как refresh_token.
Затем Bob (или любой, кто конвертирует вашу публичную ссылку в федеративный общий доступ):
Они не получают PHP-шелл на хосте. Им не нужен ваш пароль. Не принимайте общий доступ и не вызывайте OCM access-token первым: этот обмен блокирует область файловой системы. Лаборатория доказывает секрет до обмена.
Общий доступ должен быть общим доступом. Один файл. Одна папка. Я прочитал FederatedShareProvider::createFederatedShare на теге v35.0.0. Он создаёт 32-символьный секрет как IToken::PERMANENT_TOKEN для владельца без области действия. PublicKeyToken::getScopeAsArray по умолчанию устанавливает SCOPE_FILESYSTEM => true. Это app password. Session::tryTokenLogin принимает постоянный Bearer.
Работа над OCM-обменом (PR #57234 / #57166) уже блокирует область файловой системы после первого обмена. В неофициальной публикации использовался этот хоп после обмена. Я попробовал его первым. На этом дереве обменянный токен — TEMPORARY, с именем OCM Access Token, и /remote.php/dav его отклоняет (allowOcmAccessToken false). DAV сказал нет.
Поэтому я не стал обменивать. ocm_discovery_enabled остался false, чтобы получатель не обменял его за меня. Два официальных бокса nextcloud:35.0.0-apache, overwrite.cli.url как docker DNS (http://sender / http://recipient). Оставьте это на 127.0.0.1, и S2S будет общаться сам с собой.
Alice делится одним файлом с bob@http://recipient. Bob читает ожидающие общие доступы. Длина refresh_token — 32. Длина access_token — 0. Неаутентифицированный Bearer GET приватного файла-свидетеля Alice, никогда не входившего в общий доступ, вернул 200, X-User-Id: alice.
cd lab
./run.sh
Цель только http://127.0.0.1:18340 (отправитель) и :18341 (получатель).
SUCCESS NEXTCLOUD-OCM-PERMANENT-TOKEN who=federated-recipient uid=alice NEXTCLOUD-OCM-PERMANENT-TOKEN-WITNESS
Создавайте федеративный секрет с областью файловой системы false с самой первой вставки. Не принимайте этот секрет как Bearer/Basic на /remote.php/dav. Первый обмен уже блокирует область FS; создание никогда не должно было выдавать app password.
GNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.