{"id":"CVE-2026-33173","summary":"Rails Active Storage has possible content type bypass via metadata in direct uploads","details":"Active Storage allows users to attach cloud and local files in Rails applications. Prior to versions 8.1.2.1, 8.0.4.1, and 7.2.3.1, `DirectUploadsController` accepts arbitrary metadata from the client and persists it on the blob. Because internal flags like `identified` and `analyzed` are stored in the same metadata hash, a direct-upload client can set these flags to skip MIME detection and analysis. This allows an attacker to upload arbitrary content while claiming a safe `content_type`, bypassing any validations that rely on Active Storage's automatic content type identification. Versions 8.1.2.1, 8.0.4.1, and 7.2.3.1 contain a patch.","aliases":["GHSA-qcfx-2mfw-w4cg"],"modified":"2026-04-10T05:42:38.774238Z","published":"2026-03-23T23:21:29.843Z","related":["CGA-jwmv-8x4w-7p4x"],"database_specific":{"cwe_ids":["CWE-925"],"osv_generated_from":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33173.json","cna_assigner":"GitHub_M"},"references":[{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33173.json"},{"type":"FIX","url":"https://github.com/rails/rails/commit/707c0f1f41f067fdf96d54e99d43b28dfaae7e53"},{"type":"FIX","url":"https://github.com/rails/rails/commit/8fcb934caadc79c8cc4ce53287046d0f67005b3e"},{"type":"FIX","url":"https://github.com/rails/rails/commit/d9502f5214e2198245a4c1defe9cd02a7c8057d0"},{"type":"WEB","url":"https://github.com/rails/rails/releases/tag/v7.2.3.1"},{"type":"WEB","url":"https://github.com/rails/rails/releases/tag/v8.0.4.1"},{"type":"WEB","url":"https://github.com/rails/rails/releases/tag/v8.1.2.1"},{"type":"ADVISORY","url":"https://github.com/rails/rails/security/advisories/GHSA-qcfx-2mfw-w4cg"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-33173"}],"affected":[{"ranges":[{"type":"GIT","repo":"https://github.com/rails/rails","events":[{"introduced":"80827ca7ff33ca3026f2c74fe8249ccc6f513318"},{"fixed":"1db4b89687cc18311fc3f92623136705df24e671"}],"database_specific":{"versions":[{"introduced":"8.1.0.beta1"},{"fixed":"8.1.2.1"}]}},{"type":"GIT","repo":"https://github.com/rails/rails","events":[{"introduced":"72bc36fb47aa3a9b10149ecefc1f344d7b028d79"},{"fixed":"a79efed95797b196575a98845dc989e3106a9acb"}],"database_specific":{"versions":[{"introduced":"8.0.0.beta1"},{"fixed":"8.0.4.1"}]}},{"type":"GIT","repo":"https://github.com/rails/rails","events":[{"introduced":"0"},{"fixed":"ba76fca032a66f3716ca8a661c9ddb006acaf885"}],"database_specific":{"versions":[{"introduced":"0"},{"fixed":"7.2.3.1"}]}}],"versions":["v0.10.0","v0.10.1","v0.11.0","v0.11.1","v0.12.0","v0.13.0","v0.13.1","v0.14.1","v0.14.3","v0.9.1","v0.9.2","v0.9.3","v0.9.4","v0.9.4.1","v0.9.5","v1.1.0","v1.1.0_RC1","v1.1.1","v2.0.0","v2.0.0_PR","v2.0.0_RC1","v2.0.0_RC2","v2.0.1","v3.0.0.beta.3","v3.0.0.beta3","v3.1.0.beta1","v3.1.0.rc1","v3.2.0.rc1","v4.0.0.beta1","v4.0.0.rc1","v4.2.0.beta1","v5.0.0.beta1","v5.0.0.beta2","v5.0.0.beta4","v5.1.0.beta1","v6.0.0.beta1","v6.0.0.beta2","v6.1.0.rc1","v7.0.0.alpha1","v7.0.0.alpha2","v7.1.0.beta1","v7.2.0.beta1","v7.2.0.beta2","v7.2.0.beta3","v7.2.0.rc1","v7.2.1","v7.2.2","v7.2.3","v8.0.0","v8.0.0.beta1","v8.0.0.rc1","v8.0.0.rc2","v8.0.1","v8.0.2","v8.0.3","v8.0.4","v8.1.0","v8.1.0.beta1","v8.1.0.rc1","v8.1.1","v8.1.2"],"database_specific":{"source":"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-33173.json"}}],"schema_version":"1.7.5","severity":[{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N"}]}