laravel/passport security advisory
CVE-2026-39976: Laravel Passport: TokenGuard Authenticates Unrelated User for Client Credentials Tokens
CVE-2026-39976 is a high-severity authentication bypass vulnerability in the PHP package laravel/passport (CVSS 7.1), published 9 April 2026. It is fixed in 13.7.1; earlier versions are affected. Exploiting it needs a low-privilege user account.
high 7.1 published 2026-04-09 · updated 2026-10-26
- Affected versions
- >= 13.0.0, < 13.7.1
- Fixed in
- 13.7.1
- Newest release
- 13.10.0
- Severity
- High · CVSS 7.1
- Type
- Authentication bypass
CWE-287 - Exploited in the wild
- Not on the CISA KEV list
checked 2026-11-04
Is your laravel/passport version affected?
Who can exploit CVE-2026-39976
- Access: A normal, low-privilege user account in the app.
- Conditions: It only works under specific conditions the attacker does not fully control (CVSS rates the attack as high complexity).
CVSS vector (scored by GitHub): CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:N
How to fix CVE-2026-39976 in laravel/passport
- Find the installed version:
composer show laravel/passport. If you never required it yourself,composer why laravel/passportshows which package pulls it in. - Update it:
composer update laravel/passport --with-all-dependencies. You need 13.7.1 or newer. - If Composer will not go that high, your composer.json constraint is holding it back. Widen it (for example
"laravel/passport": "^13.7.1"if you can take that version), or upgrade the package that requires it. - Run
composer audit. It reads the same advisory data and should no longer list CVE-2026-39976. - Commit composer.lock and deploy it. On the server, run
composer install --no-devfrom the lock file, notcomposer update.
If you cannot upgrade yet
- Remove accounts you do not need and review what each role can do.
- Put the admin area behind a VPN, IP allow-list or extra login until you upgrade.
- If your app does not use the affected feature, note that in your audit, but still plan the upgrade.
The CVE-2026-39976 advisory
Laravel Passport provides OAuth2 server support to Laravel. From 13.0.0 to before 13.7.1, there is an Authentication Bypass for client_credentials tokens. the league/oauth2-server library sets the JWT sub claim to the client identifier (since there's no user). The token guard then passes this value to retrieveById() without validating it's actually a user identifier, potentially resolving an unrelated real user. Any machine-to-machine token can inadvertently authenticate as an actual user. This vulnerability is fixed in 13.7.1.
References
- GitHub advisory GHSA-349c-2h2f-mxf6 github.com
- Pull request #1901 github.com
- Pull request #1902 github.com
- github.com github.com
- github.com github.com
Related
Need help patching or upgrading? Laskyr does PHP and Laravel security fixes and upgrades. Tell us what you run and we reply with a plan and a price.
Ask about a fixWhere this data comes from
- Affected and fixed versions: the Packagist security advisories API (GitHub Advisory Database and FriendsOfPHP), the same data
composer audituses. Synced 2026-11-03. - Description, score, weakness and references: NIST National Vulnerability Database (NVD), checked 2026-11-04. This product uses data from the NVD API but is not endorsed or certified by the NVD.
- Exploited-in-the-wild status: the CISA Known Exploited Vulnerabilities catalog, checked 2026-11-04.
- Compiled by Daniel Lasek at Laskyr from the sources above. The summary, “who can exploit it”, “how to fix it” and hardening sections are our plain-English reading of the record and are generated from it. The quoted description is the record's own text. Spot an error? Tell us.