{"id":"CVE-2026-41255","aliases":["EUVD-2026-30117","GHSA-mcvf-jxcw-vj73","PYSEC-2026-2418"],"status":"published","title":"CKAN: CSRF exemption primed by anonymous requests","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. Prior to 2.10.10 and 2.11.5, Access to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. The marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. This API was never intended for request level changes, it is primarily a decorator for static configuration. An unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi). This vulnerability is fixed in 2.10.10 and 2.11.5.","severity":{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-09","score":0.00124,"percentile":0.02146,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-352"],"published":"2026-04-29T20:36:07Z","modified":"2026-10-28T02:30:39Z","fixes":[{"ecosystem":"PyPI","package":"ckan","fixed_in":["2.10.10","2.11.5"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"ckan","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.10.0"},{"fixed":"2.10.10"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"ckan","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.11.0"},{"last_affected":"2.11.4"},{"fixed":"2.11.5"}]}]},{"source":"osv","ecosystem":"PyPI","package":"ckan","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.10.0"},{"fixed":"2.10.10"}]}],"versions":["2.10.0","2.10.1","2.10.3","2.10.4","2.10.5","2.10.6","2.10.7","2.10.8","2.10.9"]},{"source":"osv","ecosystem":"PyPI","package":"ckan","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.11.0"},{"fixed":"2.11.5"}]}],"versions":["2.11.0","2.11.1","2.11.2","2.11.3","2.11.4"]},{"source":"osv","ecosystem":"PyPI","package":"ckan","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.10.0"},{"fixed":"2.10.10"},{"introduced":"2.11.0"},{"fixed":"2.11.5"}]}],"versions":["2.10.0","2.10.1","2.10.3","2.10.4","2.10.5","2.10.6","2.10.7","2.10.8","2.10.9","2.11.0","2.11.1","2.11.2","2.11.3","2.11.4"]}],"products":[{"vendor":"ckan","product":"ckan"},{"vendor":"okfn","product":"ckan"}],"references":[{"url":"https://github.com/ckan/ckan/security/advisories/GHSA-mcvf-jxcw-vj73","tags":["x_refsource_CONFIRM","exploit","Vendor Advisory","advisory","web"]},{"url":"https://github.com/Shirshaw64p/security-advisories/tree/main/CVE-2026-41255","tags":["x_refsource_MISC","Vendor Advisory","advisory","web"]},{"url":"https://docs.ckan.org/en/2.10/changelog.html#v-2-10-10-2026-04-29","tags":["web"]},{"url":"https://docs.ckan.org/en/2.11/changelog.html#v-2-11-5-2026-04-29","tags":["web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-41255","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-mcvf-jxcw-vj73","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/41xxx/CVE-2026-41255.json","tags":["advisory"]},{"url":"https://github.com/ckan/ckan","tags":["package"]},{"url":"https://pypi.org/project/ckan","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-41255","title":"CKAN: CSRF exemption primed by anonymous requests","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. Prior to 2.10.10 and 2.11.5, Access to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. The marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. This API was never intended for request level changes, it is primarily a decorator for static configuration. An unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi). This vulnerability is fixed in 2.10.10 and 2.11.5.","status":"published","published":"2026-05-13T18:57:41.256Z","modified":"2026-05-14T12:44:14.133Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T13:41:08.498858Z"}],"euvd":[{"id":"EUVD-2026-30117","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. Prior to 2.10.10 and 2.11.5, Access to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. The marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. This API was never intended for request level changes, it is primarily a decorator for static configuration. An unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi). This vulnerability is fixed in 2.10.10 and 2.11.5.","status":"published","published":"2026-05-13T18:57:41Z","modified":"2026-05-14T12:44:14Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T19:04:31.58892Z"}],"ghsa":[{"id":"GHSA-mcvf-jxcw-vj73","title":"CKAN has CSRF exemption primed by anonymous requests","description":"Views can be marked as exempt from CSRF protection \n\nAccess to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. \n\nThe marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. Thsi API was never intended for request level changes, it is primarily a decorator for static configuration. \n\nAn unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi).\n\nThis could be leveraged with XSS to perform actions using other user's credentials.\n\n### References\n\n* [Vulnerability report](https://github.com/Shirshaw64p/security-advisories/tree/main/CVE-2026-41255) by @Shirshaw64p (original reporter)","status":"published","published":"2026-04-29T20:36:07Z","modified":"2026-05-14T20:39:45Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T14:40:09.033429Z"}],"nvd":[{"id":"CVE-2026-41255","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. Prior to 2.10.10 and 2.11.5, Access to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. The marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. This API was never intended for request level changes, it is primarily a decorator for static configuration. An unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi). This vulnerability is fixed in 2.10.10 and 2.11.5.","status":"published","published":"2026-05-13T19:17:22.127Z","modified":"2026-06-17T10:46:23.607Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T14:12:19.020465Z"}],"osv":[{"id":"CVE-2026-41255","title":"CKAN: CSRF exemption primed by anonymous requests","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. Prior to 2.10.10 and 2.11.5, Access to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. The marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. This API was never intended for request level changes, it is primarily a decorator for static configuration. An unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi). This vulnerability is fixed in 2.10.10 and 2.11.5.","status":"published","published":"2026-05-13T18:57:41.256Z","modified":"2026-10-28T02:30:39.82896721Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T15:45:03.764807Z"},{"id":"GHSA-mcvf-jxcw-vj73","title":"CKAN has CSRF exemption primed by anonymous requests","description":"Views can be marked as exempt from CSRF protection \n\nAccess to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. \n\nThe marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. Thsi API was never intended for request level changes, it is primarily a decorator for static configuration. \n\nAn unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi).\n\nThis could be leveraged with XSS to perform actions using other user's credentials.\n\n### References\n\n* [Vulnerability report](https://github.com/Shirshaw64p/security-advisories/tree/main/CVE-2026-41255) by @Shirshaw64p (original reporter)","status":"published","published":"2026-04-29T20:36:07Z","modified":"2026-07-13T16:43:10.423197768Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T15:46:51.811331Z"},{"id":"PYSEC-2026-2418","title":"CKAN has CSRF exemption primed by anonymous requests","description":"Views can be marked as exempt from CSRF protection \n\nAccess to the views via tokens or unauthenticated requests marked the endpoint as not requiring CSRF protection. \n\nThe marking was a member variable in flask-wtf.csrf.CSRFProtect(), which was stored as a module level variable in the flask_app middleware. Thsi API was never intended for request level changes, it is primarily a decorator for static configuration. \n\nAn unauthenticated request could hit a protected endpoint, exempting it from CSRF protection for the life of the particular server process. (e.g. one worker of uwsgi).\n\nThis could be leveraged with XSS to perform actions using other user's credentials.\n\n### References\n\n* [Vulnerability report](https://github.com/Shirshaw64p/security-advisories/tree/main/CVE-2026-41255) by @Shirshaw64p (original reporter)","status":"published","published":"2026-07-13T15:02:55.031854Z","modified":"2026-07-13T16:31:42.479091391Z","cvss":[{"version":"3.1","score":6.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T15:52:55.961245Z"}]}}
