
Nextcloud 35.0.0 — 委任されたWebhooks管理者がwebhook更新のtokenNeeded経由で1時間有効な管理者アプリパスワードを発行可能
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-webhook-tokenneeded
解説記事: https://abraxaslabs.tech/research/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(catcher)のみです。
SUCCESS NEXTCLOUD-WEBHOOK-TOKENNEEDED who=delegated-webhook-admin uid=admin NEXTCLOUD-WEBHOOK-TOKENNEEDED-WITNESS
作成時の isAdmin の null 化を update() にコピーしてください。これがリリースされるまでは、Webhooks 設定を非管理者グループに委任しないでください。
da02f41)GNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用。保証はありません。