Skip to content
Heist/ feed
Back to feed
Low

Rack: Multipart Boundary Parsing Ambiguity allowing WAF Bypass

Type: advisorySources: OSV

Rack is a modular Ruby web server interface. Prior to versions 2.2.23, 3.1.21, and 3.2.6, Rack::Multipart::Parser extracts the boundary parameter from multipart/form-data using a greedy regular expression. When a Content-Type header contains multiple boundary parameters, Rack selects the last one rather than the first. In deployments where an upstream proxy, WAF, or intermediary interprets the first boundary parameter, this mismatch can allow an attacker to smuggle multipart content past upstream inspection and have Rack parse a different body structure than the intermediary validated. This issue has been patched in versions 2.2.23, 3.1.21, and 3.2.6.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-26961
Confirmed fixed CVEs
Not specified
Updated in this feed
4 Nov 2026, 03:05 UTC · Revision 1

Source evidence

Rack: Multipart Boundary Parsing Ambiguity allowing WAF Bypass

core-osv · Original source

Published 2 Apr 2026, 16:42 UTC

Rack is a modular Ruby web server interface. Prior to versions 2.2.23, 3.1.21, and 3.2.6, Rack::Multipart::Parser extracts the boundary parameter from multipart/form-data using a greedy regular expression. When a Content-Type header contains multiple boundary parameters, Rack selects the last one rather than the first. In deployments where an upstream proxy, WAF, or intermediary interprets the first boundary parameter, this mismatch can allow an attacker to smuggle multipart content past upstream inspection and have Rack parse a different body structure than the intermediary validated. This issue has been patched in versions 2.2.23, 3.1.21, and 3.2.6.

osv:CVE-2026-26961
Complete source record
{
  "id": "4fa85979f90250c8a118c674e64ea3ac3c36237f8b52690cc57b54a3cddc34aa",
  "url": "https://osv.dev/vulnerability/CVE-2026-26961",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "Rack: Multipart Boundary Parsing Ambiguity allowing WAF Bypass",
    "summary": "Rack is a modular Ruby web server interface. Prior to versions 2.2.23, 3.1.21, and 3.2.6, Rack::Multipart::Parser extracts the boundary parameter from multipart/form-data using a greedy regular expression. When a Content-Type header contains multiple boundary parameters, Rack selects the last one rather than the first. In deployments where an upstream proxy, WAF, or intermediary interprets the first boundary parameter, this mismatch can allow an attacker to smuggle multipart content past upstream inspection and have Rack parse a different body structure than the intermediary validated. This issue has been patched in versions 2.2.23, 3.1.21, and 3.2.6.",
    "evidence": "osv:CVE-2026-26961",
    "products": [],
    "severity": "low",
    "structured": {
      "id": "CVE-2026-26961",
      "aliases": [
        "CVE-2026-26961",
        "GHSA-vgpv-f759-9wx3"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/rack/rack",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "f2af0c8f869193fa7bb7d20b619b3003418e1055"
                },
                {
                  "introduced": "52901caf09ebcda879512a8605059963a49df55d"
                },
                {
                  "fixed": "ae8431120e66e92d1885ab8ec0a553d9cad5ec13"
                },
                {
                  "introduced": "b68251c03788ff39d4a4b25424df7360426e4afd"
                },
                {
                  "fixed": "e1f22fdbe99afd2126b6fbf05bb12399359574b7"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "cpe": "cpe:2.3:a:rack:rack:*:*:*:*:*:ruby:*:*",
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "2.2.23"
                      }
                    ],
                    "source": "CPE_RANGE"
                  },
                  {
                    "cpe": "cpe:2.3:a:rack:rack:*:*:*:*:*:ruby:*:*",
                    "range": [
                      {
                        "introduced": "3.0.0"
                      },
                      {
                        "fixed": "3.1.21"
                      }
                    ],
                    "source": "CPE_RANGE"
                  },
                  {
                    "cpe": "cpe:2.3:a:rack:rack:*:*:*:*:*:ruby:*:*",
                    "range": [
                      {
                        "introduced": "3.2.0"
                      },
                      {
                        "fixed": "3.2.6"
                      }
                    ],
                    "source": "CPE_RANGE"
                  }
                ]
              }
            }
          ],
          "versions": [
            "v3.2.5",
            "v3.1.20",
            "v2.2.22",
            "v3.1.19",
            "v3.2.4",
            "v2.2.21",
            "v3.2.3",
            "v3.1.18",
            "v2.2.20",
            "v2.2.19",
            "v3.1.17",
            "v3.2.2",
            "v3.2.1",
            "v2.2.18",
            "v2.2.17",
            "v3.2.0",
            "v3.1.16",
            "v2.2.16",
            "v3.1.15",
            "v2.2.15",
            "v2.2.14",
            "v3.1.14",
            "v3.1.13",
            "v2.2.13",
            "v3.1.12",
            "v3.1.11",
            "v2.2.12",
            "v3.1.10",
            "v2.2.11",
            "v2.2.10",
            "v3.1.9",
            "v3.1.8",
            "v3.1.7",
            "v2.2.9",
            "v3.1.6",
            "v3.1.5",
            "v3.1.4",
            "v3.1.3",
            "v3.1.2",
            "v3.1.0",
            "v2.2.8",
            "v2.2.7",
            "v2.2.6.2",
            "v2.2.6.1",
            "v2.2.6",
            "v2.2.5",
            "2.2.4",
            "3.0.0",
            "2.2.3",
            "v2.2.2",
            "v2.2.1",
            "2.2.0",
            "2.1.0",
            "2.0.1",
            "2.0.0",
            "2.0.0.rc1",
            "2.0.0.alpha",
            "1.6.0.beta",
            "1.5.1",
            "1.5.0",
            "1.4.1",
            "1.4.0",
            "1.3.0",
            "1.3.0.beta2",
            "1.3.0.beta",
            "1.0",
            "0.3",
            "0.2",
            "0.1"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-26961.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:33.033247875Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/26xxx/CVE-2026-26961.json",
        "https://github.com/rack/rack/security/advisories/GHSA-vgpv-f759-9wx3",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-26961"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-436"
        ],
        "cna_assigner": "GitHub_M",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/26xxx/CVE-2026-26961.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-26961",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 499867,
  "published_at": "2026-04-02T16:42:16.766+00:00"
}