كشف باحثون أمنيون من شركة Cycode عن سلسلة من الثغرات في AIT-GUI، وهي واجهة تشغيل مبنية على الويب ضمن مشروع AMMOS Instrument Toolkit مفتوح المصدر التابع لـ NASA/JPL.
المشكلة هنا ليست مجرد لوحة تحكم ويب ضعيفة.
في السيناريو الأسوأ، قد يتمكن مهاجم غير موثّق من إرسال أوامر مباشرة إلى ناقل الأوامر المسؤول عن الأجهزة والمركبات الفضائية التي تتعامل معها المنصة.
السلسلة الأمنية يتم تتبعها تحت المعرّف GHSA-p9r8-2q67-fp86، وحصلت على تقييم 9.4 من 10 وفق CVSS v3.1.
وبحسب الاستشارة الأمنية، فإن الإصدارات 2.5.1 وما قبلها متأثرة، بينما تم الإشارة إلى الإصدار 2.5.2 على أنه الإصدار الذي يعالج المشكلة.
الاستشارة نُشرت في 13 أغسطس 2026، ولم يتم تعيين CVE لها.
#ما هو AIT-GUI أصلًا؟
يُعد AMMOS Instrument Toolkit إطار عمل يستخدم لبناء أنظمة البيانات الأرضية.
بمعنى أبسط، هو جزء من البرمجيات التي يمكن استخدامها لإرسال الأوامر إلى الأجهزة والمركبات الفضائية، ثم استقبال ومعالجة بيانات الـ Telemetry القادمة منها.
أما AIT-GUI فهي واجهة المشغل التي يتعامل معها المستخدم من خلال المتصفح.
وهنا تحديدًا تبدأ خطورة الثغرات، لأن بعض الـ Endpoints الموجودة داخل الواجهة تقوم بتمرير أوامر المشغل مباشرة إلى Command Bus.
Cycode لخّصت خطورة الأمر بعبارة واضحة في تقريرها:
أثر طلب POST غير موثّق هنا لا يُقاس بصفحات تم العبث بها، بل بعدد أوامر الأجهزة التي تم إرسالها.
#الخادم يستمع على جميع الواجهات
بحسب الاستشارة الأمنية، يقرأ خادم AIT-GUI قيمة الـ Host الموجودة في الإعدادات، لكنه يتجاهلها لاحقًا.
بدلًا من ذلك، يقوم الخادم افتراضيًا بالاستماع على العنوان:
0.0.0.0:8080
وهذا يعني أن الخدمة قد تصبح قابلة للوصول من جميع واجهات الشبكة الموجودة على الجهاز، بدلًا من الاقتصار على localhost أو عنوان محدد.
الأخطر من ذلك أن مسارات الأوامر والسكربتات والـ Sequences لم تكن تعتمد على آلية مصادقة تقليدية قائمة على اسم مستخدم أو كلمة مرور.
كما أنها لم تكن تحتوي على حماية فعالة ضد هجمات CSRF.
Cycode أوضحت لاحقًا أن هذه المسارات تحتاج Session Cookie.
لكن الحصول على هذه الجلسة لا يتطلب أي بيانات اعتماد.
يكفي الوصول إلى الصفحة الرئيسية ليقوم الخادم بإنشاء جلسة جديدة للمستخدم.
#كيف يمكن الحصول على Session بدون تسجيل دخول؟
إذا أرسل مهاجم طلبًا مباشرًا إلى:
POST /cmd
بدون Session Cookie صالحة، فسيرد الخادم برمز:
HTTP 401
للوهلة الأولى قد يبدو هذا وكأن هناك حماية.
لكن عند إرسال:
GET /
تقوم الدالة Sessions.create() بإنشاء جلسة جديدة وإرجاع Cookie باسم:
sid
وكل ذلك بدون اسم مستخدم أو كلمة مرور أو أي عملية Authentication فعلية.
بعد الحصول على الـ Cookie، يستطيع المهاجم إعادة إرسال طلب الأمر مرة أخرى.
هذه المرة يمر فحص الجلسة ويتم إرسال الأمر إلى النظام.
أي أن وجود Session بحد ذاته لم يكن مساويًا لوجود مستخدم موثّق.
#ماذا يستطيع المهاجم فعله؟
بحسب الاستشارة، فإن أي طرف قادر على الوصول إلى المنفذ قد يتمكن من تنفيذ مجموعة من العمليات الخطرة.
من بينها إرسال أوامر عشوائية إلى الأجهزة أو المركبات عبر:
POST /cmd
كما يمكن تشغيل سكربتات على الخادم باستخدام:
POST /script/run
وفي بعض الإصدارات كان من الممكن استخدام Path Traversal للوصول إلى ملفات خارج المجلد المخصص.
هناك أيضًا المسار:
POST /seq
والذي يسمح بتشغيل Command Sequences، مع وجود مشكلة مماثلة تتعلق بتمرير ملفات خارج المسار المتوقع إلى Subprocess.
تم تصنيف المشكلات تحت عدة فئات CWE، من أبرزها:
- CWE-306 بسبب غياب المصادقة المطلوبة
- CWE-352 بسبب ضعف الحماية من CSRF
- CWE-22 بسبب Path Traversal
#المشكلة لا تتوقف عند المهاجم الموجود داخل الشبكة
إحدى النقاط اللافتة في البحث كانت إمكانية استغلال المتصفح نفسه كوسيط لإرسال الطلبات.
فبعض المسارات تقبل أجسام طلبات من النوع:
application/x-www-form-urlencoded
وهذا النوع يعتبره المتصفح من طلبات CORS البسيطة.
بالتالي يمكن في بعض الحالات إرسال الطلب بدون تنفيذ طلب OPTIONS Preflight مسبقًا.
Cycode اختبرت هذا الجزء من السيناريو على localhost.
وأظهرت حركة الشبكة الملتقطة من متصفح حقيقي أن طلب POST عبر Origin مختلف تم إرساله بالفعل بدون أي OPTIONS Preflight، وأن الخادم قام بمعالجته.
لكن من المهم هنا عدم المبالغة في توصيف النتيجة.
الباحثون لم يثبتوا الاستغلال الكامل عن بعد ضد نظام شبكي حقيقي كجزء من هذا الاختبار.
ما تم إثباته هو أن ظروف المتصفح نفسها تسمح بتمرير الطلب، وأن السيناريو قد ينطبق أيضًا على نسخة من الخدمة يمكن الوصول إليها عبر الشبكة.
#أي صفحة يفتحها المشغل قد تصبح جزءًا من الهجوم
أحد أكثر أوصاف البحث اختصارًا للمشكلة جاء على لسان Yuval Elbar من Cycode.
الفكرة هي أن واجهة ويب تُستخدم لإرسال أوامر إلى أجهزة ومركبات فضائية كانت تستمع على جميع واجهات الشبكة، ولا تطلب كلمة مرور فعلية، ويمكن أن تتأثر بطلبات ترسلها صفحة ويب أخرى يفتحها المشغل.
وهذا يحول مشكلة Web Security عادية ظاهريًا إلى مسألة مرتبطة مباشرة ببيئة تشغيل حساسة.
#ماذا غيّر الإصدار 2.5.2؟
تم إصدار AIT-GUI 2.5.2 في 12 أغسطس 2026 عبر GitHub.
الإصدار غيّر طريقة Binding الخاصة بالخادم، بحيث أصبح يحترم الـ Host الموجود في الإعدادات ويستخدم localhost افتراضيًا.
كما تمت إضافة before_request Hook يقوم بمقارنة ترويسة Origin أو Referer مع Host الخاص بالخادم عند تنفيذ العمليات الحساسة مثل:
POST
PUT
DELETE
PATCH
الهدف من ذلك هو منع الطلبات القادمة من Origin مختلف وتقليل مخاطر CSRF.
كما تم تقييد المسارين /script/run و/seq بحيث لا يتمكنا من الوصول إلى ملفات خارج الجذور المخصصة لهما.
ويذكر سجل التغييرات أن الطلبات التي تغيّر حالة النظام أصبحت ترفض الطلبات القادمة من مواقع أخرى عند وجود Origin أو Referer غير متطابق.
أما العملاء غير المعتمدين على المتصفح الذين لا يرسلون أيًا من الترويسات، فلم يتأثروا بهذه الآلية.
#لكن المصادقة نفسها ما زالت موضع مشكلة
هنا تظهر أهم نقطة في القصة.
بعد مراجعة الكود الخاص بالإصدارات 2.4.1 و2.5.1 و2.5.2، لاحظ The Hacker News أن الإصدار 2.5.2 ما زال يحتوي على استدعاء Sessions.create() داخل المسار الرئيسي.
بالتالي ما زال بإمكان أي طلب الوصول إلى الصفحة الرئيسية والحصول على Session Cookie بدون Credential Check.
كما أن مسار الأوامر ما زال يقبل أي طلب يحمل Session Cookie صالحة.
أي أن الإصدار 2.5.2 يقلل الوصول الشبكي ويمنع جزءًا مهمًا من سيناريوهات CSRF وPath Traversal، لكنه لا يضيف Authentication تقليدية إلى مسارات الأوامر والسكربتات والـ Sequences.
Cycode لذلك لا تعتبر السلسلة كاملة الإصلاح في 2.5.2.
من وجهة نظرها، تم تقليص مسارات الوصول والاستغلال من المتصفح، لكن جذر مشكلة Missing Authentication ما زال موجودًا.
#مفارقة أخرى في PyPI
عند مراجعة PyPI بتاريخ 20 أغسطس 2026، كان أحدث إصدار منشور من حزمة ait-gui هو:
2.4.1
وقد تم رفعه في 27 يوليو 2023.
أما الإصدارات:
2.5.0
2.5.1
2.5.2
فلم تكن موجودة في سجل الإصدارات على PyPI وقت الفحص.
المثير للانتباه أن كود 2.4.1 يحتوي على نفس الـ Binding الثابت إلى 0.0.0.0، ونفس مشكلة بناء المسارات غير المقيدة في المسارين المتأثرين.
ورغم ذلك، لم يكن PyPI يعرض أي Vulnerabilities للحزمة.
#CVE آخر يغطي نفس الجذر
هناك أيضًا سجل أمني منفصل يغطي مشكلة المصادقة نفسها.
الثغرة تحمل المعرّف CVE-2026-60112، وتم تقييمها بـ 9.3 وفق CVSS v4.
السجل نُشر في NVD وGitHub Advisory Database بتاريخ 29 يوليو 2026، أي قبل تقرير Cycode بعدة أسابيع.
بحسب السجل، فإن الإصدارات السابقة لـ 2.5.1 تحتوي على ضعف Missing Authentication يسمح لمهاجم شبكي غير موثّق بالحصول على Session صالحة ثم إصدار أوامر إلى المركبة.
ونقلت VulnCheck في استشارتها أن السبب هو إمكانية استدعاء Sessions.create() بدون أي Credential Check.
#لكن السجلين لا يتفقان على الإصدار المصحح
هنا يبدأ الجزء الأكثر تعقيدًا.
VulnCheck وسجل NVD يعتبران أن المشكلة موجودة في الإصدارات السابقة لـ 2.5.1، ويشيران إلى Commit محدد على أنه الإصلاح:
في المقابل، استشارة Cycode تصف 2.5.1 بأنه متأثر وتعتبر 2.5.2 الإصدار الذي يحتوي على الإصلاحات.
لكن مراجعة المستودع أظهرت أن إنشاء Session بدون Authentication ما زال موجودًا في كل من 2.5.1 و2.5.2.
وهذا يعني أن وصف "الإصدار المصحح" يعتمد على أي جزء من السلسلة الأمنية نتحدث عنه.
هل نتحدث عن التعرض الشبكي؟
أم CSRF؟
أم Path Traversal؟
أم جذر المشكلة نفسه وهو غياب المصادقة؟
#أين يختلف تقرير Cycode عن CVE-2026-60112؟
Cycode قالت إنها كانت على علم بوجود CVE-2026-60112 قبل نشر تقريرها في 18 أغسطس.
ومع ذلك، تعتبر بحثها Finding منفصلًا لأنه لا يقتصر على Missing Authentication فقط.
بحسب وصفها، يغطي CVE-2026-60112 إنشاء الجلسة بدون Credentials وإمكانية إرسال أوامر عشوائية.
أما تقرير Cycode فيربط المشكلة بسلسلة أوسع تشمل:
- غياب المصادقة
- CSRF أو Cross-Origin Delivery
- Path Traversal في
/seq
وهذا يجعل القصة أقرب إلى Exploit Chain بدلًا من ثغرة منفردة.
#تصحيح مهم حول /script/run
هناك نقطة يجب الانتباه لها لأن المقال الأصلي نفسه تم تصحيحه لاحقًا.
Cycode أوضحت أن Path Traversal في:
/script/run
تم التحقق منها على فرع الإصدار 2.5.0 وليس 2.5.1.
الإصدار 2.5.1 كان قد أضاف بالفعل Canonicalization وContainment Check لهذا المسار.
لكن مشكلة بناء المسار غير المقيد كانت ما تزال موجودة في 2.5.1 داخل:
/seq
وهذا يعني أن تعميم وجود نفس Path Traversal على /script/run في 2.5.1 كان غير دقيق.
#السجلات نفسها ما زالت غير متناسقة
الاستشارة:
لا تظهر ضمن قاعدة GitHub Advisory Database العامة.
أما CVE-2026-60112 فما زال مسجلًا هناك كـ Unreviewed، بدون Package محدد أو Affected Version Range أو Dependabot Support.
كما أن أيًا من السجلين لم يكن ظاهرًا في بيانات الثغرات الخاصة بحزمة PyPI وقت المراجعة.
هذه نقطة مهمة عند الاعتماد على قواعد بيانات الحزم فقط لاكتشاف المخاطر.
غياب الثغرة من Package Registry لا يعني بالضرورة غيابها فعليًا من الكود.
#الذكاء الاصطناعي كان جزءًا من عملية البحث
الـ Commit الذي يحتوي على الإصلاح كتبه Elbar في 10 يوليو 2026.
ويحتوي الـ Commit على Co-Authored-By يشير إلى نموذج Claude Opus 4.8 من Anthropic.
كما أضاف التغيير 18 Regression Test.
وبحسب رسالة الـ Commit، فإن هذه الاختبارات تفشل على الكود السابق وتنجح بعد تطبيق التعديلات.
Cycode ترى أن هذه الطريقة تمثل شكلًا متوقعًا من أبحاث الأمن مستقبلًا.
باحث بشري يعمل جنبًا إلى جنب مع أدوات تحليل الكود المدعومة بالذكاء الاصطناعي للوصول إلى ثغرات معقدة وربطها ببعضها.
#هل تم استغلال الثغرات فعليًا؟
حتى وقت نشر التقرير، لم يتم ذكر أي مهمة فضائية تستخدم النظام بشكل مؤكد.
كما لم يتم الإعلان عن أي عملية استغلال حقيقية لهذه السلسلة.
وهذه نقطة مهمة.
وجود مسار يسمح بإرسال أوامر خطرة لا يعني تلقائيًا أن مركبة فضائية حقيقية تعرضت للاختراق.
لكن طبيعة النظام نفسه تجعل تأثير أي خطأ في حدود الثقة والمصادقة أكبر بكثير من تطبيق ويب تقليدي.
#ليست أول مشكلة تظهر في برمجيات NASA الأرضية
GitHub Advisory Database يحتوي على عدة سجلات أخرى غير مراجعة تتعلق ببرمجيات NASA الأرضية.
من بينها CVE-2026-47731، وهي Path Traversal داخل AMMOS Instrument Toolkit قد تسمح بعمليات Arbitrary File Append عبر الشبكة.
كما توجد سجلات حرجة تتعلق بخادم NASA-AMMOS Aerie/PlanDev تحت المعرّف CVE-2026-71214.
وهناك أيضًا CVE-2026-71289 المرتبطة بمرجع Asynchronous Network Management System.
كما أن مكتبات AIT الأساسية تحتوي على ثغرة أقدم لم يتم تسجيل إصدار مصحح لها حتى الآن.
الثغرة CVE-2024-35058 هي Remote Code Execution حرجة في API wait function داخل NASA AIT-Core، وتؤثر وفق السجل على الإصدارات حتى 2.5.2.
وما زال سجل GitHub يعرض خانة الإصدارات المصححة بدون أي إصدار.
#الخلاصة
القصة هنا لا تتعلق فقط بثغرة Web Security حصلت على تقييم مرتفع.
المشكلة الحقيقية هي حدود الثقة.
واجهة مخصصة لإرسال أوامر إلى أنظمة حساسة كانت تعتمد على Session يمكن الحصول عليها بدون عملية Authentication حقيقية.
في الوقت نفسه كانت الخدمة تستمع على جميع واجهات الشبكة افتراضيًا، مع وجود مسارات قابلة للتأثر بـ CSRF وPath Traversal في بعض الإصدارات.
الإصدار 2.5.2 حسّن الوضع بشكل واضح.
قيد الـ Binding، وأضاف Same-Origin Checks، وحصر الوصول إلى الملفات داخل المسارات المحددة.
لكن وفق تحليل Cycode وThe Hacker News، ما زال غياب المصادقة التقليدية على المسارات الحساسة نقطة تحتاج إلى معالجة مستقلة.
وهذا هو الدرس الأهم.
في الأنظمة الحرجة، Session ليست Authentication.
وواجهة الويب ليست مجرد واجهة إذا كانت الأوامر التي تمر من خلالها قد تصل في النهاية إلى جهاز أو منصة فعلية.
#تصحيح مهم
نسخة سابقة من المقال الأصلي بالغت في نطاق الجزء الذي تم التحقق منه من Cross-Origin Chain.
كما ذكرت أن Path Traversal في /script/run تم التحقق منها في AIT-GUI 2.5.1، وأن السلسلة عولجت بالكامل في 2.5.2.
Cycode أوضحت لاحقًا أن Browser PoC تم تشغيله على localhost.
كما أن /script/run تم اختباره على 2.5.0 وتم إصلاحه في 2.5.1.
أما الإصدار 2.5.2 فما زال لا يضيف Credential-Based Authentication إلى المسارات المتأثرة.



