CVE-2026-48151: Budibase: Webhook schema endpoint authorization bypass allows unauthenticated mutation of webhook and automation schema

Published May 27, 2026
·
Updated

Budibase is an open-source low-code platform. Prior to 3.39.0, the webhook schema-building endpoint is registered under builderRoutes, but the generic authorization middleware skips authorization for all paths matching /api/webhooks/schema. As a result, an unauthenticated caller can update the body schema for a known webhook and mutate the corresponding automation trigger output schema. This vulnerability is fixed in 3.39.0.

Other sources

The webhook schema-building endpoint is registered under builderRoutes, but the generic authorization middleware skips authorization for all paths matching /api/webhooks/schema. As a result, an unauthenticated caller can update the body schema for a known webhook and mutate the corresponding automation trigger output schema.

Details

The route appears to be builder-only:

- packages/server/src/api/routes/webhook.ts:5-9

ts 5:builderRoutes 6: .get("/api/webhooks", controller.fetch) 7: .put("/api/webhooks", webhookValidator(), controller.save) 8: .delete("/api/webhooks/:id/:rev", controller.destroy) 9: .post("/api/webhooks/schema/:instance/:id", controller.buildSchema)

However, webhook endpoint detection explicitly includes schema:

- packages/server/src/middleware/utils.ts:3-9

ts 3:const WEBHOOKENDPOINTS = new RegExp( 4: "^/api/webhooks/(trigger|schema|discord|ms-teams|slack)(/|$)" 5:) 6: 7:export function isWebhookEndpoint(ctx: UserCtx): boolean { 8: const path = ctx.path || ctx.request.url.split("?")[0] 9: return WEBHOOKENDPOINTS.test(path)

The authorization middleware bypasses all webhook endpoints before checking ctx.user or permissions:

- packages/server/src/middleware/authorized.ts:90-99

ts 90: ) => 91: async (ctx: UserCtx, next: any) => { 92: // webhooks don't need authentication, each webhook unique 93: // also internal requests (between services) don't need authorized 94: if (isWebhookEndpoint(ctx) || ctx.internal) { 95: return next() 96: } 97: 98: if (!ctx.user) { 99: return ctx.throw(401, "No user info found")

The bypassed controller writes attacker-derived schema data to the webhook and automation trigger outputs:

- packages/server/src/api/controllers/webhook.ts:56-83

ts 56:export async function buildSchema( 57: ctx: Ctx<BuildWebhookSchemaRequest, BuildWebhookSchemaResponse> 58:) { 59: await context.doInWorkspaceContext(ctx.params.instance, async () => { 60: const db = context.getWorkspaceDB() 61: const webhook = await db.get<Webhook>(ctx.params.id) 62: webhook.bodySchema = toJsonSchema(ctx.request.body) 63: // update the automation outputs 64: if (webhook.action.type === WebhookActionType.AUTOMATION) { 65: let automation = await db.get<Automation>(webhook.action.target) 66: const autoOutputs = automation.definition.trigger.schema.outputs 67: let properties = webhook.bodySchema?.properties 68: // reset webhook outputs 69: autoOutputs.properties = { 70: body: autoOutputs.properties.body, 71: } 72: for (let prop of Object.keys(properties || {})) { 73: if (properties?.[prop] == null) { 74: continue 75: } 76: const def = properties[prop] 77: if (typeof def === "boolean") { 78: continue 79: } 80: autoOutputs.properties[prop] = { 81: type: def.type as AutomationIOType, 82: description: AUTOMATIONDESCRIPTION, 83: }

The route grouping suggests builder authorization was intended, but the global webhook bypass removes it.

PoC

Non-destructive validation approach:

1. Create a webhook-backed automation as a builder. 2. Record the workspace ID and webhook ID. 3. Log out or send no auth headers. 4. Send:

http POST /api/webhooks/schema/<workspaceId>/<webhookId> HTTP/1.1 content-type: application/json

{"unauthschemaprobe":"test"}

5. Fetch the webhook as a builder and observe that bodySchema has changed. 6. For automation-backed webhooks, inspect the automation trigger schema outputs and observe that properties were reset/updated.

Impact

An unauthenticated attacker can modify webhook schema metadata and automation trigger output schema for known webhook IDs. This can corrupt builder-visible automation definitions, alter downstream binding behavior, and disrupt webhook-backed automation workflows.

GitHub

Affected Software

2 affected componentsFixes available
budibase Budibase<3.39.0
npm/@budibase/server<3.39.0
3.39.0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade npm/@budibase/server to a version that resolves this vulnerability.

    Fixed in 3.39.0

Event History

May 27, 2026
CVE Published
via MITRE·04:57 PM
Data Sourced
via MITRE·04:57 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·06:16 PM
DescriptionSeverityWeakness
Jun 12, 2026
Advisory Published
via GitHub·06:28 PM
Data Sourced
via GitHub·06:28 PM
DescriptionSeverityWeaknessAffected Software
Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2026-48151?

The severity of CVE-2026-48151 is rated as high, with a score of 7.5.

2

How do I fix CVE-2026-48151?

To fix CVE-2026-48151, you should update Budibase to version 3.39.0 or later where the vulnerability has been addressed.

3

What type of vulnerability is CVE-2026-48151?

CVE-2026-48151 is an authorization bypass vulnerability that allows unauthenticated mutations of webhook and automation schema in Budibase.

4

What impact does CVE-2026-48151 have on my system?

CVE-2026-48151 can allow unauthorized users to modify webhook and automation schema, potentially leading to data manipulation.

5

Is CVE-2026-48151 specific to certain versions of Budibase?

Yes, CVE-2026-48151 affects Budibase versions prior to 3.39.0.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203