CVE-2026-92289
UnknownSummary
A vulnerability in Lemonldap::NG::Portal (Perl) allows a PKCE bypass for public Relying Parties in "PKCE or secret" mode because checkEndPointAuthenticationCredentials does not verify the client secret. With oidcRPMetaDataOptionsRequirePKCE set to 2, the authorization endpoint issues a code even without a code_challenge, and token() admits the exchange if a challenge was stored or an authentication method was returned. An attacker can exchange an intercepted authorization code for the user's access, ID, and refresh tokens.
Risk Assessment
An attacker who intercepts an authorization code issued to a public Relying Party can exchange it for the user's access, ID, and refresh tokens, which is the attack PKCE prevents. This can lead to full user session takeover.
Recommendation
Update Lemonldap::NG::Portal to version 2.23.4 or later. Consider disabling dynamic client registration or enforcing client secret verification for public Relying Parties.
Other vulnerabilities in Lemonldap::NG::Portal
See all- CVE-2026-92288Unknown
A vulnerability in Lemonldap::NG::Portal (Perl) allows unauthenticated OAuth2 token introspection because checkEndPointAuthenticationCredentials does not verify the client secret of a public Relying Party. The function skips the secret comparison for a public Relying Party and returns the authentication method deduced from the request, so a request with a public client_id and an arbitrary or empty secret passes the endpoint's authentication check. An attacker can confirm the token is active and read its metadata, including scope, audience, expiry, and sub.
- CVE-2026-19349Critical
Lemonldap::NG::Portal versions from 2.0.0 before 2.16.9, from 2.17.0 before 2.21.5, from 2.22.0 before 2.23.3 for Perl allow authentication bypass via an OAuth2 state parameter stored as an SSO session in the GitHub and LinkedIn backends. An attacker can replay the session identifier as a session cookie and obtain a valid SSO session without authenticating.
Original NVD description (English source)
Lemonldap::NG::Portal versions from 2.23.0 before 2.23.4 for Perl allow a PKCE bypass for public Relying Parties in "PKCE or secret" mode because checkEndPointAuthenticationCredentials does not verify the client secret. With oidcRPMetaDataOptionsRequirePKCE set to 2, the authorization endpoint issues a code even when the request carries no code_challenge, and token() admits the exchange as long as a challenge was stored or an authentication method was returned for the caller. checkEndPointAuthenticationCredentials() skips the secret comparison for a Relying Party marked public and still returns the method deduced from the request, so any Basic or form credential satisfies the secret branch. validatePKCEChallenge() then passes, because neither a challenge nor a verifier is present. An attacker who intercepts an authorization code issued to a public Relying Party can exchange it for the user's access, ID and refresh tokens by replaying the client_id with an arbitrary secret, which is the attack PKCE prevents. Dynamic client registration creates every Relying Party in this mode.

