
PoC-эксплойт и уведомление об уязвимости CVE-2026-54356, недостатке отсутствия авторизации в Budibase, который позволяет пользователям с низкими привилегиями создавать предварительно подписанные URL-адреса для загрузки в S3 с сохранёнными учётными данными AWS.
Аутентифицированный пользователь опубликованного рабочего пространства Budibase с низкими привилегиями (роль BASIC) может вызвать POST /api/attachments/:datasourceId/url и получить предварительно подписанную S3-ссылку на загрузку, подписанную серверными AWS-учётными данными datasource рабочего пространства, для управляемого атакующим ключа объекта (а если в datasource не задан фиксированный bucket — то и управляемого атакующим bucket).
| CVE | CVE-2026-54356 |
| Уведомление | GHSA-6x9p-4r67-5gjx |
| Пакет | @budibase/server |
| Тип | CWE-862: Missing Authorization |
| Затронутые версии | < 3.41.3 |
| Исправлено в | 3.41.3 |
| Серьёзность | Высокая — CVSS 3.1 7.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N) |
| Требуемые привилегии | Аутентифицированный пользователь приложения с ролью 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) загружает datasource по :datasourceId, извлекает сохранённые в нём accessKeyId/secretAccessKey и подписывает запрос PutObject для управляемых атакующим 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 }))
Выпуск подписанной ссылки на основе учётных данных — привилегированное действие, однако проверка требует лишь общего разрешения на запись в таблицу (которым обладает BASIC) и никогда не проверяет, что вызывающая сторона имеет право использовать именно этот datasource. Ожидалось: 403. Фактически: 200 с signedUrl/publicUrl.
PutObject, подписанные сохранёнными AWS-учётными данными организации.curl/PUT).См. poc/:
poc/exploit.sh — PoC на curl (вход → выпуск подписанной ссылки → загрузка файла-подтверждения).poc/poc.py — тот же сценарий на 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
Обновитесь до Budibase 3.41.3+. Если немедленное обновление невозможно, ограничьте AWS-учётные данные S3-datasource минимально необходимыми правами (IAM-политика с ограничением по bucket/префиксу) и отслеживайте неожиданную активность PutObject.
Обнаружил и сообщил об уязвимости @KovachVL.
Только для образовательного/защитного использования и скоординированного раскрытия информации. Тестируйте только системы, которые принадлежат вам или на тестирование которых вы получили явное разрешение.