CVE-2026-39976Laravel Passport 在 13.0.0 至 13.7.1 之前的版本中存在严重的认证绕过漏洞。该漏洞源于 `client_credentials` 授权模式的令牌处理机制存在缺陷。由于底层的 `league/oauth2-server` 库将 JWT 的 `sub` 声明设置为客户端标识符,而 Laravel 的 Token Guard 在验证时未校验该标识符是否为有效的用户 ID,直接将其传递给 `retrieveById()` 方法。这导致攻击者可以利用机器对机器(M2M)令牌,通过特定的客户端 ID 枚举或匹配,意外地获取并认证为应用程序中的真实用户账户,从而绕过正常的身份验证流程,获取高权限访问能力。
该漏洞的技术核心在于 JWT 令牌验证逻辑中的类型混淆问题。在标准的 OAuth2 `client_credentials` 授权流程中,颁发的令牌本质上代表的是“机器客户端”而非具体的“人类用户”。然而,受影响的 Laravel Passport 版本所依赖的 `league/oauth2-server` 库在生成 JWT 时,将 `sub`(Subject)字段填充为客户端 ID(Client ID)。当 Laravel 的 Token Guard 尝试解析当前认证主体时,它直接读取 JWT 中的 `sub` 字段,并将其作为参数传递给 User Provider 的 `retrieveById($id)` 方法。关键缺陷在于,系统并未在调用 `retrieveById` 之前验证 `$id` 参数究竟是一个用户 ID 还是一个客户端 ID。如果数据库中的用户主键 ID 与某个 OAuth 客户端的 ID 在数值上完全相同(例如都是整数 1),系统就会产生逻辑错误,将原本代表客户端的标识符解析为对应的用户对象。攻击者只需持有有效的客户端凭证,即可利用这一逻辑缺陷,通过构造或碰撞特定的 ID 值,伪装成系统内的任意高权限用户,从而完全接管用户会话,窃取数据或执行未授权操作。