Skip to content
A detailed explainer is available in Japanese. Read the Japanese explainer
Critical

Outline、SSO連携でアカウント乗っ取りの恐れ 1.11.0で修正

GHSA-48rq-wx9j-g949 First seen on SecPulse

Summary

社内wikiのOutlineに、複数のログイン方式(SSO/OIDC)を併用していると、別の方式からのログインで他人のアカウントに入れてしまう弱点が見つかりました。自社でOutlineを運用していて、Googleなど複数のログイン方式を有効にしている組織が影響を受けます。修正版は1.11.0なので、該当する場合は更新し、ログイン方式の設定を確認してください。

AI summary

Written by an external AI model and may contain mistakes. Check the original description and references below before acting on it.

社内wikiのOutlineに、複数のログイン方式(SSO/OIDC)を併用していると、別の方式からのログインで他人のアカウントに入れてしまう弱点が見つかりました。自社でOutlineを運用していて、Googleなど複数のログイン方式を有効にしている組織が影響を受けます。修正版は1.11.0なので、該当する場合は更新し、ログイン方式の設定を確認してください。

Affected packages

EcosystemPackageAffectedFixed
other Outline
< 1.11.0
1.11.0
Original description The description as published by the source.

Vulnerability Details

File: server/commands/userProvisioner.ts
Line: 76-114
CWE: CWE-287 — Improper Authentication
Severity: Critical
CVSS: 9.1 — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N

Root Cause

userProvisioner() looks up an existing UserAuthentication record purely by providerId (the external user ID reported by whichever OAuth/OIDC provider is being used, e.g. a Google sub claim, a Slack member ID, a Discord snowflake, or a custom OIDC sub) and team:

const auth = authentication
  ? await UserAuthentication.findOne({
      where: { providerId: String(authentication.providerId) },
      include: [{ model: User, as: "user", where: { teamId }, required: true }],
    })
  : undefined;

if (auth && authentication) {
  const { user } = auth;

  // We found an authentication record that matches the user id, but it's
  // associated with a different authentication provider... Auto-migrate to the new provider.
  if (auth.authenticationProviderId !== authenticationProviderId) {
    await auth.update({ authenticationProviderId });
  }

  if (user) {
    if (emailVerified === true) {
      await user.update({ email });
    }
    await auth.update(rest);
    return { user, authentication: auth, isNewUser: false };
  }
}

providerId values are only guaranteed unique within their own provider's namespace — nothing in the code or database guarantees uniqueness across different provider types. I confirmed directly: the actual DB…

Source: GitHub Repository Security Advisories (Game のスタック) GitHub Advisory OSV

References

We use cookies for analytics and ad measurement. This setting applies to all Game co., Ltd. sites. Details