
قالب Nuclei لاكتشاف CVE-2026-33017، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد بدون مصادقة في Langflow حتى الإصدار 1.8.2. يجري فحوصات مسبقة غير مدمرة للتمييز بين الإصدارات المعرّضة للخطر والإصدارات المصحَّحة عبر تحليل استجابات HTTP.
قالب Nuclei يكتشف CVE-2026-33017 — ثغرة تنفيذ برمجيات عن بُعد غير مُصادَق عليها في Langflow ≤ 1.8.2 يمكن الوصول إليها عبر نقطة نهاية بناء التدفق العامة:
POST /api/v1/build_public_tmp/{flow_id}/flow
يقبل المعالج المعرَّض للثغرة مخطط تدفق data مُتحكَّمًا فيه من المهاجم، ويمرّر data.nodes[].data.node.template.code.value مباشرةً إلى exec() الخاصة بـ Python أثناء بناء المخطط، دون أي عزل (sandboxing). يُسقط الإصلاح (≥ 1.9.0) معامل data من توقيع المعالج، لذا يرفض البناء المُصحَّح الطلب نفسه في طبقة التحقق من FastAPI برمز HTTP 422.
القالب غير مُدمِّر. يرسل حمولة خاملة ضد معرّف تدفق UUID صفري، لذا لا يمكنه الوصول إلى exec() حتى على مضيف معرَّض للثغرة. وهو يميِّز المعالج المعرَّض من المُصحَّح من خلال توقيع استجابة HTTP وحده.
| المرحلة | الطلب | ما الذي يخبرك به |
|---|---|---|
| 1 | GET /api/v1/version |
توجيه المرحلة 2:
لا يزال تأكيد RCE الفعلي يتطلب (أ) معرّف تدفق PUBLIC حقيقي على الهدف و(ب) استدعاءً خارج النطاق (out-of-band) (DNS/HTTP). هذه الخطوة غير مضمّنة هنا عمدًا — هذا القالب هو الفحص المسبق الآمن الذي يقرر ما إذا كان تشغيل استغلال نشط منطقيًا من الأساس.
مضيف واحد:
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
فحص شامل من قائمة:
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
مع مخرجات التصحيح (لمشاهدة الطلبات/الاستجابات الخام):
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
تحقق من القالب محليًا قبل تشغيله:
nuclei -validate -t CVE-2026-33017.yaml
هدف معرَّض للثغرة:
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
هدف مُصحَّح — لا يُصدَر أي اكتشاف (استجابة 422 لا تطابق أي قاعدة).
استعلامات اكتشاف شائعة لمضيفات Langflow (استخدمها فقط ضد الأصول المصرَّح لك باختبارها):
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hفي البناءات المعرَّضة للثغرة، يُصرَّح عن المعالج العام تقريبًا كما يلي:
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
حقل data مُتحكَّم فيه من المهاجم. يزيل المعالج المُصحَّح المعامل تمامًا ويُجبر data=None، وهذا هو السبب في أن الطلب الذي يتضمن حقل data في النص يُرفض برمز 422 على البناءات المُصحَّحة.
/api/v1/build_public_tmp/ عند الخادم الوكيل العكسي (reverse proxy).LANGFLOW_AUTO_LOGIN=False، وقم بإعداد بيانات اعتماد المستخدم الفائق (superuser)، وبدّل LANGFLOW_SECRET_KEY.access_type=PUBLIC هي التي سيستهدفها المهاجم في الرابط.هذا القالب منشور لأغراض الأمن الدفاعي والاختبار المصرَّح به فقط. تشغيله ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها غير قانوني في معظم الولايات القضائية وينتهك شروط خدمة المنصات.
باستخدامك لهذا القالب فإنك توافق على أن:
lopseg — https://github.com/lopseg
طلبات السحب (Pull requests) والقضايا (issues) مرحّب بها.
MIT
| يؤكد أن الهدف هو Langflow ويستخرج إصدار البناء. |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow مع نص يحتوي على حقل data وقيمة template.code.value خاملة | قرار التوجيه أدناه. |
| الحالة | يحتوي النص على | الحكم |
|---|
404 | flow / public | معرَّض للثغرة — قبل المعالج data، ثم فشل البحث لأن UUID وهمي. |
200 | job_id / build / task | معرَّض للثغرة — قبل المعالج data ودخل مسار البناء. |
5xx | exec / Component / traceback | معرَّض للثغرة — وصل المعالج إلى مسار كود exec قبل الفشل. |
422 | Field required / extra / data | مُصحَّح — لم يعد توقيع المعالج يقبل data. |