CVE-2026-100350
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
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
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.3
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
- Record
CVE-2026-100350- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770, CWE-1050
- Updated
- 2026-11-02
EUVDEUVD-2026-102158
5.3
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
- Record
EUVD-2026-102158- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-h4r5-mxv5-8mjc
5.3
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression
Summary
openapi3filter decodes deepObject-style query parameters by looping over every key in the request's query string. Inside that loop it recompiles a loop-invariant regular expression on every iteration. The pattern depends only on the spec-defined parameter name, not on the loop variable, so it is compiled N times for N query keys instead of once. Because the number of query keys is attacker-controlled and unbounded, a single request with many junk query keys forces a proportional number of regexp.MustCompile calls, consuming CPU. A handful of concurrent requests can saturate all cores — an uncontrolled-resource-consumption denial of service.
This is not ReDoS: the pattern is fixed (^<param>\[) and matches in linear time. The cost is the repeated compilation of an invariant regexp, once per attacker-supplied query key.
Details
In openapi3filter/req_resp_decoder.go, the deepObject branch of urlValuesDecoder.DecodeObject builds a per-parameter property map by iterating over all query keys:
case "deepObject":
propsFn = func(params url.Values) (map[string]string, error) {
props := make(map[string]string)
for key, values := range params { // req_resp_decoder.go:689
if !regexp.MustCompile(fmt.Sprintf(`^%s\[`, regexp.QuoteMeta(param))).MatchString(key) { // :690
continue
}
matches := deepObjectBracketRE.FindAllStringSubmatch(key, -1)
...
}
...
}
The regexp built at req_resp_decoder.go:690 depends only on param — the parameter name defined in the OpenAPI spec — which is constant for the whole loop. Yet regexp.MustCompile(...) is invoked inside the for key, values := range params loop at req_resp_decoder.go:689, so it is recompiled once for every key present in the query string.
Contrast this with the already-hoisted, package-level regexp used two lines below:
var deepObjectBracketRE = regexp.MustCompile(`\[(.*?)\]`) // req_resp_decoder.go:41
deepObjectBracketRE is compiled exactly once at package init and reused. The per-parameter pattern at :690 should be compiled the same way (once, outside the loop), but instead is rebuilt on every iteration.
regexp.MustCompile costs on the order of a few microseconds per call. The number of iterations equals the number of query keys N, which the client fully controls (a ~1 MB URL holds roughly 100k keys). For each deepObject parameter M defined on the matched route, the request performs N × M compilations. The work is CPU-bound, happens during request validation before any handler logic, and scales linearly with request size, so an attacker converts cheap request bytes into expensive server CPU.
Affected code path: ValidateRequest → ValidateParameter → decodeStyledParameter → urlValuesDecoder.DecodeObject (the deepObject case). Any operation with at least one in: query, style: deepObject parameter is exploitable.
PoC
The following self-contained test (package openapi3filter_test) defines a spec with a single deepObject query parameter, then validates two requests that differ only in the number of junk query keys. Decoding time grows with the key count even though none of the junk keys are part of the parameter.
Save as openapi3filter/advisory_poc_test.go:
package openapi3filter_test
import (
"context"
"fmt"
"net/http"
"strings"
"testing"
"time"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/getkin/kin-openapi/routers/gorillamux"
)
const specDeepObjectParam = `
openapi: 3.0.0
info: {title: PoC, version: 1.0.0}
paths:
/f:
get:
parameters:
- name: filter
in: query
style: deepObject
explode: true
schema: {type: object, properties: {a: {type: string}}}
responses:
'200':…
- Record
GHSA-h4r5-mxv5-8mjc- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770, CWE-1050
- Updated
- 2026-11-02
NVD
5.3
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
- Record
CVE-2026-100350- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770, CWE-1050
- Updated
- 2026-11-02
OSV
5.3
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
- Record
CVE-2026-100350- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-1050, CWE-400, CWE-770
- Updated
- 2026-11-06
OSVGHSA-h4r5-mxv5-8mjc
5.3
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression
Summary
openapi3filter decodes deepObject-style query parameters by looping over every key in the request's query string. Inside that loop it recompiles a loop-invariant regular expression on every iteration. The pattern depends only on the spec-defined parameter name, not on the loop variable, so it is compiled N times for N query keys instead of once. Because the number of query keys is attacker-controlled and unbounded, a single request with many junk query keys forces a proportional number of regexp.MustCompile calls, consuming CPU. A handful of concurrent requests can saturate all cores — an uncontrolled-resource-consumption denial of service.
This is not ReDoS: the pattern is fixed (^<param>\[) and matches in linear time. The cost is the repeated compilation of an invariant regexp, once per attacker-supplied query key.
Details
In openapi3filter/req_resp_decoder.go, the deepObject branch of urlValuesDecoder.DecodeObject builds a per-parameter property map by iterating over all query keys:
case "deepObject":
propsFn = func(params url.Values) (map[string]string, error) {
props := make(map[string]string)
for key, values := range params { // req_resp_decoder.go:689
if !regexp.MustCompile(fmt.Sprintf(`^%s\[`, regexp.QuoteMeta(param))).MatchString(key) { // :690
continue
}
matches := deepObjectBracketRE.FindAllStringSubmatch(key, -1)
...
}
...
}
The regexp built at req_resp_decoder.go:690 depends only on param — the parameter name defined in the OpenAPI spec — which is constant for the whole loop. Yet regexp.MustCompile(...) is invoked inside the for key, values := range params loop at req_resp_decoder.go:689, so it is recompiled once for every key present in the query string.
Contrast this with the already-hoisted, package-level regexp used two lines below:
var deepObjectBracketRE = regexp.MustCompile(`\[(.*?)\]`) // req_resp_decoder.go:41
deepObjectBracketRE is compiled exactly once at package init and reused. The per-parameter pattern at :690 should be compiled the same way (once, outside the loop), but instead is rebuilt on every iteration.
regexp.MustCompile costs on the order of a few microseconds per call. The number of iterations equals the number of query keys N, which the client fully controls (a ~1 MB URL holds roughly 100k keys). For each deepObject parameter M defined on the matched route, the request performs N × M compilations. The work is CPU-bound, happens during request validation before any handler logic, and scales linearly with request size, so an attacker converts cheap request bytes into expensive server CPU.
Affected code path: ValidateRequest → ValidateParameter → decodeStyledParameter → urlValuesDecoder.DecodeObject (the deepObject case). Any operation with at least one in: query, style: deepObject parameter is exploitable.
PoC
The following self-contained test (package openapi3filter_test) defines a spec with a single deepObject query parameter, then validates two requests that differ only in the number of junk query keys. Decoding time grows with the key count even though none of the junk keys are part of the parameter.
Save as openapi3filter/advisory_poc_test.go:
package openapi3filter_test
import (
"context"
"fmt"
"net/http"
"strings"
"testing"
"time"
"github.com/getkin/kin-openapi/openapi3"
"github.com/getkin/kin-openapi/openapi3filter"
"github.com/getkin/kin-openapi/routers/gorillamux"
)
const specDeepObjectParam = `
openapi: 3.0.0
info: {title: PoC, version: 1.0.0}
paths:
/f:
get:
parameters:
- name: filter
in: query
style: deepObject
explode: true
schema: {type: object, properties: {a: {type: string}}}
responses:
'200':…
- Record
GHSA-h4r5-mxv5-8mjc- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-1050, CWE-400, CWE-770
- Updated
- 2026-11-06
Show 5 moreShow less
OSVRHSA-2026:76677
7.5
Red Hat Security Advisory: Red Hat Hardened Images RPMs bug fix and enhancement update
- Record
RHSA-2026:76677- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVRHSA-2026:82637
7.5
Red Hat Security Advisory: Red Hat Hardened Images RPMs bug fix and enhancement update
- Record
RHSA-2026:82637- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-100350
5.3
kin-openapi is a Go project for handling OpenAPI files. From 0.145.0 until 0.146.0, openapi3filter repeatedly calls regexp.MustCompile for the same parameter-name regular expression inside the per-query-key loop in urlValuesDecoder.DecodeObject used to decode a deepObject query parameter. An unauthenticated remote client can send an affected endpoint a request containing many unrelated query keys, causing ValidateRequest to perform work and allocations proportional to the attacker-controlled key count for every deepObject parameter. The expression itself is fixed and this is not regular expression denial of service; the resource consumption comes from loop-invariant recompilation. This issue is fixed in version 0.146.0.
- Record
UBUNTU-CVE-2026-100350- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVGO-2026-6787 No score
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression in github.com/getkin/kin-openapi
kin-openapi deepObject query decoding repeatedly compiles an invariant regular expression in github.com/getkin/kin-openapi
- Record
GO-2026-6787- Updated
- 2026-11-06
OSVopenSUSE-SU-2026:12164-1 No score
hugo-0.168.0-2.1 on GA media
These are all security issues fixed in the hugo-0.168.0-2.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12164-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/getkin/kin-openapiGo |
0.145.0 up to 0.146.0 | 0.146.0 |
grafana12.4Red Hat:hummingbird:1 From an advisory covering 12 CVEs |
before 0:12.4.12-0.4.hum1 | 0:12.4.12-0.4.hum1 |
hugoRed Hat:hummingbird:1 From an advisory covering 9 CVEs |
before 0:0.168.0-0.1.hum1 | 0:0.168.0-0.1.hum1 |
golang-github-getkin-kin-openapiUbuntu:22.04:LTS |
All versions, plus listed versions 0.32.0-20.80.0-10.85.0-1 |
None known |
golang-github-getkin-kin-openapiUbuntu:24.04:LTS |
All versions, plus listed versions 0.117.0-10.120.0-10.122.0-30.123.0-1 |
None known |
golang-github-getkin-kin-openapiUbuntu:26.10 |
All versions, plus listed versions 0.124.0-10.135.0-1 |
None known |
golang-github-getkin-kin-openapiUbuntu:26.04:LTS |
All versions, plus listed versions 0.124.0-1 |
None known |
hugoopenSUSE:Tumbleweed From an advisory covering 6 CVEs |
before 0.168.0-2.1 | 0.168.0-2.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| affected, aliases, facts | OSV | |
| 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-100350 is a medium vulnerability (CVSS 5.3) in Getkin Kin-openapi, published October 10, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.45%, the 39th percentile. Fixed in github.com/getkin/kin-openapi 0.146.0.
References
github.com/getkin/kin-openapi/security/advisories/GHSA-h4r5-mxv5-8mjc
github.com/getkin/kin-openapi/commit/d090e36b2f1c42c898ba2a687a8f6e25f5ca727f
github.com/getkin/kin-openapi/releases/tag/v0.146.0
nvd.nist.gov/vuln/detail/CVE-2026-100350
github.com/advisories/GHSA-h4r5-mxv5-8mjc
github.com/CVEProject/cvelistV5/tree/main/cves/2026/100xxx/CVE-2026-100350.json
Show 110 moreShow less
github.com/getkin/kin-openapi
access.redhat.com/errata/RHSA-2026:76677
images.redhat.com
access.redhat.com/security/cve/CVE-2026-56851
access.redhat.com/security/updates/classification
access.redhat.com/security/cve/CVE-2026-61801
access.redhat.com/security/cve/CVE-2024-24786
access.redhat.com/security/cve/CVE-2026-95502
access.redhat.com/security/cve/CVE-2026-101899
access.redhat.com/security/cve/CVE-2026-109855
access.redhat.com/security/cve/CVE-2026-100347
access.redhat.com/security/cve/CVE-2026-100348
access.redhat.com/security/cve/CVE-2026-100349
access.redhat.com/security/cve/CVE-2026-100350
access.redhat.com/security/cve/CVE-2026-100351
access.redhat.com/security/cve/CVE-2026-97394
security.access.redhat.com/data/csaf/v2/advisories/2026/rhsa-2026_76677.json
bugzilla.redhat.com/show_bug.cgi?id=2268046
cve.org/CVERecord?id=CVE-2024-24786
nvd.nist.gov/vuln/detail/CVE-2024-24786
go.dev/cl/569356
groups.google.com/g/golang-announce/c/ArQ6CDgtEjY
pkg.go.dev/vuln/GO-2024-2611
bugzilla.redhat.com/show_bug.cgi?id=2547607
cve.org/CVERecord?id=CVE-2026-56851
nvd.nist.gov/vuln/detail/CVE-2026-56851
go.dev/cl/793360
go.dev/issue/80112
pkg.go.dev/vuln/GO-2026-6629
bugzilla.redhat.com/show_bug.cgi?id=2548048
cve.org/CVERecord?id=CVE-2026-61801
nvd.nist.gov/vuln/detail/CVE-2026-61801
github.com/moby/sys/commit/85a71bbe1faa36c552a960e6a5f3d0cfb632fbbe
github.com/moby/sys/pull/221
github.com/moby/sys/security/advisories/GHSA-mjcv-p78q-w5fw
bugzilla.redhat.com/show_bug.cgi?id=2550709
cve.org/CVERecord?id=CVE-2026-95502
nvd.nist.gov/vuln/detail/CVE-2026-95502
grafana.com/security/security-advisories/cve-2026-95502
bugzilla.redhat.com/show_bug.cgi?id=2553575
cve.org/CVERecord?id=CVE-2026-97394
nvd.nist.gov/vuln/detail/CVE-2026-97394
github.com/getkin/kin-openapi/commit/30e292371a89ca6d1f91a9553e0aa518b49f838d
github.com/getkin/kin-openapi/releases/tag/v0.143.0
github.com/getkin/kin-openapi/security/advisories/GHSA-p6wj-qrr4-pgh5
bugzilla.redhat.com/show_bug.cgi?id=2553580
cve.org/CVERecord?id=CVE-2026-100347
nvd.nist.gov/vuln/detail/CVE-2026-100347
github.com/getkin/kin-openapi/commit/f1a5b523b82868d2d9be2e116b4e942892be72c3
github.com/getkin/kin-openapi/releases/tag/v0.145.0
github.com/getkin/kin-openapi/security/advisories/GHSA-fh4f-47mf-f2gj
bugzilla.redhat.com/show_bug.cgi?id=2553571
cve.org/CVERecord?id=CVE-2026-100348
nvd.nist.gov/vuln/detail/CVE-2026-100348
github.com/getkin/kin-openapi/commit/88aa64c7cbd03ecadbb419c473bdcaa8b0124c6b
github.com/getkin/kin-openapi/security/advisories/GHSA-mh7x-f8wq-4jhx
bugzilla.redhat.com/show_bug.cgi?id=2553589
cve.org/CVERecord?id=CVE-2026-100349
nvd.nist.gov/vuln/detail/CVE-2026-100349
github.com/getkin/kin-openapi/commit/f5441d67f855ed34d975b3b85665764644ab1459
github.com/getkin/kin-openapi/security/advisories/GHSA-74vm-87hj-r66f
bugzilla.redhat.com/show_bug.cgi?id=2553584
cve.org/CVERecord?id=CVE-2026-100350
bugzilla.redhat.com/show_bug.cgi?id=2553587
cve.org/CVERecord?id=CVE-2026-100351
nvd.nist.gov/vuln/detail/CVE-2026-100351
github.com/getkin/kin-openapi/commit/eda80e2676e9f577ceed2dd80e64f16083edb041
github.com/getkin/kin-openapi/releases/tag/v0.147.0
github.com/getkin/kin-openapi/security/advisories/GHSA-23vg-4cjm-66q5
bugzilla.redhat.com/show_bug.cgi?id=2550659
cve.org/CVERecord?id=CVE-2026-101899
nvd.nist.gov/vuln/detail/CVE-2026-101899
github.com/axios/axios/commit/d19040bda7a8be2f82c3c6e1a5bc03917daee39a
github.com/axios/axios/pull/11141
github.com/axios/axios/releases/tag/v1.20.0
github.com/axios/axios/security/advisories/GHSA-44g4-m2mj-wpvx
bugzilla.redhat.com/show_bug.cgi?id=2553103
cve.org/CVERecord?id=CVE-2026-109855
nvd.nist.gov/vuln/detail/CVE-2026-109855
cna.openjsf.org/security-advisories.html
github.com/nodejs/undici/security/advisories/GHSA-qq8j-7v2v-3rwp
access.redhat.com/errata/RHSA-2026:82637
access.redhat.com/security/cve/CVE-2026-100352
access.redhat.com/security/cve/CVE-2026-100353
access.redhat.com/security/cve/CVE-2026-100354
security.access.redhat.com/data/csaf/v2/advisories/2026/rhsa-2026_82637.json
bugzilla.redhat.com/show_bug.cgi?id=2553588
cve.org/CVERecord?id=CVE-2026-100352
nvd.nist.gov/vuln/detail/CVE-2026-100352
github.com/getkin/kin-openapi/commit/4487f198ab8be0c37d6ca72c54f5dca4dc25270e
github.com/getkin/kin-openapi/releases/tag/v0.148.0
github.com/getkin/kin-openapi/security/advisories/GHSA-rj39-cv6w-8wv7
bugzilla.redhat.com/show_bug.cgi?id=2553592
cve.org/CVERecord?id=CVE-2026-100353
nvd.nist.gov/vuln/detail/CVE-2026-100353
github.com/getkin/kin-openapi/commit/9814d1f2b212f3508bf52296aa9e248b2122a5a9
github.com/getkin/kin-openapi/releases/tag/v0.149.0
github.com/getkin/kin-openapi/security/advisories/GHSA-vrcc-3ch7-hppw
bugzilla.redhat.com/show_bug.cgi?id=2553590
cve.org/CVERecord?id=CVE-2026-100354
nvd.nist.gov/vuln/detail/CVE-2026-100354
github.com/getkin/kin-openapi/commit/9245cef66c840e27a08409a8a5cd0ee930c5bcff
github.com/getkin/kin-openapi/security/advisories/GHSA-g8cf-rcjf-c8cf
ubuntu.com/security/CVE-2026-100350
suse.com/security/cve/CVE-2026-100347
suse.com/security/cve/CVE-2026-100348
suse.com/security/cve/CVE-2026-100349
suse.com/security/cve/CVE-2026-100350
suse.com/security/cve/CVE-2026-100351
suse.com/security/cve/CVE-2026-100352
Left out here: the rest of 2 source descriptions. The JSON record has them.