
Exploit proof-of-concept e advisory per CVE-2026-54356, una vulnerabilità di autorizzazione mancante in Budibase che consente agli utenti con privilegi limitati di generare URL di upload pre-firmati S3 con le credenziali AWS memorizzate.
Un utente autenticato con privilegi bassi (ruolo BASIC) di un workspace Budibase pubblicato può chiamare
POST /api/attachments/:datasourceId/url e ottenere un URL di upload pre-firmato S3 firmato con
le credenziali AWS lato server del datasource del workspace, per una chiave oggetto controllata dall'attaccante
(e, se il datasource non ha un bucket fisso, anche un bucket controllato dall'attaccante).
| CVE | CVE-2026-54356 |
| Avviso | GHSA-6x9p-4r67-5gjx |
| Pacchetto | @budibase/server |
| Tipo | CWE-862: Autorizzazione mancante |
| Versioni affette | < 3.41.3 |
| Versione corretta | 3.41.3 |
| Gravità | Alta — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Privilegio richiesto | Utente autenticato dell'app con ruolo 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) carica il
datasource tramite :datasourceId, recupera le accessKeyId/secretAccessKey in esso memorizzate e firma una
richiesta PutObject per bucket/key forniti dall'attaccante:
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 }))
Generare un URL firmato basato su credenziali è un'azione privilegiata, ma il controllo richiede solo
l'autorizzazione generica di scrittura sulle tabelle (che BASIC possiede) e non verifica mai che il chiamante abbia
il diritto di utilizzare quello specifico datasource. Atteso: 403. Reale: 200 con signedUrl/publicUrl.
PutObject validi firmati con le credenziali AWS memorizzate dell'organizzazione.curl/PUT semplici).Vedi poc/:
poc/exploit.sh — PoC in curl (login → generazione URL firmato → upload del file di prova).poc/poc.py — stesso flusso in 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
Aggiorna a Budibase 3.41.3+. Se non puoi aggiornare subito, limita le credenziali AWS del datasource S3 al minimo
privilegio (policy IAM vincolata a bucket/prefissi) e monitora l'attività PutObject
inattesa.
Scoperto e segnalato da @KovachVL.
Solo per uso educativo/difensivo e divulgazione coordinata. Testa esclusivamente sistemi che possiedi o per i quali hai esplicita autorizzazione.