
Proof-of-Concept-Exploit und Advisory für CVE-2026-54356, eine Budibase-Schwachstelle aufgrund fehlender Autorisierung, die es Benutzern mit geringen Berechtigungen ermöglicht, vorab signierte S3-Upload-URLs mit hinterlegten AWS-Zugangsdaten zu generieren.
Ein authentifizierter Benutzer mit niedrigen Rechten (BASIC-Rolle) eines veröffentlichten Budibase-Arbeitsbereichs kann POST /api/attachments/:datasourceId/url aufrufen und eine vorsignierte S3-Upload-URL erhalten, die mit den serverseitigen AWS-Anmeldeinformationen der Arbeitsbereichs-Datenquelle signiert ist, für einen angreiferkontrollierten Objektschlüssel (und, wenn die Datenquelle keinen festen Bucket hat, auch für einen angreiferkontrollierten Bucket).
| CVE | CVE-2026-54356 |
| Advisory | GHSA-6x9p-4r67-5gjx |
| Paket | @budibase/server |
| Typ | CWE-862: Fehlende Autorisierung |
| Betroffen | < 3.41.3 |
| Behoben | 3.41.3 |
| Schweregrad | Hoch — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Erforderliche Berechtigung | Authentifizierter BASIC-App-Benutzer |
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) lädt die Datenquelle anhand von :datasourceId, entnimmt ihr die gespeicherten accessKeyId/secretAccessKey und signiert eine PutObject-Anfrage für den vom Angreifer bereitgestellten bucket/key:
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 }))
Das Erzeugen einer auf Anmeldeinformationen basierenden signierten URL ist eine privilegierte Aktion, aber die Prüfung verlangt lediglich eine generische Tabellen-Schreibberechtigung (über die BASIC verfügt) und verifiziert nie, ob der Aufrufer zur Nutzung dieser spezifischen Datenquelle berechtigt ist. Erwartet: 403. Tatsächlich: 200 mit signedUrl/publicUrl.
PutObject-vorsignierte URLs, die mit den gespeicherten AWS-Anmeldeinformationen der Organisation signiert sind.curl/PUT).Siehe poc/:
poc/exploit.sh — curl-PoC (Anmeldung → signierte URL erzeugen → Beweisdatei hochladen).poc/poc.py — gleicher Ablauf 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
Aktualisieren Sie auf Budibase 3.41.3+. Falls Sie nicht sofort aktualisieren können, schränken Sie die AWS-Anmeldeinformationen der S3-Datenquelle auf das Prinzip der geringsten Rechte ein (IAM-Richtlinie mit Bucket-/Präfix-Beschränkung) und überwachen Sie auf unerwartete PutObject-Aktivitäten.
Entdeckt und gemeldet von @KovachVL.
Nur für Bildungs-/Verteidigungszwecke und koordinierte Offenlegung. Testen Sie nur Systeme, die Ihnen gehören oder für deren Test Sie ausdrücklich autorisiert sind.