
सुरक्षा-अनुसंधान प्रयोगशाला: GHSA-3g6g-gq4r-xjm9 / CVE-2026-35580 (GitHub Actions workflow_dispatch इनपुट शेल इंजेक्शन) का NationalSecurityAgency/emissary के पिन किए गए स्नैपशॉट के विरुद्ध नियंत्रित पुनरुत्पादन
स्वचालित शोध कलाकृति — अपस्ट्रीम प्रोजेक्ट नहीं।
यह रिपॉजिटरी Université Laval में मास्टर की थीसिस के लिए एक स्वचालित हार्नेस द्वारा निर्मित एक डिस्पोजेबल लैब है, जो प्रकाशित 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 नेटवर्क को जुड़ा रखता है।
आवश्यक घटकों को स्थापित करने, स्रोत कोड खींचने, Emissary को बनाने और चलाने की जानकारी के लिए DEVELOPING.md गाइड पढ़ें।
Emissary को संकलित, परीक्षण और पैकेज करने के लिए mvn clean package चलाएँ
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.132 s
[INFO] Finished at: 2022-01-10T22:31:05Z
[INFO] ------------------------------------------------------------------------
Emissary में एक bash स्क्रिप्ट है जो सब कुछ चलाती है। यह Emissary की शीर्ष-स्तरीय निर्देशिका में है। स्क्रिप्ट emissary.Emissary क्लास चलाती है जिसमें विभिन्न कार्यों को संभालने के लिए कई Picocli कमांड उपलब्ध हैं।
यदि emissary स्क्रिप्ट बिना किसी तर्क के चलाई जाती है, तो आपको सभी कॉन्फ़िगरेशन उप-कमांडों की सूची और एक संक्षिप्त विवरण मिलेगा।
./emissary
./emissary help चलाने से आपको वही आउटपुट मिलेगा जो बिना तर्कों के चलाने पर मिलता है। यदि आप किसी कमांड के बारे में अधिक विस्तृत जानकारी देखना चाहते हैं, तो help के बाद कमांड का नाम जोड़ें। उदाहरण के लिए, server कमांड के लिए विवरण सहित सभी तर्क देखने के लिए, चलाएँ:
./emissary help server
बाकी कमांडों में सभी के पास (-b या --projectBase) तर्क होते हैं जिन्हें सेट किया जा सकता है, लेकिन यह PROJECT_BASE से मेल खाना चाहिए।
कॉन्फ़िग निर्देशिका डिफ़ॉल्ट रूप से /config पर सेट होती है लेकिन इसे (-c या --config) के साथ भी पास किया जा सकता है। git चेकआउट से चलाते समय, आपको projectBase के रूप में target का उपयोग करना चाहिए। शुरू करने से पहले target/config में कॉन्फ़िग फ़ाइलों को संशोधित करने के लिए स्वतंत्र महसूस करें।
लॉगिंग logback द्वारा संभाली जाती है। आप --logbackConfig तर्क के साथ एक कस्टम फ़ाइल की ओर इशारा कर सकते हैं।
अधिक जानकारी के लिए प्रत्येक कमांड के लिए help -c देखें।
यह कमांड एक Emissary सर्वर शुरू करेगा और सभी स्थानों, एक पिकअप स्थान, और ड्रॉप ऑफ फ़िल्टर को प्रारंभ करेगा जो कॉन्फ़िगर किए गए हैं। यदि -m या --mode निर्दिष्ट नहीं है तो यह स्टैंडअलोन मोड में शुरू होगा। डिफ़ॉल्ट रूप से, MobileAgents की संख्या मशीन के विनिर्देशों के आधार पर गणना की जाती है। आधुनिक कंप्यूटरों पर, यह अधिक हो सकती है। आप -a या --agents के साथ एजेंटों की संख्या को नियंत्रित कर सकते हैं। यहाँ एक उदाहरण चलाना है।
./emissary server -a 2
आगे के कॉन्फ़िगरेशन के बिना, यह http://localhost:8001 पर शुरू होगा। यदि आप उस url पर ब्राउज़ करते हैं, तो आपको target/config/jetty-users.properties में परिभाषित उपयोगकर्ता नाम और पासवर्ड दर्ज करना होगा, जो emissary और emissary123 है।
डिफ़ॉल्ट PickUpPlace target/data/InputData से फ़ाइलें पढ़ने के लिए कॉन्फ़िगर किया गया है। यदि आप उस निर्देशिका में फ़ाइलें कॉपी करते हैं, तो आप देखेंगे कि Emissary उन्हें संसाधित करता है। ध्यान रखें, केवल toUpper और toLower कॉन्फ़िगर किए गए हैं, इसलिए आउटपुट बहुत दिलचस्प नहीं होगा।
सेवा को कार्य लेने से रोकें
./emissary server --pause
रोकी गई सेवा को कार्य लेने की अनुमति दें
./emissary server --unpause
उन सेवाओं को अमान्य करें जो refreshable हैं। यह एक "हल्का" रिफ्रेश है जो एक नो-डाउनटाइम दृष्टिकोण है जो ServiceProviderRefreshablePlace को अमान्य करता है। जब स्थान को DirectoryPlace से खींचा जाता है, तो स्थान को DirectoryPlace और Namespace के लिए समान कुंजियों का उपयोग करके फिर से बनाया जाता है, लेकिन कॉन्फ़िगरेटर को फिर से लोड किया जाता है और स्थान अपने कॉन्फ़िग्स के एक उपसमुच्चय को फिर से लोड करने में सक्षम होता है।
./emissary server --invalidate
सेवाओं का बलपूर्वक रिफ्रेश करें। यह एक "हार्ड" रिफ्रेश है, सर्वर को रोका जाता है और MobileAgents के खाली होने की प्रतीक्षा होती है। एक बार सर्वर पूरी तरह से निष्क्रिय हो जाने पर, सभी ServiceProviderRefreshablePlace मौजूदा कुंजियाँ DirectoryPlace और Namespace से हटा दी जाती हैं, और स्थानों को पूरी तरह से फिर से बनाया जाता है। यह सेवा नामों, प्रॉक्सी, अस्वीकृति सूचियों आदि में परिवर्तन की अनुमति देता है। फिर प्रसंस्करण फिर से शुरू करने के लिए सर्वर को अनपॉज़ किया जाता है। रिफ्रेश में कोई भी विफलता सर्वर को खराब स्थिति में डाल देगी, इसलिए सर्वर को बंद कर दिया जाता है।
./emissary server --refresh
सेवा को बंद करें
./emissary server --stop
सेवा को बलपूर्वक बंद करें
./emissary server --kill
एजेंट कमांड कॉन्फ़िगर किए गए होस्ट के लिए MobileAgents की संख्या और वे एजेंट क्या कर रहे हैं दिखाता है। डिफ़ॉल्ट रूप से, पोर्ट 9001 है, लेकिन आप इसे बदलने के लिए -p या --port का उपयोग कर सकते हैं। यह मानते हुए कि आप उपरोक्त सर्वर कमांड से 8001 पर चल रहे हैं, प्रयास करें:
./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 डंप करता है। यह इसलिए किया जाता है ताकि शेल स्क्रिप्ट source $PROJECT_BASE}/env.sh कर सकें और फिर उन वेरिएबल्स को कहीं और कॉन्फ़िगर करने की चिंता किए बिना उपलब्ध करा सकें।
config कमांड आपको एक निर्दिष्ट स्थान/सेवा/क्लास के लिए प्रभावी कॉन्फ़िगरेशन देखने की अनुमति देता है। चूंकि Emissary फ्लेवर का उपयोग करता है, यह कमांड सभी फ्लेवर लागू होने के बाद एक क्लास का परिणामी कॉन्फ़िगरेशन दिखाएगा। इस कमांड का उपयोग चल रहे Emissary नोड से जुड़ने के लिए किया जा सकता है, -h होस्ट के लिए (डिफ़ॉल्ट localhost है) और -p पोर्ट के लिए (डिफ़ॉल्ट 8001 है) निर्दिष्ट करके। पोर्ट 8001 पर स्थानीय रूप से चल रहे Emissary से जुड़ने के लिए, निम्न में से कोई भी कमांड काम करेगा:
./emissary config --place emissary.place.sample.ToLowerPlace
./emissary config --place emissary.place.sample.ToLowerPlace -h localhost -p 8001
वैकल्पिक रूप से, आप अपने स्थानीय CONFIG_DIR में निर्दिष्ट कॉन्फ़िगरेशन फ़ाइलों का उपयोग करने के लिए --offline का उपयोग करके ऑफ़लाइन मोड निर्दिष्ट कर सकते हैं:
./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 PickUpPlace के बजाय PickUpClient भी शुरू करेगा, इसलिए आपको एक फीडर शुरू करने की आवश्यकता होगी।
रेंडेज़वस पीयर्स देखने के लिए target/config/peers.cfg देखें। इस मामले में, 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 में कुछ फ़ाइलें डालें और देखें कि 2 नोड उन्हें संसाधित करते हैं। उन्हें प्रसंस्करण शुरू करने में एक मिनट लग सकता है
क्लस्टर मोड में एजेंट फिर से 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 देखें