{"id":"CVE-2020-7965","aliases":["EUVD-2020-0240","GHSA-fjq3-5pxw-4wj4","PYSEC-2020-156"],"status":"published","title":"Cross-Site Request Forgery in Webargs","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","severity":{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","level":"high","assessor":"primary","from":"nvd"},"epss":{"day":"2026-11-10","score":0.00606,"percentile":0.4935,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-352"],"published":"2020-01-29T14:33:16Z","modified":"2026-10-24T10:30:44Z","fixes":[{"ecosystem":"PyPI","package":"webargs","fixed_in":["5.5.3","6.0.0b4"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"webargs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"5.0.0"},{"fixed":"5.5.3"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"webargs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.0.0b1"},{"fixed":"6.0.0b4"}]}]},{"source":"osv","ecosystem":"PyPI","package":"webargs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"5.0.0"},{"fixed":"5.5.3"}]}],"versions":["5.0.0","5.1.0","5.1.1","5.1.1.post0","5.1.2","5.1.3","5.2.0","5.3.0","5.3.1","5.3.2","5.4.0","5.5.0","5.5.1","5.5.2"]},{"source":"osv","ecosystem":"PyPI","package":"webargs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"6.0.0b1"},{"fixed":"6.0.0b4"}]}],"versions":["6.0.0b1","6.0.0b2","6.0.0b3"]},{"source":"osv","ecosystem":"PyPI","package":"webargs","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"5.0.0"},{"fixed":"5.5.3"}]}],"versions":["5.0.0","5.1.0","5.1.1","5.1.1.post0","5.1.2","5.1.3","5.2.0","5.3.0","5.3.1","5.3.2","5.4.0","5.5.0","5.5.1","5.5.2"]}],"products":[{"vendor":"webargs_project","product":"webargs"}],"references":[{"url":"https://webargs.readthedocs.io/en/latest/changelog.html","tags":["x_refsource_CONFIRM","x_transferred","Release Notes","Vendor Advisory","advisory","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2020-7965","tags":["advisory"]},{"url":"https://github.com/marshmallow-code/webargs/commit/b9ee8b0aa668207a363d9fd21d967eeadb975c3e","tags":["web"]},{"url":"https://webargs.readthedocs.io/en/latest/changelog.html#b4-2020-01-28","tags":["web"]},{"url":"https://webargs.readthedocs.io/en/latest/changelog.html#id11","tags":["web"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/webargs/PYSEC-2020-156.yaml","tags":["web"]},{"url":"https://github.com/advisories/GHSA-fjq3-5pxw-4wj4","tags":["advisory"]},{"url":"https://github.com/marshmallow-code/webargs","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2020-7965","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2020-01-29T14:33:16Z","modified":"2024-08-04T09:48:25.379Z","updated_at":"2026-11-02T14:35:58.331892Z"}],"euvd":[{"id":"EUVD-2020-0240","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2020-01-29T14:33:16Z","modified":"2024-08-04T09:48:25Z","updated_at":"2026-11-03T03:07:58.506831Z"}],"ghsa":[{"id":"GHSA-fjq3-5pxw-4wj4","title":"Cross-Site Request Forgery in Webargs","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2021-04-07T21:06:30Z","modified":"2024-11-19T15:34:05Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","level":"high"},{"version":"4.0","score":8.7,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T14:38:20.833758Z"}],"nvd":[{"id":"CVE-2020-7965","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2020-01-29T15:15:11.07Z","modified":"2026-06-17T03:25:42.583Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"},{"version":"2.0","score":6.8,"vector":"AV:N/AC:M/Au:N/C:P/I:P/A:P","level":"medium","assessor":"primary"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T14:05:53.837808Z"}],"osv":[{"id":"CVE-2020-7965","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2020-01-29T15:15:11.07Z","modified":"2026-10-24T10:30:44.838296274Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","level":"high"}],"updated_at":"2026-11-02T15:44:17.34531Z"},{"id":"GHSA-fjq3-5pxw-4wj4","title":"Cross-Site Request Forgery in Webargs","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2021-04-07T21:06:30Z","modified":"2024-11-19T15:50:22.620318Z","cvss":[{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H","level":"high"},{"version":"4.0","score":8.7,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"high"}],"cwes":["CWE-352"],"updated_at":"2026-11-02T15:46:46.760785Z"},{"id":"PYSEC-2020-156","description":"flaskparser.py in Webargs 5.x through 5.5.2 doesn't check that the Content-Type header is application/json when receiving JSON input. If the request body is valid JSON, it will accept it even if the content type is application/x-www-form-urlencoded. This allows for JSON POST requests to be made across domains, leading to CSRF.","status":"published","published":"2020-01-29T15:15:00Z","modified":"2023-11-08T04:04:12.236992Z","updated_at":"2026-11-02T15:52:52.192131Z"}]}}
