
Nextcloud 35.0.0 — делегированный администратор Webhooks может создать 1-часовой пароль приложения администратора через токен обновления вебхука tokenNeeded
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create() обнуляет tokenNeeded, если вызывающий не является полным администратором экземпляра. update() — нет. Делегированный администратор настроек Webhooks (не входящий в admin) может сохранить tokenNeeded.user_ids: ["admin"] для существующего вебхука, а затем получить часовой неограниченный пароль приложения PERMANENT_TOKEN для этого uid, когда событие сработает.
Злоумышленник, которому доверили только управление вебхуками, может войти как admin (или любой указанный им пользователь) на один час, обойти 2FA и читать или перезаписывать файлы этого человека.
| ID | CVE пока нет |
| CWE | CWE-863, CWE-269 |
| CVSS | Высокий: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | Nextcloud Server |
| Затронуто | 35.0.0 (da02f41) официальный nextcloud:35.0.0-apache |
| Аутентификация | делегированный администратор настроек Webhooks (IDelegatedSettings) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Вы дали кому-то задачу настройки Webhooks. Он не входит в группу admin. Nextcloud всё равно позволяет ему редактировать существующий вебхук так, чтобы при следующем подходящем событии сервер отправил ему часовой логин для любого указанного uid, включая admin.
С этим логином он может:
Ему не нужен PHP-шелл на хосте. Ему не нужно быть полным администратором экземпляра. Посторонний в интернете без учётной записи этого сделать не может. Дыра — это сотрудник, которому вы уже доверили вебхуки, выдающий себя за тех, кому вы не доверяли.
WebhooksController помечен #[AuthorizedAdminSetting(settings: Admin::class)]. Admin реализует IDelegatedSettings. Именно так Nextcloud передаёт панель настроек группе, не являющейся admin.
tokenNeeded просит сервер прикрепить токены аутентификации для указанных uid, когда вебхук срабатывает. TokenService::createEphemeralToken создаёт IToken::PERMANENT_TOKEN с password = null. Пароль приложения. 2FA уже позади.
PR #60543 закрыл create: если вы не полный администратор экземпляра, tokenNeeded обнуляется. Я создал вебхук как делегированный пользователь hooker с tokenNeeded.user_ids: ["admin"]. Сохранённый tokenNeeded был []. Create закрыт. Минуту это выглядит как завершённый патч.
Затем я отправил то же тело POST-запросом на /webhooks/{id}. Сохранённый user_ids был ['admin']. update() так и не скопировал if.
PUT файла от имени hooker, чтобы сработал NodeCreatedEvent. Cron запускает WebhookCall. В JSON перехватчика есть authentication.user_ids.admin.token. Bearer GET приватного файла-свидетеля admin вернул 200, X-User-Id: admin.
Способы, которыми это умирает, ничему вас не научив: update 403 (контроллер уже совпадает с create); create уже создаёт токены (#60543 отсутствует в сборке); пустой authentication в перехватчике (cron не создал); путь заголовка ExApp (пользователь лаборатории — делегированный hooker).
cd lab
./run.sh
Цель только http://127.0.0.1:18320 (Nextcloud) и :18321 (перехватчик).
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
Скопируйте обнуление isAdmin из create в update(). Пока это не выпущено, не делегируйте настройки Webhooks группам, не являющимся admin.
da02f41)GNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.