
Nextcloud 35.0.0 — 委任されたWebhooks管理者がwebhook更新の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 グループに属さない)は、既存の webhook に tokenNeeded.user_ids: ["admin"] を保存でき、イベント発火時にその uid に対して1時間有効なスコープなしの PERMANENT_TOKEN アプリパスワードを受け取ります。
webhook の管理のみを信頼されていた悪意ある人物が、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 は、その人物が既存の webhook を編集できるようにし、次に一致するイベントが発生したとき、サーバーはその人物が列挙した任意の uid(admin を含む)に対する1時間有効なログイン情報をメールで送信します。
そのログイン情報を使えば、以下のことが可能です:
ホスト上に PHP シェルは不要です。完全なインスタンス管理者である必要もありません。アカウントを持たないインターネット上の他人はこれを実行できません。この穴は、あなたがすでに webhook を信頼して任せたスタッフが、あなたが信頼していない人々になりすますことにあります。
WebhooksController は #[AuthorizedAdminSetting(settings: Admin::class)] です。Admin は IDelegatedSettings を実装しています。これが、Nextcloud が admin ではないグループに設定パネルを委任する仕組みです。
tokenNeeded は、webhook 発火時に指定された uid の認証トークンを添付するようサーバーに要求します。TokenService::createEphemeralToken は password = null で IToken::PERMANENT_TOKEN を発行します。アプリパスワードです。2FA はすでに突破されています。
PR #60543 は create をゲートしました:完全なインスタンス管理者でない限り、tokenNeeded は null にされます。委任ユーザー hooker として tokenNeeded.user_ids: ["admin"] を指定して webhook を作成しました。保存された tokenNeeded は [] でした。create はゲートされています。一瞬、これでパッチが完成したように見えます。
次に、同じボディを /webhooks/{id} に POST しました。保存された user_ids は ['admin'] でした。update() は if をコピーしていませんでした。
hooker としてファイルを PUT して NodeCreatedEvent を発火させます。Cron が WebhookCall を実行します。キャッチャーの JSON に authentication.user_ids.admin.token があります。管理者のプライベート証人ファイルに対する Bearer GET が 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
create の isAdmin null 化を update() にコピーしてください。それがリリースされるまで、Webhooks 設定を非管理者グループに委任しないでください。
da02f41)GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。