{"id":"CVE-2026-72887","aliases":["DEBIAN-CVE-2026-72887","EUVD-2026-59987","GHSA-jh72-4qq2-8j6g","MGASA-2026-0365","UBUNTU-CVE-2026-72887","openSUSE-SU-2026:11551-1"],"status":"published","title":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.\n\nPassing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.\n\noauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","severity":{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical","assessor":"adp","from":"cve"},"epss":{"day":"2026-11-12","score":0.00721,"percentile":0.54454,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-757"],"published":"2026-08-16T13:50:19Z","modified":"2026-10-28T02:30:40Z","fixes":[{"ecosystem":"Debian:14","package":"libnet-oauth-perl","fixed_in":["0.32-1"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"Debian:12","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-4","0.30-1","0.31-1","0.31-2","0.32-1","0.33-1"]},{"source":"osv","ecosystem":"Debian:13","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.31-1","0.31-2","0.32-1","0.33-1"]},{"source":"osv","ecosystem":"Debian:14","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.32-1"}]}],"versions":["0.31-1","0.31-2"]},{"source":"osv","ecosystem":"Mageia:10","package":"perl-Net-OAuth","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.330.0-1.mga10"}]}],"bundled":4},{"source":"osv","ecosystem":"Mageia:9","package":"perl-Net-OAuth","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.330.0-1.mga9"}]}],"bundled":4},{"source":"osv","ecosystem":"Ubuntu:16.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-2"]},{"source":"osv","ecosystem":"Ubuntu:18.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-2"]},{"source":"osv","ecosystem":"Ubuntu:20.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-3"]},{"source":"osv","ecosystem":"Ubuntu:22.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-3"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.28-4"]},{"source":"osv","ecosystem":"Ubuntu:26.10","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.31-1","0.33-1"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"libnet-oauth-perl","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["0.31-1"]},{"source":"osv","ecosystem":"openSUSE:Tumbleweed","package":"perl-Net-OAuth","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.330.0-1.1"}]}],"bundled":4}],"references":[{"url":"https://github.com/vurtdev/Net-OAuth/security/advisories/GHSA-jh72-4qq2-8j6g","tags":["vendor-advisory","advisory","report"]},{"url":"https://metacpan.org/release/RRWO/Net-OAuth-0.32/changes","tags":["release-notes","advisory"]},{"url":"https://github.com/vurtdev/Net-OAuth/commit/fd505dac1988723ed96721657663f2e4ac731644.patch","tags":["patch","fix"]},{"url":"https://datatracker.ietf.org/doc/html/rfc5849#section-2.1","tags":["technical-description","article"]},{"url":"https://datatracker.ietf.org/doc/html/rfc5849#section-2.3","tags":["technical-description","article"]},{"url":"http://www.openwall.com/lists/oss-security/2026/08/16/3","tags":["web"]},{"url":"https://cpan.org/modules","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/72xxx/CVE-2026-72887.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-72887","tags":["advisory"]},{"url":"https://github.com/vurtdev/Net-OAuth","tags":["package"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-72887","tags":["advisory"]},{"url":"https://advisories.mageia.org/MGASA-2026-0365.html","tags":["advisory"]},{"url":"https://bugs.mageia.org/show_bug.cgi?id=36145","tags":["report"]},{"url":"https://www.openwall.com/lists/oss-security/2026/08/16/3","tags":["web"]},{"url":"https://www.openwall.com/lists/oss-security/2026/08/16/4","tags":["web"]},{"url":"https://github.com/vurtdev/Net-OAuth/security/advisories/GHSA-m2cv-cq5x-47ph","tags":["advisory"]},{"url":"https://www.openwall.com/lists/oss-security/2026/08/19/2","tags":["web"]},{"url":"https://github.com/vurtdev/Net-OAuth/security/advisories/GHSA-c8rm-g5cm-4pf5","tags":["advisory"]},{"url":"https://www.openwall.com/lists/oss-security/2026/08/19/3","tags":["web"]},{"url":"https://github.com/vurtdev/Net-OAuth/security/advisories/GHSA-g8xr-69p3-gw56","tags":["advisory"]},{"url":"https://ubuntu.com/security/CVE-2026-72887","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-72887","tags":["report"]},{"url":"https://lists.security.metacpan.org/cve-announce/msg/42733454/","tags":["report"]},{"url":"","tags":["advisory"]},{"url":"https://www.suse.com/security/cve/CVE-2026-72887","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-72888","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-72889","tags":["web"]},{"url":"https://www.suse.com/security/cve/CVE-2026-75589","tags":["web"]}],"sources":{"cve":[{"id":"CVE-2026-72887","title":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.\n\nPassing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.\n\noauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T13:50:19.052Z","modified":"2026-08-17T16:29:31.019Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical","assessor":"adp"}],"cwes":["CWE-757"],"updated_at":"2026-11-02T14:19:52.016971Z"}],"euvd":[{"id":"EUVD-2026-59987","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.\n\nPassing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.\n\noauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T13:50:19Z","modified":"2026-08-17T16:29:31Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical"}],"updated_at":"2026-11-02T18:01:48.853514Z"}],"nvd":[{"id":"CVE-2026-72887","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.\n\nPassing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.\n\noauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T14:16:54.86Z","modified":"2026-08-26T16:51:19.49Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical","assessor":"secondary"}],"cwes":["CWE-757"],"updated_at":"2026-11-02T14:12:38.647684Z"}],"osv":[{"id":"CVE-2026-72887","title":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.\n\nPassing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.\n\noauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T13:50:19.052Z","modified":"2026-10-28T02:30:40.170439669Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical"}],"cwes":["CWE-757"],"updated_at":"2026-11-02T15:45:15.88521Z"},{"id":"DEBIAN-CVE-2026-72887","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token.  Passing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one.  oauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T14:16:54.86Z","modified":"2026-10-01T03:03:33.631579028Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical"}],"updated_at":"2026-11-02T15:46:02.499355Z"},{"id":"UBUNTU-CVE-2026-72887","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service provider to silently downgrade OAuth 1.0a to OAuth 1.0 in get_request_token. Passing a callback to the constructor selects OAuth 1.0a. get_request_token then revokes that choice when the request token response omits oauth_callback_confirmed, with no exception, no warning and no option to require 1.0a. The access token request is built from the OAuth 1.0 message class, which has no verifier parameter, so oauth_verifier is dropped from the request even when get_access_token was passed one. oauth_verifier is the binding that OAuth 1.0a added between the authorization step and the token exchange. An application that asked for 1.0a and gets 1.0 is open to OAuth 1.0 session fixation, where an attacker obtains a request token, has the victim authorize it, and then completes the exchange themselves, linking the victim's provider account to a session the attacker controls. No attacker action sets up the downgrade: a provider that does not confirm the callback is enough.","status":"published","published":"2026-08-16T14:16:00Z","modified":"2026-10-17T13:00:54.446189372Z","cvss":[{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical"}],"updated_at":"2026-11-02T16:57:08.628462Z"},{"id":"MGASA-2026-0365","title":"Updated perl-Net-OAuth packages fix security vulnerabilities","description":"Net::OAuth::Client versions before 0.32 for Perl allow the service\nprovider to silently downgrade OAuth 1.0a to OAuth 1.0 in\nget_request_token\nNet::OAuth versions before 0.32 for Perl allow memory exhaustion via\nunbounded caching of failed module loads in smart_require\nNet::OAuth versions before 0.33 for Perl allow the sender to choose the\nsignature algorithm in verify\nNet::OAuth versions before 0.33 for Perl check HMAC-SHA1, HMAC-SHA256\nand PLAINTEXT signatures with a non-constant-time comparison in verify\n","status":"published","published":"2026-09-02T16:59:28Z","modified":"2026-09-02T17:00:05.838567384Z","updated_at":"2026-11-02T15:49:43.795591Z"},{"id":"openSUSE-SU-2026:11551-1","title":"perl-Net-OAuth-0.330.0-1.1 on GA media","description":"These are all security issues fixed in the perl-Net-OAuth-0.330.0-1.1 package on the GA media of openSUSE Tumbleweed.","status":"published","published":"2026-08-19T00:00:00Z","modified":"2026-08-21T09:15:32.501431927Z","updated_at":"2026-11-02T16:58:39.516824Z"}]}}
