
Exploit proof-of-concept et avis de sécurité pour CVE-2026-54356, une faille d'absence de contrôle d'autorisation dans Budibase qui permet aux utilisateurs à faibles privilèges de générer des URL de téléversement S3 pré-signées avec les identifiants AWS stockés.
Un utilisateur authentifié à faibles privilèges (rôle BASIC) d'un espace de travail Budibase publié peut appeler POST /api/attachments/:datasourceId/url et obtenir une URL de téléversement pré-signée S3 signée avec les identifiants AWS côté serveur de la source de données de l'espace de travail, pour une clé d'objet contrôlée par l'attaquant (et, si la source de données n'a pas de bucket fixe, un bucket également contrôlé par l'attaquant).
| CVE | CVE-2026-54356 |
| Avis | GHSA-6x9p-4r67-5gjx |
| Paquet | @budibase/server |
| Type | CWE-862: Missing Authorization |
| Versions affectées | < 3.41.3 |
| Version corrigée | 3.41.3 |
| Sévérité | Élevée — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Privilège requis | Utilisateur d'application BASIC authentifié |
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) charge la source de données via :datasourceId, récupère ses accessKeyId/secretAccessKey stockés, et signe une requête PutObject pour le bucket/key fourni par l'attaquant :
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 }))
La génération d'une URL signée adossée à des identifiants est une action privilégiée, mais la vérification n'exige qu'une permission générique d'écriture sur la table (que BASIC possède) et ne vérifie jamais que l'appelant est autorisé à utiliser cette source de données précise. Attendu : 403. Constaté : 200 avec signedUrl/publicUrl.
PutObject valides, signées avec les identifiants AWS stockés de l'organisation.curl/PUT simple).Voir poc/ :
poc/exploit.sh — PoC curl (connexion → génération d'URL signée → téléversement du fichier de preuve).poc/poc.py — même procédure 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
Mettez à niveau vers Budibase 3.41.3+. Si vous ne pouvez pas mettre à niveau immédiatement, limitez les identifiants AWS de la source de données S3 au moindre privilège (politique IAM restreinte au bucket/préfixe) et surveillez toute activité PutObject inattendue.
Découvert et signalé par @KovachVL.
Pour un usage éducatif/défensif et une divulgation coordonnée uniquement. Ne testez que les systèmes que vous possédez ou que vous êtes explicitement autorisé à tester.