Skip to content

fix(auth): prevent signup token issuance for existing accounts (CVE-2026-10130)#581

Merged
Naseem77 merged 7 commits into
stagingfrom
fix/cve-2026-10130-signup-token-bypass
May 31, 2026
Merged

fix(auth): prevent signup token issuance for existing accounts (CVE-2026-10130)#581
Naseem77 merged 7 commits into
stagingfrom
fix/cve-2026-10130-signup-token-bypass

Conversation

@barakb
Copy link
Copy Markdown
Contributor

@barakb barakb commented May 31, 2026

Summary

Fixes CVE-2026-10130 — Authentication Bypass via Email Signup Token Issuance for Existing Accounts.

POST /signup/email always issued a valid api_token session cookie and returned success: true, even when the email already belonged to an existing account. The user/identity merge query (_build_user_merge_query) unconditionally links the freshly generated token to the matched identity, so an attacker could sign up with a victim's email and any password to obtain an authenticated session for that account without knowing the password → account takeover.

Because User nodes are merged by email while email Identity nodes are keyed by (provider, provider_user_id), this also allowed taking over accounts originally created via Google/GitHub OAuth (a new email identity attaches to the victim's existing User).

Fix

  • Add _email_account_exists(email) and reject signup with 409 whenever a User or Identity already exists for the email (any provider), before any token is generated. Fails closed (exceptions propagate → 500, no token issued).
  • If account creation does not yield a genuinely new identity (e.g. a concurrent-signup race), return 500, issue no cookie, and clean up any linked token.
  • ensure_user_in_organizations is left unchanged, so OAuth flows are unaffected.

Tests

New tests/test_email_signup.py (4 tests, all passing):

  • existing account → 409, no token, no DB/password write
  • existence-check failure → fails closed (500, no token)
  • new account → 201, token issued, password stored
  • creation race (non-new identity) → 500, no token, token cleanup

Full unit suite: 132 passed, 10 skipped. (The 4 test_simple_integration.py errors are pre-existing and reproduce on the unmodified base — a server-startup env issue unrelated to this change.)

Note / follow-up

A narrow residual TOCTOU remains only if a different provider creates the same-email account in the sub-millisecond window between the pre-check and creation. It does not apply to the existing-account attack this CVE describes; fully closing it would require an atomic create-if-absent query shared with the OAuth path.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Summary by CodeRabbit

  • Bug Fixes

    • Email signup now blocks registration when an account with the same email exists (returns HTTP 409) and does not set an API token.
    • Improved signup error handling: on failures or race conditions, any issued tokens are cleaned up, mail-hash is set only for successful signups, and the endpoint fails closed.
  • Tests

    • Added comprehensive tests covering email-signup success, conflict, race/failure paths, token cleanup, and query error propagation.
  • Chores

    • Updated Playwright-related CI steps and test-runner dev-dependencies.

…026-10130)

The POST /signup/email endpoint always issued a valid api_token session
cookie and returned success, even when the email already belonged to an
existing account. The user/identity merge query unconditionally links the
freshly generated token to the matched identity, so an attacker could sign
up with a victim's email and any password to obtain an authenticated
session for that account without knowing the password.

Because User nodes are merged by email while email Identity nodes are keyed
by (provider, provider_user_id), this also allowed taking over accounts that
were originally created via Google/GitHub OAuth.

Reject signup with 409 whenever a User or Identity already exists for the
email (any provider), before any token is generated, and fail closed if the
existence check errors. If account creation does not yield a new identity
(e.g. a concurrent-signup race), return 500, issue no cookie, and clean up
any linked token.

Add regression tests covering the existing-account rejection, fail-closed
behaviour, the legitimate new-user flow, and the creation-race path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@railway-app
Copy link
Copy Markdown

railway-app Bot commented May 31, 2026

This PR was not deployed automatically as @barakb does not have access to the Railway project.

In order to get automatic PR deploys, please add @barakb to your workspace on Railway.

@overcut-ai
Copy link
Copy Markdown

overcut-ai Bot commented May 31, 2026

Completed Working on "Code Review"

✅ Review submitted: COMMENT. Total comments: 2 across 1 files.

✅ Workflow completed successfully.


👉 View complete log

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 31, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
npm/@playwright/test 1.56.1 🟢 6.5
Details
CheckScoreReason
Maintained🟢 1030 commit(s) out of 30 and 6 issue activity out of 30 found in the last 90 days -- score normalized to 10
Code-Review🟢 9GitHub code reviews found for 29 commits out of the last 30 -- score normalized to 9
CII-Best-Practices⚠️ 0no badge detected
Vulnerabilities🟢 10no vulnerabilities detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
License🟢 10license file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1no published package detected
Token-Permissions⚠️ 0non read-only tokens detected in GitHub workflows
Binary-Artifacts🟢 6binaries present in source code
Dependency-Update-Tool🟢 10update tool detected
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
npm/@rolldown/pluginutils 1.0.1 UnknownUnknown
npm/@swc/core 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-darwin-arm64 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-darwin-x64 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-arm-gnueabihf 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-arm64-gnu 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-arm64-musl 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-ppc64-gnu 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-s390x-gnu 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-x64-gnu 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-linux-x64-musl 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-win32-arm64-msvc 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-win32-ia32-msvc 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/core-win32-x64-msvc 1.15.40 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@swc/types 0.1.26 🟢 6.9
Details
CheckScoreReason
Code-Review🟢 3Found 11/30 approved changesets -- score normalized to 3
Maintained🟢 1030 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy🟢 10security policy file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
License🟢 10license file detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Fuzzing🟢 10project is fuzzed
Packaging🟢 10packaging workflow detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
npm/@vitejs/plugin-react-swc 4.3.1 🟢 7.4
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 3Found 7/22 approved changesets -- score normalized to 3
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Token-Permissions🟢 7detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies🟢 9dependency not pinned by hash detected -- score normalized to 9
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
SAST🟢 7SAST tool is not run on all commits -- score normalized to 7
npm/nanoid 3.3.12 🟢 5.8
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
Code-Review⚠️ 1Found 4/29 approved changesets -- score normalized to 1
Security-Policy🟢 10security policy file detected
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 10all dependencies are pinned
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 7SAST tool is not run on all commits -- score normalized to 7
npm/playwright 1.56.1 🟢 6.5
Details
CheckScoreReason
Maintained🟢 1030 commit(s) out of 30 and 6 issue activity out of 30 found in the last 90 days -- score normalized to 10
Code-Review🟢 9GitHub code reviews found for 29 commits out of the last 30 -- score normalized to 9
CII-Best-Practices⚠️ 0no badge detected
Vulnerabilities🟢 10no vulnerabilities detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
License🟢 10license file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1no published package detected
Token-Permissions⚠️ 0non read-only tokens detected in GitHub workflows
Binary-Artifacts🟢 6binaries present in source code
Dependency-Update-Tool🟢 10update tool detected
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
npm/playwright-core 1.56.1 🟢 6.5
Details
CheckScoreReason
Maintained🟢 1030 commit(s) out of 30 and 6 issue activity out of 30 found in the last 90 days -- score normalized to 10
Code-Review🟢 9GitHub code reviews found for 29 commits out of the last 30 -- score normalized to 9
CII-Best-Practices⚠️ 0no badge detected
Vulnerabilities🟢 10no vulnerabilities detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 10security policy file detected
License🟢 10license file detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1no published package detected
Token-Permissions⚠️ 0non read-only tokens detected in GitHub workflows
Binary-Artifacts🟢 6binaries present in source code
Dependency-Update-Tool🟢 10update tool detected
Fuzzing⚠️ 0project is not fuzzed
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
npm/postcss 8.5.15 🟢 6.2
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Security-Policy🟢 10security policy file detected
Maintained🟢 1030 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Code-Review⚠️ 0Found 2/27 approved changesets -- score normalized to 0
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 10all dependencies are pinned
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing🟢 10project is fuzzed
Branch-Protection🟢 3branch protection is not maximal on development and all release branches
Signed-Releases⚠️ -1no releases found
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0

Scanned Files

  • .github/workflows/playwright.yml
  • package-lock.json

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 31, 2026

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds _email_account_exists() and a pre-check to the email signup flow to reject already-registered emails (HTTP 409); refactors token issuance so provisional tokens are deleted on creation races (HTTP 500). Adds regression and unit tests covering existence checks, success, and failure/race behaviors. Updates Playwright CI cache/restore and conditional browser install steps and pins Playwright devDependency versions.

Changes

Email Signup Security Fix

Layer / File(s) Summary
Email account existence check
api/routes/auth.py
New _email_account_exists() helper queries the Organizations graph for any User or Identity records matching the email across providers.
Signup endpoint refactor with CVE mitigation
api/routes/auth.py
email_signup pre-checks email existence and returns HTTP 409 if found. Token issuance is provisional: if ensure_user_in_organizations reports no new_identity, the handler deletes the token (delete_user_token) and returns HTTP 500. Password hashing and _set_mail_hash occur only after successful identity creation.
Test helpers
tests/test_email_signup.py
Module docstring, mocked request builder, signup-data factory, and set-cookie header extractor to support tests.
Regression test cases
tests/test_email_signup.py
Tests for existing-email rejection (409, no token), existence-check exception (500, no token), successful new-account creation (201 with token and mail-hash), and creation-race failure (500 with token cleanup and no mail-hash).
Unit tests for helper
tests/test_email_signup.py
Unit tests mapping graph query results to boolean outcomes for _email_account_exists, and ensuring query errors propagate.

Playwright CI and DevDeps

Layer / File(s) Summary
Playwright workflow cache & conditional install
.github/workflows/playwright.yml
Adds restore-keys fallback, conditionally installs full Chromium (playwright install --with-deps) on cache miss or only system deps (playwright install-deps) on cache hit; removes duplicate later install block.
Playwright devDependencies
package.json
Updates devDependencies for @playwright/test and playwright from ^1.57.0 to ^1.56.1.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant email_signup as email_signup_handler
  participant OrgsGraph as OrganizationsGraph
  participant TokenSvc as TokenService
  participant EnsureUser as ensure_user_in_organizations
  participant MailHash as _set_mail_hash

  Client->>email_signup: POST /signup/email (email, password)
  email_signup->>OrgsGraph: call `_email_account_exists(email)`
  alt email exists
    OrgsGraph-->>email_signup: exists
    email_signup-->>Client: 409 Conflict
  else email not found
    email_signup->>TokenSvc: issue provisional api_token
    email_signup->>EnsureUser: ensure_user_in_organizations(with token)
    alt new_identity created
      EnsureUser-->>email_signup: new_identity
      email_signup->>MailHash: _set_mail_hash(new_identity, password_hash)
      email_signup-->>Client: 201 Created + set `api_token` cookie
    else creation failed / race
      EnsureUser-->>email_signup: no new_identity
      email_signup->>TokenSvc: delete_user_token(api_token)
      email_signup-->>Client: 500 Internal Server Error
    end
  end
Loading

🎯 4 (Complex) | ⏱️ ~45 minutes

🐰 A security sprint so fine,
No duplicate emails shall align!
With tokens cleaned up when things fail,
And tests that track each edge case's trail—
The signup route's now breach-proof and ready! 🔐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 46.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main security fix: preventing signup token issuance for existing accounts in relation to CVE-2026-10130, which directly aligns with the primary changes across all modified files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/cve-2026-10130-signup-token-bypass

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread api/routes/auth.py
# an attacker take over that account without knowing its password
# (CVE-2026-10130, authentication bypass via signup token issuance).
if await _email_account_exists(email):
logging.info("Signup attempt for existing account: %s", _sanitize_for_log(email))
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a false positive. The logged email is (a) validated against a strict regex ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ earlier in the handler, which rejects any CR/LF, and (b) passed through _sanitize_for_log(), which strips \r, \n and tabs before logging. CodeQL just doesn't model _sanitize_for_log as a sanitizer. This matches the existing logging convention used throughout this module, and the CodeQL analysis check itself passes.

Comment thread api/routes/auth.py
# Creation failed (e.g. DB error) or raced with a concurrent signup.
# Never issue a token in this case; clean up any token that was linked.
logging.error("Failed to create new user during signup: %s",
_sanitize_for_log(email))
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a false positive. The logged email is (a) validated against a strict regex ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ earlier in the handler, which rejects any CR/LF, and (b) passed through _sanitize_for_log(), which strips \r, \n and tabs before logging. CodeQL just doesn't model _sanitize_for_log as a sanitizer. This matches the existing logging convention used throughout this module, and the CodeQL analysis check itself passes.

Comment thread api/routes/auth.py

# Hash password
password_hash = _hash_password(password)
logging.info("New user created: %s", _sanitize_for_log(email))
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a false positive. The logged email is (a) validated against a strict regex ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ earlier in the handler, which rejects any CR/LF, and (b) passed through _sanitize_for_log(), which strips \r, \n and tabs before logging. CodeQL just doesn't model _sanitize_for_log as a sanitizer. This matches the existing logging convention used throughout this module, and the CodeQL analysis check itself passes.

Copy link
Copy Markdown

@overcut-ai overcut-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Final Review Summary

Findings by importance

  • BLOCKER: 0
  • CRITICAL: 0
  • MAJOR: 2
  • MINOR: 0
  • SUGGESTION: 0
  • PRAISE: 0

Key themes

  1. Failure-path robustness: cleanup failure handling can currently alter intended response behavior in hardened auth/signup error paths.
  2. Signup-path performance/query design: the account-existence check may introduce avoidable multiplicative work under load due to query shape.

Actionable next steps

  1. Make token cleanup in the non-new-identity branch best-effort (catch/log cleanup errors) so the API still returns the deterministic 500 response for that branch.
  2. Rewrite _email_account_exists to use existence semantics (e.g., EXISTS { ... }) rather than additive counts across optional matches to avoid Cartesian amplification.
  3. After updates, run and confirm the new tests/test_email_signup.py scenarios still pass, especially race/failure branches.

Comment thread api/routes/auth.py
logging.error("Failed to create new user during signup: %s",
_sanitize_for_log(email))
await delete_user_token(api_token)
return JSONResponse(
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major]: In the non-new-identity failure branch, delete_user_token(api_token) is awaited without guarding exceptions. If token cleanup fails, the handler will raise and skip the intended controlled 500 JSON response, creating inconsistent client behavior for the race/failure path this change is trying to harden.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — looked into this. The handler does not actually break its controlled error path here, for two reasons:

  1. delete_user_token already catches and swallows its own exceptions internally (it logs and returns), so it never propagates out of this branch.
  2. Even if it did raise, the surrounding try/except in email_signup returns the same deterministic 500 {"success": false, "error": "Registration failed"} response.

So the status code and body are identical regardless, and no token is ever returned to the client on this path. I've left the call as-is rather than adding a redundant inner guard, but happy to wrap it explicitly if you'd prefer defense-in-depth.

Comment thread api/routes/auth.py Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_email_signup.py`:
- Around line 61-64: Add the required pytest markers to the test function
test_existence_check_failure_fails_closed: add `@pytest.mark.unit` and
`@pytest.mark.auth` above the method decorator stack (alongside the existing
`@pytest.mark.asyncio` and `@patch` decorators) so the test is categorized correctly
for unit and auth runs.
- Around line 77-84: The test method test_new_account_is_created_with_token is
missing pytest classification markers; add `@pytest.mark.unit` and
`@pytest.mark.auth` above the test (e.g., directly above or alongside the existing
`@pytest.mark.asyncio` decorator) so the function has the unit and auth markers
while preserving the existing `@patch` decorators and AsyncMock usage in the
function signature.
- Around line 40-47: The test method
test_existing_account_is_rejected_without_token is missing required pytest
markers; add the decorators `@pytest.mark.unit` and `@pytest.mark.auth` above the
function (alongside the existing `@pytest.mark.asyncio`) so the function is
correctly categorized; ensure the new markers appear before the function
definition and above the patch decorators or in a consistent order with other
tests.
- Around line 99-107: The test method
test_non_new_identity_is_rejected_and_token_cleaned_up is missing pytest
markers; add the decorators `@pytest.mark.unit` and `@pytest.mark.auth` immediately
above the existing `@pytest.mark.asyncio` so the test is categorized correctly
(keep the existing patches and AsyncMock decorators intact) and ensure imports
for pytest markers are available if not already.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4feec536-2306-4ca7-b2b1-da8ef2daaf7d

📥 Commits

Reviewing files that changed from the base of the PR and between fd1dbe1 and 8074483.

📒 Files selected for processing (2)
  • api/routes/auth.py
  • tests/test_email_signup.py

Comment thread tests/test_email_signup.py
Comment thread tests/test_email_signup.py
Comment thread tests/test_email_signup.py
Comment thread tests/test_email_signup.py
barakb and others added 2 commits May 31, 2026 11:00
- Rewrite _email_account_exists as a UNION of two label-scoped, index-friendly
  lookups (LIMIT 1 per side). The previous chained OPTIONAL MATCH could form a
  Cartesian product (review feedback), and an aggregating WITH variant returned
  NULL under FalkorDB parameter binding, which would have made the check fail
  open. Verified the UNION query against FalkorDB for present/absent/identity-only
  cases.
- Add tests pinning the helper's result interpretation (non-empty -> exists,
  empty -> not exists, query error propagates so the endpoint fails closed).
- Regenerate root package-lock.json so `npm ci` is in sync with app/package.json
  after the @vitejs/plugin-react-swc bump (#554), unblocking the Playwright job.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Addresses CodeRabbit review: per AGENTS.md and the strict-markers config, test
functions must carry a registered marker. Apply unit and auth module-wide.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
tests/test_email_signup.py (1)

141-159: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add the required pytest markers to these new helper tests.

These three async tests still need @pytest.mark.unit and @pytest.mark.auth so they participate in the expected test slices.

🏷️ Proposed fix
+    `@pytest.mark.unit`
+    `@pytest.mark.auth`
     `@pytest.mark.asyncio`
     async def test_non_empty_result_means_account_exists(self):
         # UNION yields one row per matching User/Identity node.
         with self._patch_graph([["node-a"], ["node-b"]]):
             assert await _email_account_exists("taken@example.com") is True

+    `@pytest.mark.unit`
+    `@pytest.mark.auth`
     `@pytest.mark.asyncio`
     async def test_empty_result_means_no_account(self):
         with self._patch_graph([]):
             assert await _email_account_exists("free@example.com") is False

+    `@pytest.mark.unit`
+    `@pytest.mark.auth`
     `@pytest.mark.asyncio`
     async def test_query_error_propagates_to_fail_closed(self):
         """The helper must not swallow errors, so the endpoint can fail closed."""

As per coding guidelines: Mark test functions with pytest markers: e2e, slow, auth, integration, unit.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_email_signup.py` around lines 141 - 159, The three async tests
(test_non_empty_result_means_account_exists, test_empty_result_means_no_account,
test_query_error_propagates_to_fail_closed) are missing required pytest markers;
add `@pytest.mark.unit` and `@pytest.mark.auth` above each test (in addition to the
existing `@pytest.mark.asyncio`) so they are included in the unit/auth test
slices.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@tests/test_email_signup.py`:
- Around line 141-159: The three async tests
(test_non_empty_result_means_account_exists, test_empty_result_means_no_account,
test_query_error_propagates_to_fail_closed) are missing required pytest markers;
add `@pytest.mark.unit` and `@pytest.mark.auth` above each test (in addition to the
existing `@pytest.mark.asyncio`) so they are included in the unit/auth test
slices.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ca7d158e-4568-461e-b6e4-488e5cc11201

📥 Commits

Reviewing files that changed from the base of the PR and between 8074483 and 90d814d.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (2)
  • api/routes/auth.py
  • tests/test_email_signup.py

@barakb barakb requested a review from Naseem77 May 31, 2026 08:21
Naseem77 and others added 2 commits May 31, 2026 11:57
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@package.json`:
- Around line 6-8: Add a short rationale for downgrading "`@playwright/test`" and
"playwright" from 1.57.0 to 1.56.1 in the PR description and the commit message
that touches package.json: state whether the downgrade is to mitigate test
stability/performance issues (link the Playwright issue e.g., GH `#38489` about
memory regressions and the Chrome-for-Testing default change) or whether it is
unrelated to CVE-2026-10130; if unrelated, move the version change into a
separate PR to keep the security fix narrowly scoped and reference the
issue/decision in the security PR.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 376d7758-4bb7-40fd-b18c-46c7109c4190

📥 Commits

Reviewing files that changed from the base of the PR and between 53bfde8 and d2c7815.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (1)
  • package.json

Comment thread package.json
Comment on lines +6 to +8
"@playwright/test": "^1.56.1",
"@types/node": "^22.10.2",
"playwright": "^1.57.0",
"playwright": "^1.56.1",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Playwright latest version 2026

💡 Result:

As of May 31, 2026, the latest stable version of Playwright is v1.60.0 [1][2]. This version was released on May 11, 2026 [1][3]. Playwright is widely used for web testing, automation, and increasingly for agentic web browsing workflows in 2026 [4][5]. Users can find the official release notes and documentation on the Playwright website [6]. Development remains active, with ongoing updates to browser versions and integration support across its supported languages, including the.NET implementation which also reached v1.60.0 in May 2026 [7][2].

Citations:


🌐 Web query:

Playwright 1.57.0 security vulnerabilities or issues

💡 Result:

As of May 31, 2026, there are no direct, publicly documented security vulnerabilities explicitly assigned to Playwright version 1.57.0 in major vulnerability databases like Snyk [1]. While no critical vulnerabilities are specific to this version, users should be aware of the following context regarding security and performance: 1. Browser-Related Vulnerabilities: Playwright 1.57.0 introduced a significant architectural change by switching from Chromium to Chrome for Testing (CfT) builds [2][3][4]. Because Playwright uses these browser binaries, it remains indirectly susceptible to security vulnerabilities found in the underlying Chrome/Chromium engine [5][6]. Users must keep their Playwright installations updated to receive the latest browser patches provided by the Playwright team to mitigate these threats [5][6]. 2. Dependency and Utility Issues: Like many large software projects, Playwright periodically addresses potential vulnerabilities in its internal utilities. For example, recent maintenance in the repository has addressed issues such as polynomial backtracking in regular expression utilities used for log/output processing [7], which, while not a critical remote code execution flaw, represents the type of security hardening typically managed through ongoing updates. 3. Historical Context: A known critical vulnerability (GHSA-7mvr-c777-76hp) regarding improper SSL certificate validation (use of curl -k in installer scripts) was addressed in previous versions (fixed in v1.56.0) [8], and is not present in 1.57.0. 4. Operational Considerations: Some users reported performance and stability concerns following the upgrade to 1.57.0, specifically regarding higher memory usage attributed to the switch to Chrome for Testing [9]. While these are functional bugs rather than security vulnerabilities, they have impacted CI/CD environments where resource limits are strictly enforced [9]. For the most secure experience, it is recommended to monitor the official Playwright GitHub releases and security advisories, and to keep your Playwright package and its associated browser binaries updated to the latest available version [1][2].

Citations:


🌐 Web query:

Playwright 1.57.0 Chrome for Testing memory usage issue 38489 downgrade 1.56.1

💡 Result:

In Playwright version 1.57.0, the framework officially switched from using lightweight Chromium builds to Google Chrome for Testing (CfT) for both headed and headless browser execution [1][2]. Following this transition, some users reported significant increases in memory usage (e.g., reaching 20GB+ per instance) in GitHub issue #38489 [3][4]. For users experiencing this issue, downgrading to Playwright 1.56.1 remains a common troubleshooting step to restore the previous browser behavior and memory footprint while investigating the performance regression [3]. Key points regarding this transition: - Official Change: Playwright 1.57.0 moved to Chrome for Testing to ensure closer parity with the stable Chrome browser [1][2]. - Reported Behavior: Users on issue #38489 noted that even when specifying 'chromium' in their configuration, Playwright defaults to launching Chrome for Testing, which they observed consuming substantially more RAM than the prior Chromium versions [3]. - Recommendations: If you encounter unexpected memory pressure or system crashes after upgrading to v1.57.0, check if the issue persists without custom launch arguments [3]. If it does, downgrading to 1.56.1 can serve as an immediate mitigation to restore stability to your test environment [3]. Users should continue to monitor the official GitHub repository for updates or fixes regarding the high memory consumption associated with Chrome for Testing [3][5].

Citations:


🌐 Web query:

Playwright 1.56.1 release notes security advisories

💡 Result:

Playwright version 1.56.1 was released on October 17, 2025 [1][2]. The release notes for v1.56.1 focus on maintenance and internal improvements rather than security advisories [1][2]. Specifically, the changes included: - Allowing 'local-network-access' permission in Chromium [1]. - Removing 'workspaceFolder' references from the VS Code MCP [1]. - Renaming 'agents' to 'test agents' [1]. - Implementing a fallback to the current working directory (cwd) when resolving test configurations [1]. There are no specific security advisories associated with the v1.56.1 release [1][2]. As of May 2026, Playwright is on much newer versions (e.g., v1.60.0, released May 11, 2026) [3][4]. Users seeking information on recent vulnerabilities should consult the official Playwright GitHub repository for the most up-to-date security-related patches and browser engine updates, as many security concerns in browser automation are addressed by rolling to newer, patched Chromium versions [5][6].

Citations:


🌐 Web query:

Playwright 1.57.0 Chrome for Testing memory usage issue 38489 downgrade 1.56.1

💡 Result:

In Playwright version 1.57.0, a significant change was introduced where the framework transitioned from using lightweight, open-source Chromium builds to using Google's Chrome for Testing (CfT) for all Chromium-based operations [1]. This change is the subject of issue #38489, where users reported experiencing drastically increased memory usage (e.g., reaching 20GB+ per instance) and system instability when running tests under this newer version [2][3]. The issue report highlights that users are unable to revert to the previous Chromium-based behavior, as Playwright 1.57.0 forces the use of Chrome for Testing [2]. If you are encountering memory-related performance regressions or other compatibility issues (such as difficulties with specific drag-and-drop libraries) after updating to 1.57.0, downgrading to version 1.56.1 is a documented workaround used by the community to restore previous behavior [4]. To downgrade, you can use your package manager to reinstall the previous version: For npm: npm install --save-dev @playwright/test@1.56.1 For yarn: yarn add -D @playwright/test@1.56.1 As noted in the official release documentation, Chrome for Testing is now the default, and there is no native "switch" to return to the older open-source Chromium builds within the 1.57.x release line [2][1]. Staying on 1.56.1 allows you to maintain the previous browser environment until the memory usage or compatibility concerns are addressed in future updates [4].

Citations:


🌐 Web query:

Playwright 1.56.1 release notes security advisories

💡 Result:

Playwright version 1.56.1, released on October 17, 2025, did not include any security advisories [1]. The release primarily focused on minor maintenance and enhancements, including allowing local-network-access permissions in Chromium and updating Playwright Test Agent configurations [1][2]. There are no recorded security vulnerabilities associated with this specific version in the official release notes [1].

Citations:


Document the rationale for the Playwright downgrade (1.57.0 → 1.56.1)

"`@playwright/test`": "^1.56.1",
"`@types/node`": "^22.10.2",
"playwright": "^1.56.1",
  • Playwright 1.57.0 switched defaults to Chrome for Testing, and there are reports of major memory regressions (e.g., GitHub issue #38489) where downgrading to 1.56.1 is used as a workaround.
  • PR objectives focus on CVE-2026-10130; please state whether the downgrade is for test stability/performance (and link the relevant issue), or if it’s unrelated and should move to a separate PR to keep the security fix narrowly scoped.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@package.json` around lines 6 - 8, Add a short rationale for downgrading
"`@playwright/test`" and "playwright" from 1.57.0 to 1.56.1 in the PR description
and the commit message that touches package.json: state whether the downgrade is
to mitigate test stability/performance issues (link the Playwright issue e.g.,
GH `#38489` about memory regressions and the Chrome-for-Testing default change) or
whether it is unrelated to CVE-2026-10130; if unrelated, move the version change
into a separate PR to keep the security fix narrowly scoped and reference the
issue/decision in the security PR.

Naseem77 and others added 2 commits May 31, 2026 12:35
Co-Authored-By: Copilot <223556219+Copilot@users.noreply.github.com>
@Naseem77 Naseem77 merged commit e74b504 into staging May 31, 2026
13 checks passed
@Naseem77 Naseem77 deleted the fix/cve-2026-10130-signup-token-bypass branch May 31, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants