
Exploit de prova de conceito e advisory para CVE-2026-54356, uma falha de autorização ausente no Budibase que permite que usuários de baixo privilégio gerem URLs de upload pré-assinadas do S3 com credenciais AWS armazenadas.
Um usuário autenticado de baixo privilégio (função BASIC) de um workspace Budibase publicado pode chamar POST /api/attachments/:datasourceId/url e obter uma URL de upload pré-assinada S3 assinada com as credenciais AWS do lado do servidor do datasource do workspace, para uma chave de objeto controlada pelo atacante (e, se o datasource não tiver um bucket fixo, também um bucket controlado pelo atacante).
| CVE | CVE-2026-54356 |
| Aviso | GHSA-6x9p-4r67-5gjx |
| Pacote | @budibase/server |
| Tipo | CWE-862: Autorização Ausente |
| Afetado | < 3.41.3 |
| Corrigido | 3.41.3 |
| Severidade | Alta — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Privilégio necessário | Usuário autenticado do aplicativo 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) carrega o datasource pelo :datasourceId, obtém suas accessKeyId/secretAccessKey armazenadas e assina uma solicitação PutObject para o bucket/key fornecidos pelo 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 uma URL assinada respaldada por credenciais é uma ação privilegiada, mas a verificação apenas exige permissão genérica de escrita em tabela (que BASIC possui) e nunca verifica se o chamador tem direito de usar esse datasource específico. Esperado: 403. Real: 200 com signedUrl/publicUrl.
PutObject válidas assinadas com as credenciais AWS armazenadas da organização.curl/PUT simples).Consulte poc/:
poc/exploit.sh — PoC em curl (login → emitir URL assinada → enviar arquivo de prova).poc/poc.py — mesmo fluxo em 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
Atualize para Budibase 3.41.3+. Se você não puder atualizar imediatamente, restrinja as credenciais AWS do datasource S3 ao princípio do menor privilégio (política IAM restrita a bucket/prefixo) e monitore atividades inesperadas de PutObject.
Descoberto e relatado por @KovachVL.
Somente para uso educacional/defensivo e divulgação coordenada. Teste apenas sistemas que você possui ou para os quais está explicitamente autorizado.