
تنفيذ التعليمات البرمجية عن بُعد (RCE) في نظام التحكم في المهام Yamcs عبر حقن عبارات Java في معرّفات Yarch SQL ذات علامات الاقتباس المزدوجةتنفيذ التعليمات البرمجية عن بُعد (RCE) في نظام التحكم في المهام Yamcs عبر حقن عبارات Java في معرّفات Yarch SQL ذات علامات الاقتباس المزدوجة
إثبات مفهوم غير مسلّح وتوثيق فني لثغرة CVE-2026-55511، وهي ثغرة حقن كود Java مصادق عليها في مُصرّف تعبيرات التجميع في Yamcs StreamSQL.
| الحقل | القيمة |
|---|---|
| المنتج | Yamcs (org.yamcs:yamcs-core) |
| النشرة الأمنية | GHSA-3g44-3m7x-cgg2 |
| نقطة الضعف | CWE-94: تحكم غير صحيح في توليد الكود |
| الخطورة | حرجة، CVSS 3.1: 9.1 |
| ناقل الهجوم | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| الصلاحية المطلوبة | SystemPrivilege.ControlArchiving |
| الإصدارات المُصحَّحة | Yamcs 5.13.2 و5.12.8 |
| تصحيح الفرع الرئيسي | b65a3d78178ba99a58b753feda6ecc3b5a694f13 |
تقبل Yamcs أسماءً بين علامتي اقتباس مزدوجتين لكائنات StreamSQL، وفي الإصدارات المتأثرة تسمح بأي محرف تقريبًا داخل تلك الأسماء. تبني تعبيرات التجميع مثل sum(...) كود Java مصدريًا ديناميكيًا باستخدام أسماء الأعمدة، وتُصرّف هذا المصدر باستخدام Janino SimpleCompiler.
يطبّق الكود الضعيف تعقيمًا أدنى للأسماء فقط قبل وضع اسم العمود في معرّف Java مُولَّد. وبالتالي يمكن لمستخدم مصادق عليه يملك صلاحية ControlArchiving إنشاء اسم عمود مُقتبس ومُصمَّم خصيصًا، والوصول إلى مُصرّف التجميع عبر POST /api/archive/{instance}:executeSql، وتنفيذ كود Java متأثر بالمهاجم داخل JVM لخادم Yamcs.
يتجاوز هذا حدّ التفويض المقصود في Yamcs: إذ تسمح صلاحية ControlArchiving بإدارة الأرشيف والجداول والتدفقات، لكنها لا تمنح عن قصد تنفيذ Java عشوائيًا على الخادم.
| خط الإصدار | المتأثرة | المُصحَّحة |
|---|---|---|
| 5.13.x | 5.13.1 والإصدارات الأقدم | 5.13.2 |
| 5.12.x | 5.12.7 والإصدارات الأقدم | 5.12.8 |
قم بالترقية إلى Yamcs 5.13.2 أو 5.12.8 أو أي إصدار مدعوم أحدث.
مسار البيانات الضعيف هو:
POST /api/archive/{instance}:executeSql
-> TableApi.executeSql
-> Yarch StreamSQL parser
-> double-quoted object name
-> SelectExpression aggregate binding
-> SumExpression.aggregateFillCode_newData
-> Expression.fillCode_InputDefVars
-> CompilableAggregateExpression.getCompiledAggregate
-> Janino SimpleCompiler.cook
-> attacker-influenced Java executes in the Yamcs JVM
تتضافر ثلاثة شروط لإحداث المشكلة:
S_DOUBLE_QUOTED_IDENTIFIER أي محرف باستثناء CR وLF و".Expression.fillCode_InputDefVars اسم متغير Java من اسم العمود، وتستبدل الدالة المساعدة sanitizeName فيه الرمزين / و- فقط.يترك هذا محارف Java النحوية مثل الفواصل المنقوطة والمسافات والأقواس وعوامل الإسناد والنقاط متاحة في الطريقة المُولَّدة newData(Tuple). وبخلاف مسار التعبير المباشر، توفر طريقة التجميع سياق عبارات يمكن الوصول إليه يمكن من خلاله للعبارات المُحقونة أن تُصرَّف وتُنفَّذ.
يتطلب استغلال الثغرة حسابًا مصادقًا عليه يملك صلاحية SystemPrivilege.ControlArchiving. ويُرفض أي حساب لا يملك هذه الصلاحية عند فحص تفويض TableApi.executeSql.
الاستغلال الناجح ينفذ Java بصلاحيات عملية خدمة Yamcs. واعتمادًا على عزل النشر، قد يؤثر ذلك على سرية بيانات المهمة وسلامتها وتوافرها وعلى بيئة المضيف. وهي ليست ثغرة RCE غير مصادق عليها، ولا ترفع بحد ذاتها صلاحيات عملية Yamcs بما يتجاوز صلاحيات نظام التشغيل أو الحاوية الخاصة بها.
إن poc.py المرفق غير مسلّح عمدًا:
javac وjava) لاختبار العلامة غير الضارcd /path/to/yamcs
python3 /path/to/poc.py \
--json /tmp/evidence.json \
--log /tmp/crash_evidence.log \
--expect-crash
المؤشرات المتوقعة:
source_chain_confirmed=true
generated_source_injection_present=true
marker_executed=true
evidence/evidence.json: نتائج منظمة لسلسلة المصدر ونموذج Javaevidence/crash_evidence.log: سجل تحقق موجزأُنتجت الأدلة المرفقة مقابل التزام مصدر Yamcs 98a05e95461207c143e4297ec4bb1b5a76e9cb19. وتؤكد سلسلة المصدر الضعيفة، وحقن المصدر المُولَّد، وتنفيذ العلامة غير الضار.
التصحيح من المصدر الأعلى بعنوان Avoid RCE through double-quoted identifiers:
b65a3d78178ba99a58b753feda6ecc3b5a694f13، صدر في 5.13.28c1070b12c0a6c003903325cb2a1013347e2dbde، صدر في 5.12.8التغيير الجوهري يقيد المعرّفات بين علامتي اقتباس مزدوجتين من مجموعة محارف شبه غير مقيدة:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
إلى قائمة مسموح بها من الحروف والأرقام و$ و_ و# و.:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (<LETTER> | <DIGIT> | <SPECIAL_CHARS>)+ "\"" >
يرفض هذا المحارف الفاصلة بين العبارات والبناءة للتعبيرات المطلوبة للحقن المُبلَّغ عنه قبل وصول الاسم إلى توليد كود Java. ويحدّث التصحيح أيضًا ملفات المحلِّل المُولَّدة والوثائق واختبارًا ذا صلة.
قد يؤثر هذا التقييد على أسماء الكائنات المُقتبسة الحالية التي تحتوي مسافات أو علامات ترقيم غير مسموح بها. راجع مخططات StreamSQL والأتمتة قبل الترقية أو النقل العكسي.
CVE-2026-55511 هي نقطة دخول منفصلة عن CVE-2026-44632 / GHSA-524g-x36v-9wm6. تتعلق CVE-2026-44632 بـJavaExprAlgorithmExecutionFactory، ويُوصل إليها عبر وظيفة تجاوز خوارزميات قاعدة بيانات المهمة، وتتطلب صلاحية ChangeMissionDatabase.
هذه المشكلة موجودة في org.yamcs.yarch.streamsql، ويُوصل إليها عبر executeSql، وتتطلب صلاحية ControlArchiving. ولم يعدّل إصلاح مسار الخوارزمية السابق في 5.13.0 / 5.12.7 مُصرّف StreamSQL أو معالجته للمعرّفات المُقتبسة.
VULNERABILITY_REPORT.md: تقرير موسّع عن الثغرةPATCH_ANALYSIS.md: تحليل مفصّل لتصحيح المصدر الأعلى وملاحظات التوافقاستخدم هذه المواد فقط في الأنظمة التي تملكها أو المخوّل صراحةً باختبارها.