CVE-2026-114100
Coraza from 3.0.4 before 3.8.1 Request Body Inspection Bypass via Content-Type
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
Coraza from 3.0.4 before 3.8.1 Request Body Inspection Bypass via Content-Type
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
- Record
CVE-2026-114100- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N - Weakness
- CWE-20
- Updated
- 2026-11-02
EUVDEUVD-2026-106903
6.9
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
- Record
EUVD-2026-106903- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-5846-6v99-476c
6.9
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body...
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
- Record
GHSA-5846-6v99-476c- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N - Weakness
- CWE-20
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-w253-m66g-rx24
5.8
Coraza: URL-encoded form Content-Type parameters bypass Coraza body inspection
Summary
Coraza fails to inspect URL-encoded form bodies when their valid Content-Type contains a media-type parameter, for example:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
An unauthenticated attacker can use this header to hide the complete form body from custom Coraza rules that inspect ARGS_POST or REQUEST_BODY, while the bundled Go HTTP middleware forwards the body and the backend parses it normally.
This is a deterministic request-body inspection bypass. Suggested severity: Medium. Current OWASP CRS includes rule 901340, which forces fallback inspection and mitigates this path; this report does not claim a bypass of an unmodified current CRS ruleset
Details
The affected component is request-body processor selection in internal/corazawaf/transaction.go.
Transaction.AddRequestHeader compares the complete lowercased header value using exact equality:
case "content-type":
val := strings.ToLower(value)
if val == "application/x-www-form-urlencoded" {
tx.variables.reqbodyProcessor.Set("URLENCODED")
} else if strings.HasPrefix(val, "multipart/form-data") {
tx.variables.reqbodyProcessor.Set("MULTIPART")
}
Source: internal/corazawaf/transaction.go, lines 383-390.
The media type of application/x-www-form-urlencoded; charset=UTF-8 remains application/x-www-form-urlencoded; charset is a parameter. Because Coraza compares the entire header, the comparison fails and REQBODY_PROCESSOR remains empty.
ProcessRequestBody treats the empty processor as success:
rbp = strings.ToLower(rbp)
if rbp == "" {
tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
return tx.interruption, nil
}
Source: internal/corazawaf/transaction.go, lines 1115-1120.
Coraza therefore evaluates phase 2 without parsing the body and without setting REQBODY_ERROR. The URL-encoded processor that normally populates ARGS_POST, REQUEST_BODY, and REQUEST_BODY_LENGTH is never invoked.
The bundled middleware buffers and reconstructs the full request body before invoking the backend. The backend consequently receives data that was absent from Coraza's body variables.
The issue exists in the standard compiled implementation; no special build tag is required. Request-body access defaults to Off in an empty configuration, but Coraza's recommended configuration enables it with SecRequestBodyAccess On.
PoC
Save this self-contained test as parameterized_form_bypass_test.go in the Coraza repository root:
package coraza_test
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
coraza "github.com/corazawaf/coraza/v3"
corazahttp "github.com/corazawaf/coraza/v3/http"
)
func TestParameterizedFormInspectionBypass(t *testing.T) {
cfg := coraza.NewWAFConfig().WithDirectives(`
SecRuleEngine On
SecRequestBodyAccess On
SecRule ARGS_POST:cmd "@streq evil" "id:910001,phase:2,deny,status:403,t:none"
`)
waf, err := coraza.NewWAF(cfg)
if err != nil {
t.Fatal(err)
}
backendSaw := ""
handler := corazahttp.WrapHandler(waf, http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
t.Fatal(err)
}
backendSaw = r.PostForm.Get("cmd")
…
- Record
GHSA-w253-m66g-rx24- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N - Weakness
- CWE-20, CWE-436
- Updated
- 2026-11-02
NVD
6.9
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
- Record
CVE-2026-114100- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N - Weakness
- CWE-20
- Updated
- 2026-11-02
OSV
6.9
Coraza from 3.0.4 before 3.8.1 Request Body Inspection Bypass via Content-Type
Coraza from 3.0.4 before 3.8.1 contains a request body inspection bypass because request-body processor selection compares the entire Content-Type value exactly, so URL-encoded bodies whose Content-Type carries a media-type parameter are never parsed. Unauthenticated attackers can send application/x-www-form-urlencoded; charset=UTF-8 to keep ARGS_POST and REQUEST_BODY empty, evading body rules while the backend still processes the payload.
- Record
CVE-2026-114100- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N - Weakness
- CWE-20
- Updated
- 2026-11-02
OSVGHSA-w253-m66g-rx24
5.8
Coraza: URL-encoded form Content-Type parameters bypass Coraza body inspection
Summary
Coraza fails to inspect URL-encoded form bodies when their valid Content-Type contains a media-type parameter, for example:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
An unauthenticated attacker can use this header to hide the complete form body from custom Coraza rules that inspect ARGS_POST or REQUEST_BODY, while the bundled Go HTTP middleware forwards the body and the backend parses it normally.
This is a deterministic request-body inspection bypass. Suggested severity: Medium. Current OWASP CRS includes rule 901340, which forces fallback inspection and mitigates this path; this report does not claim a bypass of an unmodified current CRS ruleset
Details
The affected component is request-body processor selection in internal/corazawaf/transaction.go.
Transaction.AddRequestHeader compares the complete lowercased header value using exact equality:
case "content-type":
val := strings.ToLower(value)
if val == "application/x-www-form-urlencoded" {
tx.variables.reqbodyProcessor.Set("URLENCODED")
} else if strings.HasPrefix(val, "multipart/form-data") {
tx.variables.reqbodyProcessor.Set("MULTIPART")
}
Source: internal/corazawaf/transaction.go, lines 383-390.
The media type of application/x-www-form-urlencoded; charset=UTF-8 remains application/x-www-form-urlencoded; charset is a parameter. Because Coraza compares the entire header, the comparison fails and REQBODY_PROCESSOR remains empty.
ProcessRequestBody treats the empty processor as success:
rbp = strings.ToLower(rbp)
if rbp == "" {
tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
return tx.interruption, nil
}
Source: internal/corazawaf/transaction.go, lines 1115-1120.
Coraza therefore evaluates phase 2 without parsing the body and without setting REQBODY_ERROR. The URL-encoded processor that normally populates ARGS_POST, REQUEST_BODY, and REQUEST_BODY_LENGTH is never invoked.
The bundled middleware buffers and reconstructs the full request body before invoking the backend. The backend consequently receives data that was absent from Coraza's body variables.
The issue exists in the standard compiled implementation; no special build tag is required. Request-body access defaults to Off in an empty configuration, but Coraza's recommended configuration enables it with SecRequestBodyAccess On.
PoC
Save this self-contained test as parameterized_form_bypass_test.go in the Coraza repository root:
package coraza_test
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
coraza "github.com/corazawaf/coraza/v3"
corazahttp "github.com/corazawaf/coraza/v3/http"
)
func TestParameterizedFormInspectionBypass(t *testing.T) {
cfg := coraza.NewWAFConfig().WithDirectives(`
SecRuleEngine On
SecRequestBodyAccess On
SecRule ARGS_POST:cmd "@streq evil" "id:910001,phase:2,deny,status:403,t:none"
`)
waf, err := coraza.NewWAF(cfg)
if err != nil {
t.Fatal(err)
}
backendSaw := ""
handler := corazahttp.WrapHandler(waf, http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
t.Fatal(err)
}
backendSaw = r.PostForm.Get("cmd")
…
- Record
GHSA-w253-m66g-rx24- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:L/A:N - Weakness
- CWE-20, CWE-436
- Updated
- 2026-11-02
OSVGO-2026-6698 No score
Coraza: URL-encoded form Content-Type parameters bypass Coraza body inspection in github.com/corazawaf/coraza
Coraza: URL-encoded form Content-Type parameters bypass Coraza body inspection in github.com/corazawaf/coraza
- Record
GO-2026-6698- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/corazawaf/coraza/v3Go |
3.0.4 up to 3.8.1 | 3.8.1 |
github.com/corazawaf/corazaGo |
All versions | None known |
github.com/corazawaf/coraza/v2Go |
All versions | None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-114100 is a medium vulnerability (CVSS 6.9) in Corazawaf Coraza, published October 8, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.28%, the 20th percentile. Fixed in github.com/corazawaf/coraza/v3 3.8.1.
References
github.com/corazawaf/coraza/security/advisories/GHSA-w253-m66g-rx24
vulncheck.com/advisories/coraza-from-3.0.4-before-3.8.1-request-body-inspection-bypass-via-content-type
nvd.nist.gov/vuln/detail/CVE-2026-114100
github.com/advisories/GHSA-5846-6v99-476c
github.com/corazawaf/coraza/commit/3b6241ef895b089c66a59e51068a81cf40986e4d
github.com/corazawaf/coraza/commit/a55950ffa161f33a29e14f87d926d7df3b85cc74
Left out here: the rest of 2 source descriptions. The JSON record has them.