
Exploit de prueba de concepto y aviso para CVE-2026-54356, una falla de autorización ausente en Budibase que permite a usuarios de bajo privilegio generar URLs de carga pre-firmadas de S3 con credenciales AWS almacenadas.
Un usuario autenticado de bajo privilegio (rol BASIC) de un espacio de trabajo de Budibase publicado puede llamar a POST /api/attachments/:datasourceId/url y obtener una URL de carga pre-firmada de S3 firmada con las credenciales AWS del lado del servidor del datasource del espacio de trabajo, para una clave de objeto controlada por el atacante (y, si el datasource no tiene un bucket fijo, también un bucket controlado por el atacante).
| CVE | CVE-2026-54356 |
| Aviso | GHSA-6x9p-4r67-5gjx |
| Paquete | @budibase/server |
| Tipo | CWE-862: Missing Authorization |
| Afectado | < 3.41.3 |
| Corregido | 3.41.3 |
| Severidad | Alta — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Privilegio requerido | Usuario de aplicación autenticado con rol BASIC |
packages/server/src/api/routes/static.ts:
.post(
"/api/attachments/:datasourceId/url",
recaptcha,
authorized(PermissionType.TABLE, PermissionLevel.WRITE), // too low, wrong resource
controller.getSignedUploadURL
)
packages/server/src/api/controllers/static/index.ts (getSignedUploadURL) carga el datasource mediante :datasourceId, extrae sus accessKeyId/secretAccessKey almacenados y firma una solicitud PutObject para el bucket/key proporcionados por el atacante:
const { bucket, key } = ctx.request.body || {}
const s3 = new S3({
credentials: {
accessKeyId: datasource?.config?.accessKeyId as string,
secretAccessKey: datasource?.config?.secretAccessKey as string,
},
})
signedUrl = await getSignedUrl(s3, new PutObjectCommand({ Bucket: bucket, Key: key }))
Emitir una URL firmada respaldada por credenciales es una acción privilegiada, pero la comprobación solo requiere permiso genérico de escritura de tabla (que BASIC posee) y nunca verifica que el solicitante tenga derecho a usar ese datasource específico. Esperado: 403. Real: 200 con signedUrl/publicUrl.
PutObject válidas firmadas con las credenciales AWS almacenadas de la organización.curl/PUT simple).Consulta poc/:
poc/exploit.sh — PoC en curl (inicio de sesión → emitir URL firmada → subir archivo de prueba).poc/poc.py — el mismo flujo en Python.python3 poc/poc.py \
--target http://localhost:10000 \
--app-id app_xxx --datasource-id datasource_xxx \
--email [email protected] --password 'Password123!' \
--bucket my-attachments --key poc/cve-2026-54356/proof.txt \
--upload
Actualiza a Budibase 3.41.3+. Si no puedes actualizar de inmediato, limita las credenciales AWS del datasource S3 al mínimo privilegio (política IAM restringida a bucket/prefijo) y supervisa la actividad PutObject inesperada.
Descubierto y reportado por @KovachVL.
Solo para uso educativo/defensivo y divulgación coordinada. Prueba únicamente sistemas que poseas o para los que tengas autorización explícita.