
Nextcloud 35.0.0 — 위임된 Webhooks 관리자가 webhook update tokenNeeded를 통해 1시간짜리 관리자 앱 비밀번호를 발급할 수 있음
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
Nextcloud Server 35.0.0 - Nextcloud GmbH
WebhooksController::create()는 호출자가 전체 인스턴스 관리자가 아니면 tokenNeeded를 null로 만든다. update()는 그렇지 않다. 위임된 Webhooks 설정 관리자(admin 그룹에 속하지 않음)는 기존 웹훅에 tokenNeeded.user_ids: ["admin"]을 저장한 다음, 이벤트가 발생할 때 해당 uid에 대해 1시간짜리 범위 없는 PERMANENT_TOKEN 앱 비밀번호를 받을 수 있다.
웹훅 관리만 신뢰받았던 악의적인 행위자가 1시간 동안 admin(또는 자신이 지정한 임의의 사용자)으로 로그인하고, 2FA를 건너뛰고, 그 사람의 파일을 읽거나 덮어쓸 수 있다.
| ID | 아직 CVE 없음 |
| CWE | CWE-863, CWE-269 |
| CVSS | High: 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)에 대해 1시간짜리 로그인을 메일로 보내도록 만든다.
그 로그인으로 그들은 다음을 할 수 있다:
호스트에 PHP 셸이 필요하지 않다. 전체 인스턴스 관리자가 될 필요도 없다. 계정이 없는 인터넷상의 낯선 사람은 이걸 할 수 없다. 이 취약점은 당신이 이미 웹훅 관리를 신뢰한 직원이, 당신이 신뢰하지 않은 사람들을 사칭하는 것이다.
WebhooksController는 #[AuthorizedAdminSetting(settings: Admin::class)]이다. Admin은 IDelegatedSettings를 구현한다. 이것이 Nextcloud가 admin이 아닌 그룹에 설정 패널을 넘겨주는 방식이다.
tokenNeeded는 웹훅이 발생할 때 지정된 uid에 대한 인증 토큰을 서버가 첨부하도록 요청한다. TokenService::createEphemeralToken은 password = null로 IToken::PERMANENT_TOKEN을 발급한다. 앱 비밀번호다. 2FA는 이미 통과한 상태다.
PR #60543은 create를 제한했다: 전체 인스턴스 관리자가 아니면 tokenNeeded가 null로 만들어진다. 나는 위임된 사용자 hooker로 tokenNeeded.user_ids: ["admin"]을 가진 웹훅을 생성했다. 저장된 tokenNeeded는 []였다. Create는 제한된다. 잠시 동안은 이것이 완성된 패치처럼 보인다.
그런 다음 나는 동일한 본문을 /webhooks/{id}에 POST했다. 저장된 user_ids는 ['admin']이었다. update()는 그 if를 복사하지 않았다.
hooker로서 파일을 PUT하여 NodeCreatedEvent가 발생하게 했다. Cron이 WebhookCall을 실행한다. Catcher JSON에 authentication.user_ids.admin.token이 있다. 관리자 개인 witness 파일에 대한 Bearer GET이 200, X-User-Id: admin을 반환했다.
이것이 아무것도 가르쳐주지 않고 실패하는 경우들: update 403 (컨트롤러가 이미 create와 일치함); create가 이미 토큰을 발급함 (#60543이 빌드에 없음); catcher에서 빈 authentication (cron이 발급하지 않음); ExApp 헤더 경로 (랩 사용자는 위임된 hooker임).
cd lab
./run.sh
오직 http://127.0.0.1:18320 (Nextcloud)과 :18321 (catcher)만 대상으로 한다.
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
create의 isAdmin null 처리 로직을 update()에 복사하라. 그것이 배포되기 전까지는 Webhooks 설정을 비관리자 그룹에 위임하지 마라.
da02f41)GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.