CVE-2026-50136: Budibase: Unauthenticated S3 signed upload URL generation allows arbitrary writes with stored datasource credentials

Published Jun 22, 2026
·
Updated

Budibase is an open-source low-code platform. Prior to 3.39.3, the application server exposes an unauthenticated endpoint that generates S3 PutObject presigned URLs using credentials stored in a workspace datasource. The route is protected only by the recaptcha middleware and does not require authentication, table permission, datasource permission, or builder access. A public caller who knows a workspace ID and S3 datasource ID can request a signed upload URL for attacker-controlled bucket and key values. This vulnerability is fixed in 3.39.3.

Other sources

The application server exposes an unauthenticated endpoint that generates S3 PutObject presigned URLs using credentials stored in a workspace datasource. The route is protected only by the recaptcha middleware and does not require authentication, table permission, datasource permission, or builder access. A public caller who knows a workspace ID and S3 datasource ID can request a signed upload URL for attacker-controlled bucket and key values.

Details

The static route registers the signed upload URL endpoint with only recaptcha before the controller:

- packages/server/src/api/routes/static.ts:44-48

ts 44: .post( 45: "/api/attachments/:datasourceId/url", 46: recaptcha, 47: controller.getSignedUploadURL 48: )

The controller loads the datasource by datasourceId with enriched secret values:

- packages/server/src/api/controllers/static/index.ts:590-598

ts 590:export const getSignedUploadURL = async function ( 591: ctx: Ctx<GetSignedUploadUrlRequest, GetSignedUploadUrlResponse> 592:) { 593: // Ensure datasource is valid 594: let datasource 595: try { 596: const { datasourceId } = ctx.params 597: datasource = await sdk.datasources.get(datasourceId, { enriched: true }) 598: if (!datasource) {

The request body controls bucket and key, and the server signs a PUT URL using the stored datasource credentials:

- packages/server/src/api/controllers/static/index.ts:609-629

ts 609: if (datasource?.source === "S3") { 610: const { bucket, key } = ctx.request.body || {} 611: if (!bucket || !key) { 612: ctx.throw(400, "bucket and key values are required") 613: } 614: try { 615: let endpoint = datasource?.config?.endpoint 616: if (endpoint && !utils.urlHasProtocol(endpoint)) { 617: endpoint = https://${endpoint} 618: } 619: const s3 = new S3({ 620: region: awsRegion, 621: endpoint: endpoint, 622: credentials: { 623: accessKeyId: datasource?.config?.accessKeyId as string, 624: secretAccessKey: datasource?.config?.secretAccessKey as string, 625: }, 626: }) 627: const params = { Bucket: bucket, Key: key } 628: signedUrl = await getSignedUrl(s3, new PutObjectCommand(params)) 629: if (endpoint) {

The endpoint returns the signed URL and public URL to the caller:

- packages/server/src/api/controllers/static/index.ts:630-639

ts 630: publicUrl = ${endpoint}/${bucket}/${key} 631: } else { 632: publicUrl = https://${bucket}.s3.${awsRegion}.amazonaws.com/${key} 633: } 634: } catch (error: any) { 635: ctx.throw(400, error) 636: } 637: } 638: 639: ctx.body = { signedUrl, publicUrl }

Because no authorization middleware is applied, the API trusts public input to choose where the stored S3 credentials will write.

PoC

Non-destructive validation approach:

1. Create or identify a workspace with an S3 datasource. 2. Obtain the production workspace ID and S3 datasource ID. 3. Send an unauthenticated request with the workspace ID header and attacker-controlled bucket/key:

http POST /api/attachments/<datasourceId>/url HTTP/1.1 x-budibase-app-id: app<workspace-id> content-type: application/json

{"bucket":"attacker-controlled-or-permitted-bucket","key":"poc/budibase.txt"}

4. Observe that the response contains a signed PUT URL. 5. Upload harmless content to the returned signedUrl and confirm the object is created using the datasource's stored S3 credentials.

Impact

This allows unauthenticated arbitrary object writes wherever the stored S3 datasource credentials have PutObject access. Depending on the datasource permissions, this can corrupt application data, overwrite public assets, place attacker-controlled objects in trusted buckets, consume storage, or abuse an organization's cloud credentials.

GitHub

Affected Software

2 affected componentsFixes available
npm/@budibase/server<3.39.2
3.39.2
budibase Budibase<3.39.3

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.2
  2. Upgrade

    Upgrade Budibase to a version that resolves this vulnerability.

    Fixed in 3.39.3
  3. Configuration

    Ensure the endpoint that registers POST "/api/attachments/:datasourceId/url" is protected by proper authentication/authorization (not only the recaptcha middleware) so callers cannot use a workspace ID + S3 datasource ID to generate signed S3 PutObject URLs with attacker-controlled bucket/key.

    Budibase static route /api/attachments/:datasourceId/url authentication/authorization enforcement = required

Event History

Jun 22, 2026
Advisory Published
via GitHub·11:15 PM
Data Sourced
via GitHub·11:15 PM
DescriptionSeverityAffected Software
Jun 26, 2026
CVE Published
via MITRE·08:36 PM
Data Sourced
via MITRE·08:36 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·09:16 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-50136?

CVE-2026-50136 has a high severity rating of 7.4.

2

What risks does CVE-2026-50136 pose?

CVE-2026-50136 allows unauthenticated access to generate presigned S3 URLs, potentially leading to unauthorized data uploads.

3

How can I fix CVE-2026-50136?

To fix CVE-2026-50136, ensure that the endpoint which generates presigned URLs requires proper authentication and permissions.

4

What software is affected by CVE-2026-50136?

CVE-2026-50136 affects the npm package @budibase/server.

5

When was CVE-2026-50136 published?

CVE-2026-50136 was published on June 22, 2026.

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