{"id":"CVE-2026-42999","aliases":["DEBIAN-CVE-2026-42999","EUVD-2026-33241","GHSA-2r23-2g6v-2m5f","PYSEC-2026-600","UBUNTU-CVE-2026-42999"],"status":"published","title":"OpenStack Keystone has an Authorization Bypass","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","severity":{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00329,"percentile":0.26271,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-639","CWE-863"],"published":"2026-05-28T00:00:00Z","modified":"2026-10-28T02:31:14Z","fixes":[{"ecosystem":"PyPI","package":"keystone","fixed_in":["27.0.2","28.0.2","29.0.2"],"sources":["ghsa","osv"]},{"ecosystem":"Debian:12","package":"keystone","fixed_in":["2:22.0.2-0+deb12u3"],"sources":["osv"]},{"ecosystem":"Debian:13","package":"keystone","fixed_in":["2:27.0.0-3+deb13u4"],"sources":["osv"]},{"ecosystem":"Debian:14","package":"keystone","fixed_in":["2:29.0.1-2"],"sources":["osv"]},{"ecosystem":"Ubuntu:22.04:LTS","package":"keystone","fixed_in":["2:21.0.1-0ubuntu2.4"],"sources":["osv"]},{"ecosystem":"Ubuntu:24.04:LTS","package":"keystone","fixed_in":["2:25.0.0-0ubuntu1.4"],"sources":["osv"]},{"ecosystem":"Ubuntu:25.10","package":"keystone","fixed_in":["2:28.0.0-0ubuntu1.3"],"sources":["osv"]},{"ecosystem":"Ubuntu:26.04:LTS","package":"keystone","fixed_in":["2:29.0.0-0ubuntu1.2"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"14.0.0"},{"fixed":"27.0.2"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"28.0.0"},{"fixed":"28.0.2"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"29.0.0"},{"fixed":"29.0.2"}]}]},{"source":"osv","ecosystem":"Debian:12","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:22.0.2-0+deb12u3"}]}],"versions":["2:22.0.0-2","2:22.0.2-0+deb12u1","2:22.0.2-0+deb12u2"]},{"source":"osv","ecosystem":"Debian:13","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:27.0.0-3+deb13u4"}]}],"versions":["2:27.0.0-3","2:27.0.0-3+deb13u1","2:27.0.0-3+deb13u3"]},{"source":"osv","ecosystem":"Debian:14","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:29.0.1-2"}]}],"versions":["2:27.0.0-3","2:28.0.0-1","2:28.0.0-2","2:28.0.0-3","2:28.0.0-4","2:28.0.0-5","2:28.0.0-6","2:28.0.0~rc1-1","2:28.0.0~rc1-2","2:28.0.0~rc1-4","2:29.0.0-1","2:29.0.0-2","2:29.0.0-3","2:29.0.0~rc1-1","2:29.0.0~rc1-2","2:29.0.1-1"]},{"source":"osv","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"14.0.0"},{"fixed":"27.0.2"}]}],"versions":["14.0.0","14.0.1","14.1.0","14.2.0","15.0.0","15.0.0.0rc1","15.0.0.0rc2","15.0.1","16.0.0","16.0.0.0rc1","16.0.0.0rc2","16.0.1","16.0.2","17.0.0","17.0.0.0rc1","17.0.0.0rc2","17.0.1","18.0.0","18.0.0.0rc1","18.1.0","19.0.0","19.0.0.0rc1","19.0.0.0rc2","19.0.1","20.0.0","20.0.0.0rc1","20.0.1","21.0.0","21.0.0.0rc1","21.0.1","22.0.0","22.0.0.0rc1","22.0.1","22.0.2","23.0.0","23.0.0.0rc1","23.0.1","23.0.2","24.0.0","24.0.0.0rc1","24.1.0","25.0.0","25.0.0.0rc1","26.0.0","26.0.0.0rc1","26.1.0","26.1.1","27.0.0","27.0.0.0rc1","27.0.1"]},{"source":"osv","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"28.0.0"},{"fixed":"28.0.2"}]}],"versions":["28.0.0","28.0.1"]},{"source":"osv","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"29.0.0"},{"fixed":"29.0.2"}]}],"versions":["29.0.0","29.0.1"]},{"source":"osv","ecosystem":"PyPI","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"14.0.0"},{"fixed":"27.0.2"},{"introduced":"28.0.0"},{"fixed":"28.0.2"},{"introduced":"29.0.0"},{"fixed":"29.0.2"}]}],"versions":["14.0.0","14.0.1","14.1.0","14.2.0","15.0.0","15.0.0.0rc1","15.0.0.0rc2","15.0.1","16.0.0","16.0.0.0rc1","16.0.0.0rc2","16.0.1","16.0.2","17.0.0","17.0.0.0rc1","17.0.0.0rc2","17.0.1","18.0.0","18.0.0.0rc1","18.1.0","19.0.0","19.0.0.0rc1","19.0.0.0rc2","19.0.1","20.0.0","20.0.0.0rc1","20.0.1","21.0.0","21.0.0.0rc1","21.0.1","22.0.0","22.0.0.0rc1","22.0.1","22.0.2","23.0.0","23.0.0.0rc1","23.0.1","23.0.2","24.0.0","24.0.0.0rc1","24.1.0","25.0.0","25.0.0.0rc1","26.0.0","26.0.0.0rc1","26.1.0","26.1.1","27.0.0","27.0.0.0rc1","27.0.1","28.0.0","28.0.1","29.0.0","29.0.1"]},{"source":"osv","ecosystem":"Ubuntu:Pro:16.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2:8.0.0-0ubuntu1","2:9.0.0~b1-0ubuntu1","2:9.0.0~b2-0ubuntu1","2:9.0.0~b3-0ubuntu1","2:9.0.0~rc1-0ubuntu1","2:9.0.0-0ubuntu1","2:9.0.2-0ubuntu1","2:9.0.2-0ubuntu2","2:9.1.0-0ubuntu1","2:9.2.0-0ubuntu1","2:9.3.0-0ubuntu1","2:9.3.0-0ubuntu2","2:9.3.0-0ubuntu3","2:9.3.0-0ubuntu3.1","2:9.3.0-0ubuntu3.2","2:9.3.0-0ubuntu3.2+esm2"]},{"source":"osv","ecosystem":"Ubuntu:Pro:18.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2:12.0.0-0ubuntu1","2:13.0.0~b1-0ubuntu1","2:13.0.0~b2-0ubuntu1","2:13.0.0~b3-0ubuntu1","2:13.0.0~rc1-0ubuntu1","2:13.0.0~rc2-0ubuntu1","2:13.0.0-0ubuntu1","2:13.0.1-0ubuntu1","2:13.0.2-0ubuntu1","2:13.0.2-0ubuntu3","2:13.0.4-0ubuntu1","2:13.0.4-0ubuntu1+esm1"]},{"source":"osv","ecosystem":"Ubuntu:Pro:20.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2:16.0.0-0ubuntu1","2:17.0.0~b1~git2019121613.db81fee63-0ubuntu1","2:17.0.0~b2~git2020020513.99733f172-0ubuntu1","2:17.0.0~b3~git2020032415.9f9040257-0ubuntu1","2:17.0.0~b3~git2020032415.9f9040257-0ubuntu2","2:17.0.0~b3~git2020041013.7bb6314e4-0ubuntu1","2:17.0.0-0ubuntu0.20.04.1","2:17.0.1-0ubuntu1","2:17.0.1-0ubuntu2","2:17.0.1-0ubuntu2+esm1","2:17.0.1-0ubuntu2+esm2"]},{"source":"osv","ecosystem":"Ubuntu:22.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:21.0.1-0ubuntu2.4"}]}],"versions":["2:20.0.0-0ubuntu1","2:20.0.0+git2021120815.2ddf8f321-0ubuntu1","2:20.0.0+git2022011217.771c943ad-0ubuntu1","2:20.0.0+git2022030313.a3fc9e7c3-0ubuntu1","2:21.0.0-0ubuntu1","2:21.0.1-0ubuntu1","2:21.0.1-0ubuntu2","2:21.0.1-0ubuntu2.1","2:21.0.1-0ubuntu2.2"]},{"source":"osv","ecosystem":"Ubuntu:24.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:25.0.0-0ubuntu1.4"}]}],"versions":["2:24.0.0-0ubuntu1","2:24.0.0+git2024011916.adfa92b4-0ubuntu1","2:25.0.0~rc1-0ubuntu1","2:25.0.0-0ubuntu1","2:25.0.0-0ubuntu1.1","2:25.0.0-0ubuntu1.2"]},{"source":"osv","ecosystem":"Ubuntu:25.10","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:28.0.0-0ubuntu1.3"}]}],"versions":["2:27.0.0-0ubuntu1","2:27.0.0+git2025080113.e066e18ab-0ubuntu1","2:28.0.0~rc1-0ubuntu1","2:28.0.0-0ubuntu1","2:28.0.0-0ubuntu1.1"]},{"source":"osv","ecosystem":"Ubuntu:26.04:LTS","package":"keystone","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2:29.0.0-0ubuntu1.2"}]}],"versions":["2:28.0.0-0ubuntu1","2:28.0.0-0ubuntu2","2:28.0.0+git20260119.61.8a42793e7-0ubuntu1","2:29.0.0~rc1-0ubuntu1","2:29.0.0-0ubuntu1"]}],"products":[{"vendor":"openstack","product":"keystone"},{"vendor":"red hat","product":"red hat openstack platform 13 (queens)"},{"vendor":"red hat","product":"red hat openstack platform 16.2"},{"vendor":"red hat","product":"red hat openstack platform 17.1"},{"vendor":"red hat","product":"red hat openstack platform 18.0"}],"references":[{"url":"https://bugs.launchpad.net/keystone/+bug/2148398","tags":["Exploit","Issue Tracking","Patch","Third Party Advisory","web","fix","report"]},{"url":"https://security.openstack.org/ossa/OSSA-2026-015.html","tags":["Patch","Vendor Advisory","web","fix","report"]},{"url":"https://access.redhat.com/security/cve/CVE-2026-42999","tags":["vdb-entry","x_refsource_REDHAT","advisory","web"]},{"url":"https://bugzilla.redhat.com/show_bug.cgi?id=2482840","tags":["issue-tracking","x_refsource_REDHAT","report","web"]},{"url":"https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-42999.json","tags":["x_sadp-csaf-vex","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-42999","tags":["advisory"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/keystone/PYSEC-2026-600.yaml","tags":["web"]},{"url":"https://github.com/advisories/GHSA-2r23-2g6v-2m5f","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/42xxx/CVE-2026-42999.json","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-42999","tags":["advisory"]},{"url":"https://github.com/openstack/keystone","tags":["package"]},{"url":"https://ubuntu.com/security/CVE-2026-42999","tags":["report"]},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-42999","tags":["report"]},{"url":"https://ubuntu.com/security/notices/USN-8433-1","tags":["advisory"]}],"sources":{"cve":[{"id":"CVE-2026-42999","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T00:00:00Z","modified":"2026-07-24T12:05:37.538Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium","assessor":"cna"},{"version":"3.1","score":8.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L","level":"high","assessor":"adp"}],"cwes":["CWE-863","CWE-639"],"updated_at":"2026-11-02T13:40:23.731501Z"}],"euvd":[{"id":"EUVD-2026-33241","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T00:00:00Z","modified":"2026-07-24T12:05:37Z","cvss":[{"version":"3.1","score":8.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L","level":"high"}],"updated_at":"2026-11-02T18:19:41.195396Z"}],"ghsa":[{"id":"GHSA-2r23-2g6v-2m5f","title":"OpenStack Keystone has an Authorization Bypass","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T21:32:02Z","modified":"2026-07-02T17:44:06Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-639","CWE-863"],"updated_at":"2026-11-02T14:40:37.437888Z"}],"nvd":[{"id":"CVE-2026-42999","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T19:16:37.63Z","modified":"2026-10-26T13:10:00.14Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium","assessor":"secondary"},{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"},{"version":"3.1","score":8.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L","level":"high","assessor":"secondary"}],"cwes":["CWE-863","CWE-639"],"updated_at":"2026-11-02T14:12:21.244426Z"}],"osv":[{"id":"CVE-2026-42999","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T00:00:00Z","modified":"2026-10-28T02:31:14.843758278Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-863"],"updated_at":"2026-11-02T15:45:04.117819Z"},{"id":"DEBIAN-CVE-2026-42999","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T19:16:37.63Z","modified":"2026-10-27T09:47:32.998076022Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:45:55.251751Z"},{"id":"GHSA-2r23-2g6v-2m5f","title":"OpenStack Keystone has an Authorization Bypass","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T21:32:02Z","modified":"2026-09-10T03:51:04.100486004Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-639","CWE-863"],"updated_at":"2026-11-02T15:46:34.700741Z"},{"id":"PYSEC-2026-600","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T19:16:37.63Z","modified":"2026-07-13T16:45:04.870559314Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:52:57.671918Z"},{"id":"UBUNTU-CVE-2026-42999","description":"An issue was discovered in OpenStack Keystone before 29.0.2. The Keystone RBAC policy enforcer in enforce_call unconditionally merges the raw JSON request body into the policy enforcement dictionary via policy_dict.update(json_input.copy()), overwriting trusted target data that was previously set from database lookups. Because flask.request.get_json is called with force=True, this works regardless of Content-Type or HTTP method. Any authenticated user can inject arbitrary policy target attributes (e.g., user_id, project_id) into the request body to bypass RBAC checks and perform unauthorized operations on resources belonging to other users or projects. This was introduced in commit 5ea59f52 (Rocky/14.0.0).","status":"published","published":"2026-05-28T19:16:00Z","modified":"2026-09-30T18:23:46.977865484Z","cvss":[{"version":"3.1","score":6,"vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:L/A:L","level":"medium"},{"version":"3.1","score":8.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L","level":"high"},{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T16:56:18.393417Z"}]}}
