
مختبر أبحاث أمنية: إعادة إنتاج مُتحكَّم فيها لثغرة GHSA-3g6g-gq4r-xjm9 / CVE-2026-35580 (حقن أوامر shell عبر مدخلات workflow_dispatch في GitHub Actions) ضد لقطة مثبّتة من NationalSecurityAgency/emissary
أداة بحث آلية — ليست المشروع الأصلي.
هذا المستودع عبارة عن مختبر قابل للتصرف تم بناؤه بواسطة بيئة آلية لأطروحة ماجستير في جامعة لافال حول إعادة إنتاج ثغرات سير عمل GitHub Actions المنشورة. وهو لقطة حرفية من
NationalSecurityAgency/emissaryعند الالتزام898488b489615581ea66d17954742c8e4ffb0323(2026-01-09)، معاد توزيعه بموجب ترخيص ذلك المشروع نفسه، الذي تم تضمين ملفه دون تغيير في هذه اللقطة.المشروع الأصلي ليس مشاركًا، ولا يتم استهدافه أبدًا، والثغرة المدروسة هنا عامة بالفعل. كل سر ومتغير في هذا المستودع هو قيمة وهمية مولدة عشوائيًا — لا توجد أي بيانات اعتماد حقيقية. مراجع الإجراءات وصور المشغّل مثبتة على ما تم حله إليه في 2026-01-09؛ راجع
pinning.mdفي مخرجات البيئة الآلية لكل تغيير تم إجراؤه على اللقطة.الأسئلة أو الاعتراضات: [email protected]

Emissary هو محرك سير عمل قائم على البيانات ويعمل بتقنية P2P، ويعمل في شبكة غير متجانسة وربما موزعة على نطاق واسع ومتعددة المستويات من موارد الحوسبة بتقنية P2P. مسارات سير العمل ليست مخططة مسبقًا كما في محركات سير العمل التقليدية، بل يتم اكتشافها مع اكتشاف المزيد من المعلومات حول البيانات. لا يوجد عادةً أي تفاعل مع المستخدم في سير عمل Emissary، بل تتم معالجة البيانات بطريقة موجهة نحو الهدف حتى تصل إلى حالة اكتمال.
Emissary قابل للتكوين بدرجة عالية، لكنه في هذا التنفيذ الأساسي لا يفعل شيئًا تقريبًا. يُتوقع من مستخدمي هذا الإطار توفير فئات توسّع emissary.place.ServiceProviderPlace لأداء العمل على حمولات emissary.core.IBaseDataObject.
يمكن القيام بمجموعة متنوعة من الأشياء ويتم إدارة سير العمل على مراحل، مثل STUDY وID وCOORDINATE وTRANSFORM وANALYZE وIO وREVIEW.
الفئات المسؤولة عن توجيه سير العمل هي emissary.core.MobileAgent والفئات المشتقة منها، والتي تدير مسار مجموعة من كائنات الحمولة المرتبطة عبر سير العمل، و emissary.directory.DirectoryPlace التي تدير الخدمات المتاحة وتكلفتها وجودتها وتحافظ على اتصال شبكة P2P.
اقرأ دليل DEVELOPING.md للحصول على معلومات حول تثبيت المكونات المطلوبة، وسحب الكود المصدري، وبناء وتشغيل Emissary.
شغّل mvn clean package لتجميع واختبار وتعبئة Emissary
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.132 s
[INFO] Finished at: 2022-01-10T22:31:05Z
[INFO] ------------------------------------------------------------------------
يوجد سكربت bash واحد في Emissary يشغّل كل شيء. وهو موجود في الدليل العلوي لـ Emissary. يشغّل السكربت فئة emissary.Emissary التي تحتوي على عدة أوامر Picocli متاحة للتعامل مع وظائف مختلفة.
إذا تم تشغيل سكربت emissary بدون أي وسائط، ستحصل على قائمة بجميع الأوامر الفرعية للتكوين ووصفًا موجزًا.
./emissary
تشغيل ./emissary help سيعطيك نفس المخرجات كالتشغيل بدون وسائط. إذا أردت رؤية معلومات
أكثر تفصيلًا حول أمر معين، أضف اسم الأمر بعد help. على سبيل المثال، لرؤية جميع
الوسائط مع الأوصاف لأمر server، شغّل:
./emissary help server
بقية الأوامر جميعها تحتوي على وسائط (-b أو --projectBase) يمكن تعيينها، لكن يجب أن تطابق PROJECT_BASE.
دليل التكوين افتراضيًا هو /config ولكن يمكن أيضًا تمريره باستخدام (-c أو --config). عند التشغيل من نسخة git، يجب استخدام target كـ projectBase. لا تتردد في تعديل ملفات التكوين في target/config قبل البدء.
تتم معالجة السجلات بواسطة logback. يمكنك الإشارة إلى ملف مخصص باستخدام وسيط --logbackConfig.
راجع help -c لكل أمر للحصول على مزيد من المعلومات.
سيبدأ هذا الأمر خادم Emissary ويهيئ جميع الأماكن، ومكان الالتقاط، ومرشحات التسليم التي تم تكوينها. سيبدأ في الوضع المستقل إذا لم يتم تحديد -m أو --mode. افتراضيًا، يتم حساب عدد MobileAgents بناءً على مواصفات الجهاز. على أجهزة الكمبيوتر الحديثة، يمكن أن يكون هذا الرقم مرتفعًا. يمكنك التحكم في عدد الوكلاء باستخدام -a أو --agents. إليك مثال على التشغيل.
./emissary server -a 2
بدون مزيد من التكوين، سيبدأ على http://localhost:8001. إذا تصفحت إلى هذا العنوان، ستحتاج إلى إدخال اسم المستخدم وكلمة المرور المحددين في target/config/jetty-users.properties، وهما emissary وemissary123.
تم تكوين PickUpPlace الافتراضي لقراءة الملفات من target/data/InputData. إذا نسخت ملفات إلى هذا الدليل، سترى Emissary يعالجها. ضع في اعتبارك أنه تم تكوين toUpper وtoLower فقط، لذلك لن يكون الناتج مثيرًا للاهتمام.
إيقاف الخدمة عن استلام العمل
./emissary server --pause
السماح لخدمة موقوفة مؤقتًا باستلام العمل
./emissary server --unpause
إبطال الخدمات القابلة للتحديث. هذا تحديث "خفيف" وهو نهج بدون توقف يبطل ServiceProviderRefreshablePlace. عندما يتم سحب المكان من DirectoryPlace، يتم إعادة إنشاء المكان باستخدام نفس المفاتيح لـ DirectoryPlace وNamespace، ولكن يتم إعادة تحميل المُهيئ ويكون المكان قادرًا على إعادة تحميل مجموعة فرعية من تكويناته.
./emissary server --invalidate
فرض تحديث الخدمات. هذا تحديث "صعب"، يتم إيقاف الخادم مؤقتًا وهناك انتظار لتصريف MobileAgents. بمجرد أن يصبح الخادم خاملاً تمامًا، تتم إزالة جميع مفاتيح ServiceProviderRefreshablePlace الموجودة من DirectoryPlace وNamespace، ويتم إعادة إنشاء الأماكن بالكامل. يسمح هذا بتغييرات في أسماء الخدمات والوكلاء وقوائم الرفض وما إلى ذلك. ثم يتم استئناف الخادم لاستكمال المعالجة. أي فشل في التحديث سيضع الخادم في حالة سيئة، لذلك يتم إيقاف تشغيل الخادم.
./emissary server --refresh
إيقاف تشغيل الخدمة
./emissary server --stop
فرض إيقاف تشغيل الخدمة
./emissary server --kill
يعرض أمر agents عدد MobileAgents للمضيف المكوّن وما الذي يفعله هؤلاء الوكلاء. افتراضيًا، المنفذ هو 9001، ولكن يمكنك استخدام -p أو --port لتغيير ذلك. بافتراض أنك تعمل على 8001 من أمر server أعلاه، جرب:
./emissary agents -p 8001
التجمع هو عرض مبسط للوكلاء لعقدة. هو أيضًا افتراضيًا على المنفذ 9001. لتشغيله للخادم المستقل الذي بدأته أعلاه، شغّل
./emissary pool -p 8001
هذا الأمر أكثر فائدة للعنقود لأنه عرض أكثر قابلية للاستيعاب لكل عقدة.
يتطلب أمر Env تشغيل خادم. سيطلب من الخادم بعض قيم التكوين، مثل PROJECT_BASE وBIN_DIR. بدون وسائط، سيقوم بإخراج استجابة json غير منسقة.
./emissary env
ولكن يمكنك أيضًا إخراج استجابة مناسبة للاستيراد في bash.
./emissary env --bashable
بدء تشغيل خادم Emissary يستدعي بالفعل هذه النقطة الطرفية ويخرج $PROJECT_BASE}/env.sh
مع المتغيرات المكوّنة. يتم ذلك حتى تتمكن سكربتات shell من source $PROJECT_BASE}/env.sh
ثم تتوفر تلك المتغيرات دون الحاجة إلى القلق بشأن تكوينها في مكان آخر.
يتيح لك أمر config رؤية التكوين الفعلي لمكان/خدمة/فئة محددة. نظرًا لأن Emissary يستخدم
النكهات، سيعرض هذا الأمر التكوين الناتج لفئة بعد تطبيق جميع النكهات. يمكن استخدام هذا الأمر
للاتصال بعقدة Emissary قيد التشغيل عن طريق تحديد -h للمضيف (الافتراضي هو localhost) و-p لـ
المنفذ (الافتراضي هو 8001). للاتصال بـ Emissary يعمل محليًا على المنفذ 8001، سيعمل أي من الأوامر التالية:
./emissary config --place emissary.place.sample.ToLowerPlace
./emissary config --place emissary.place.sample.ToLowerPlace -h localhost -p 8001
اختياريًا، يمكنك تحديد وضع عدم الاتصال باستخدام --offline لاستخدام ملفات التكوين المحددة في
CONFIG_DIR المحلي لديك:
./emissary config --place emissary.place.sample.ToLowerPlace --offline
في وضع عدم الاتصال، يمكنك توفير نكهات لرؤية الاختلافات في التكوينات:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --flavor STANDALONE,TESTING
هذه مفيدة لرؤية التكوين الفعلي، ولكن يمكننا أيضًا التشغيل في وضع مفصّل لرؤية
جميع ملفات التكوين مع المخرجات النهائية. يتم التحكم في هذا باستخدام
علامة --detailed:
./emissary config --place emissary.place.sample.ToLowerPlace --detailed
أو في وضع عدم الاتصال:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --detailed
Emissary ممتع في الوضع المستقل، لكن تشغيل العنقود أكثر ملاءمة للعمل الحقيقي. طريقة تشغيل العنقود مشابهة للوضع المستقل، لكنك تحتاج إلى -m cluster لإخبار العقدة بالاتصال بالعقد الأخرى. في الوضع العنقودي، سيبدأ Emissary أيضًا PickUpClient بدلاً من PickUpPlace، لذلك ستحتاج إلى بدء وحدة تغذية.
انظر إلى target/config/peers.cfg لرؤية نظراء rendezvous. في هذه الحالة، هناك 3. العقد التي تعمل على المنفذ 8001 و9001 هي مجرد عقد Emissary. العقدة التي تعمل على 7001 هي وحدة التغذية. لذا لنبدأ تشغيل 8001 و9001 في طرفيتين مختلفتين.
./emissary server -a 2 -m cluster
./emissary server -a 2 -m cluster -p 9001
نظرًا لأن هذه العقد جميعها تعرف المنافذ 8001 و9001 و7001، سترى أخطاء في السجلات بينما تستمر في محاولة الاتصال.
لاحظ، في عمليات النشر في العالم الحقيقي، لا نشغّل عمليات Emissary متعددة على نفس العقدة. يمكنك تكوين اسم المضيف باستخدام -h.
مع بدء العقد على المنفذين 8001 و9001، نحتاج إلى بدء وحدة التغذية. يستخدم أمر feed المنفذ 7001 افتراضيًا، لكننا بحاجة إلى إعداد دليل ستقرأ منه وحدة التغذية. الملفات التي تُسقط في هذا الدليل ستكون متاحة للعقد العاملة لالتقاطها ويجب توزيع العمل بين العنقود. ابدأ التغذية باستخدام
mkdir ~/Desktop/feed1
./emissary feed -i ~/Desktop/feed1/
يجب أن تكون قادرًا على الوصول إلى http://localhost:8001 وhttp://localhost:9001 وhttp://localhost:7001 في المتصفح و النظر إلى الأماكن المكوّنة. أسقط بعض الملفات في ~/Desktop/feed1 وشاهد العقدتين تعالجانها. قد يستغرق الأمر دقيقة قبل أن تبدأ المعالجة.
يعرض الوكلاء في الوضع العنقودي مرة أخرى تفاصيل حول mobileAgents. يبدأ من العقدة التي تكوّنها (localhost:9001 افتراضيًا)، ثم يتصل بجميع العقد التي يعرفها ويحصل على نفس المعلومات. شغّله باستخدام:
./emissary agents --cluster
يقوم التجمع في الوضع العنقودي أيضًا بنفس ما يفعله التجمع في الوضع المستقل. يبدأ من العقدة (localhost:9001) افتراضيًا ثم يذهب إلى جميع العقد التي يعرفها ويجمع عرضًا مبسطًا للعنقود. شغّله باستخدام
./emissary pool --cluster
تتحدث الطوبولوجيا إلى العقدة المكوّنة (localhost:8001 افتراضيًا) وتتحدث إلى كل عقدة تعرفها. الاستجابة هي ما تعرفه جميع تلك العقد، لذا يمكنك بناء طوبولوجيا شبكة لعنقودك. شغّلها باستخدام
./emissary topology
مخزن المفاتيح وكلمة مرور مخزن المفاتيح موجودان في ملف emissary.client.EmissaryClient-SSL.cfg. مضمن ومكوّن افتراضيًا هو مخزن مفاتيح نموذجي يمكنك استخدامه لاختبار هذه الوظيفة. لا نوصي باستخدام مخزن المفاتيح النموذجي في بيئات الإنتاج. لاستخدام مخزن المفاتيح الخاص بك، غيّر قيم التكوين في ملف emissary.client.EmissaryClient-SSL.cfg.
مستقل
./emissary server -p 8443 --ssl --disableSniHostCheck
عنقودي
./emissary server -p 8443 --ssl --disableSniHostCheck --mode cluster
./emissary server -p 9443 --ssl --disableSniHostCheck --mode cluster
mkdir ~/Desktop/feed1
./emissary feed -p 7443 --ssl --disableSniHostCheck -i ~/Desktop/feed1/
إذا كانت لديك أي أسئلة أو مخاوف حول هذا المشروع، يمكنك الاتصال بنا على: [email protected]
لأسئلة الأمان والإبلاغ عن الثغرات، يرجى الرجوع إلى SECURITY.md