CVE-2026-12746
Full vulnerability record from the local CVENow database.
Description
Dancer2::Plugin::Auth::OAuth::Provider versions before 0.23 for Perl do not support the OAuth 2.0 state parameter. The authentication_url method builds the provider authorization redirect without issuing a state value, and the callback method exchanges the callback code and registers the resulting token into the session without verifying that the callback corresponds to an authorization request this session initiated. Any application that uses this plugin for OAuth 2.0 login is exposed to login cross-site request forgery: because the callback is not bound to the session that began the flow, an attacker who starts an authorization with their own provider account can deliver the resulting callback to a victim, causing the victim's session to complete the attacker's authorization and associating the attacker's provider identity and access token with that session. Where the application persists this as an account link, the attacker may retain access to the victim's account through their own provider credentials.
View original CVE JSON
{
"id": "CVE-2026-12746",
"sourceIdentifier": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
"published": "2026-07-04T18:16:28.247",
"lastModified": "2026-10-25T15:10:00.147",
"vulnStatus": "Deferred",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Dancer2::Plugin::Auth::OAuth::Provider versions before 0.23 for Perl do not support the OAuth 2.0 state parameter.\n\nThe authentication_url method builds the provider authorization redirect without issuing a state value, and the callback method exchanges the callback code and registers the resulting token into the session without verifying that the callback corresponds to an authorization request this session initiated.\n\nAny application that uses this plugin for OAuth 2.0 login is exposed to login cross-site request forgery: because the callback is not bound to the session that began the flow, an attacker who starts an authorization with their own provider account can deliver the resulting callback to a victim, causing the victim's session to complete the attacker's authorization and associating the attacker's provider identity and access token with that session. Where the application persists this as an account link, the attacker may retain access to the victim's account through their own provider credentials."
},
{
"lang": "es",
"value": "Las versiones de Dancer2::Plugin::Auth::OAuth::Provider anteriores a 0.23 para Perl no son compatibles con el parámetro state de OAuth 2.0.\n\nEl método authentication_url construye la redirección de autorización del proveedor sin emitir un valor state, y el método callback intercambia el código de callback y registra el token resultante en la sesión sin verificar que el callback corresponde a una petición de autorización que esta sesión inició.\n\nCualquier aplicación que utilice este plugin para el inicio de sesión de OAuth 2.0 está expuesta a la falsificación de petición en sitios cruzados de inicio de sesión: porque el callback no está vinculado a la sesión que inició el flujo, un atacante que inicia una autorización con su propia cuenta de proveedor puede entregar el callback resultante a una víctima, haciendo que la sesión de la víctima complete la autorización del atacante y asociando la identidad del proveedor y el token de acceso del atacante con esa sesión. Donde la aplicación persiste esto como un enlace de cuenta, el atacante puede retener el acceso a la cuenta de la víctima a través de sus propias credenciales de proveedor."
}
],
"affected": [
{
"source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
"affectedData": [
{
"vendor": "BIAFRA",
"product": "Dancer2::Plugin::Auth::OAuth::Provider",
"defaultStatus": "unaffected",
"collectionURL": "https://cpan.org/modules",
"packageName": "Dancer2-Plugin-Auth-OAuth",
"programFiles": [
"lib/Dancer2/Plugin/Auth/OAuth/Provider.pm"
],
"programRoutines": [
{
"name": "Dancer2::Plugin::Auth::OAuth::Provider::authentication_url"
},
{
"name": "Dancer2::Plugin::Auth::OAuth::Provider::callback"
}
],
"repo": "https://github.com/biafra/perl-Dancer2-Plugin-Auth-OAuth",
"versions": [
{
"version": "0",
"lessThan": "0.23",
"versionType": "custom",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N",
"baseScore": 8.1,
"baseSeverity": "HIGH",
"attackVector": "NETWORK",
"attackComplexity": "LOW",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "UNCHANGED",
"confidentialityImpact": "HIGH",
"integrityImpact": "HIGH",
"availabilityImpact": "NONE"
},
"exploitabilityScore": 2.8,
"impactScore": 5.2
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-07-06T14:55:59.796200Z",
"id": "CVE-2026-12746",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "total"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-352"
}
]
}
],
"references": [
{
"url": "https://datatracker.ietf.org/doc/html/rfc6749#section-10.12",
"source": "9b29abf9-4ab0-4765-b253-1875cd9b441e"
},
{
"url": "https://github.com/biafra/perl-Dancer2-Plugin-Auth-OAuth/commit/806420fc2abbe13bede4461475f2f3dcd7daf5f2.patch",
"source": "9b29abf9-4ab0-4765-b253-1875cd9b441e"
},
{
"url": "https://metacpan.org/release/BIAFRA/Dancer2-Plugin-Auth-OAuth-0.23/diff/BIAFRA/Dancer2-Plugin-Auth-OAuth-0.22",
"source": "9b29abf9-4ab0-4765-b253-1875cd9b441e"
},
{
"url": "http://www.openwall.com/lists/oss-security/2026/07/04/9",
"source": "af854a3a-2127-422b-91ae-364da2661108"
}
]
}