
शैक्षिक राइट-अप और CVE-2026-92162 के लिए टेस्ट-मोड PoC, जो Flatpak के DeployAppstream arch पैरामीटर में एक पाथ ट्रैवर्सल है जो रूट डायरेक्टरी निर्माण को सक्षम बनाता है।
Flatpak सिस्टम हेल्पर (flatpak-system-helper) में पथ ट्रैवर्सल के लिए शैक्षिक लेख और टेस्ट मोड प्रूफ ऑफ कॉन्सेप्ट। DeployAppstream D-Bus मेथड एक arch स्ट्रिंग स्वीकार करता है जिसे फाइलसिस्टम पथ में रखा जाता है और root के रूप में बनाया जाता है, बिना किसी वैलिडेशन के। एक सक्रिय लोकल उपयोगकर्ता ../ कंपोनेंट्स प्रदान कर सकता है और root विशेषाधिकार प्राप्त सेवा को इच्छित appstream ट्री के बाहर डायरेक्टरीज़ बनाने का कारण बन सकता है।
यह रिपॉजिटरी पूर्ण तकनीकी विश्लेषण और शोध पोस्ट-मॉर्टम के साथ है। यह शिक्षा के लिए, उन डिफेंडर्स के लिए जो तंत्र को समझना चाहते हैं, और उन सिस्टम्स पर अधिकृत परीक्षण के लिए मौजूद है जिनके आप मालिक हैं या जिनका मूल्यांकन करने के लिए आपके पास लिखित अनुमति है।
यह सामग्री समन्वित डिस्क्लोज़र के बाद और एक फिक्स्ड Flatpak रिलीज़ उपलब्ध होने के बाद प्रकाशित की गई है। प्रूफ ऑफ कॉन्सेप्ट को केवल उस लैब मशीन पर चलाएं जिसके आप मालिक हैं या जिसका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। इसे उन सिस्टम्स पर न चलाएं जिन्हें आप नियंत्रित नहीं करते। कानून के भीतर और आपके पास मौजूद किसी भी प्राधिकरण के दायरे में रहने की जिम्मेदारी आपकी है।
सिस्टम हेल्पर में handle_deploy_appstream() origin आर्ग्युमेंट को वैलिडेट करता है लेकिन arch आर्ग्युमेंट को नहीं। OCI रिमोट के लिए, arch flatpak_build_file में और फिर g_mkdir_with_parents में प्रवाहित होता है, जो root के रूप में चलता है और ../ को लेक्सिकली रिज़ॉल्व करता है। मेथड के लिए polkit एक्शन org.freedesktop.Flatpak.appstream-update है, जो allow_active=yes है, इसलिए एक सक्रिय लोकल सेशन बिना पासवर्ड प्रॉम्प्ट के कोड तक पहुंचता है। उस सिस्टम पर जिसमें पहले से ही एक OCI रिमोट है, जैसे कि डिफ़ॉल्ट Fedora Workstation अपने fedora रिमोट के साथ, एक कम विशेषाधिकार प्राप्त उपयोगकर्ता मनमाने पथ पर root के स्वामित्व वाली डायरेक्टरीज़ बना सकता है। इस रिपॉजिटरी में पेलोड /root/.ssh को ही लक्षित करता है।
यह भेद्यता, Finding A, को एक नियंत्रित और अधिकृत लैब में, एक अनधिकृत लोकल उपयोगकर्ता से मशीन पर root तक एस्केलेट करने के लिए उपयोग की गई दो भेद्यता श्रृंखला के हिस्से के रूप में प्रदर्शित किया गया था। श्रृंखला इस प्रकार काम करती है: Finding A root के रूप में /root/.ssh बनाता है। Finding B, एक द्वितीयक राइट प्रिमिटिव, फिर उस डायरेक्टरी में हमलावर-नियंत्रित सामग्री लिख सकता है। साथ में वे हमलावर को हमलावर-चयनित पथ पर root के स्वामित्व वाली फाइल देते हैं। प्रत्येक बग अकेले सीमित है: Finding A केवल डायरेक्टरीज़ बनाता है, और Finding B केवल वहीं लिख सकता है जहां पैरेंट डायरेक्टरी पहले से मौजूद हो। Finding A वह पैरेंट डायरेक्टरी प्रदान करता है जिसकी Finding B को आवश्यकता होती है, और यह जोड़ी root फाइल राइट बन जाती है।
Finding B को इस शोध द्वारा स्वतंत्र रूप से पहचाना गया था, लेकिन यह एक नई खोज नहीं है: यह Deploy के extra data write पथ में ज्ञात, अभी भी अनपैच्ड कमजोरी है जिसे शोध पोस्ट-मॉर्टम में प्रलेखित किया गया है। इसलिए यह लेख Finding A को कवर करता है और इसका श्रेय दिया जाता है, और Finding B का उपयोग केवल उस ज्ञात, अनपैच्ड कंपोनेंट के रूप में करता है जिस पर श्रृंखला निर्भर करती है।
यह रिपॉजिटरी केवल Finding A को प्रदर्शित करती है। चेनिंग कार्यप्रणाली और रक्षात्मक सबक शोध पोस्ट-मॉर्टम में प्रलेखित हैं।
प्रोजेक्ट पहले से ही flatpak_is_valid_arch शिप करता है, जो आर्किटेक्चर नाम को [A-Za-z0-9_] तक सीमित करता है। उपचार यह है कि इसे हैंडलर बाउंड्री पर और पथ निर्माण हेल्पर्स के अंदर arch आर्ग्युमेंट पर कॉल किया जाए। एक ../ मान उस प्रेडिकेट को पास नहीं कर सकता। फिक्स्ड Flatpak रिलीज़ में अपडेट करें।
.
├── README.md This file.
├── requirements.txt System package prerequisites for the PoC.
└── poc_arch_traversal.sh PoC for the unvalidated arch parameter.
Sandboxed test mode by default, production
mode targets /root/.ssh. Educational use only.
requirements.txt पैकेज मौजूद हों।allow_active=yes पर निर्भर करता है। इससे जांचें:
loginctl list-sessions और पुष्टि करें कि आपका सेशन एक seat दिखाता है।/usr/libexec/flatpak-system-helper पर होती है; स्क्रिप्ट पहले Flatpak सोर्स ट्री के builddir/ या _build/ में नवनिर्मित हेल्पर खोजती है, और FLATPAK_SYSTEM_HELPER सब कुछ ओवरराइड करता है।
आवश्यक सिस्टम पैकेजों के लिए requirements.txt देखें।प्रोडक्शन मोड सिस्टम इंस्टॉलेशन पर मौजूद OCI रिमोट को ऑटो-डिटेक्ट करता है और उसका उपयोग करता है। कोई भी OCI रिमोट काम करता है, यहां तक कि एक नकली या अगम्य भी, क्योंकि mkdir रजिस्ट्री से संपर्क होने से पहले होता है। यदि कोई OCI रिमोट मौजूद नहीं है, तो स्क्रिप्ट "No OCI remote found" संदेश के साथ रद्द हो जाती है और कुछ नहीं भेजती।
Fedora Workstation पहले से ही OCI fedora रिमोट शिप करता है, इसलिए वहां कुछ करने की आवश्यकता नहीं है। flatpak remotes --system से जांचें कि क्या मौजूद है (एक OCI रिमोट अपने options कॉलम में oci दिखाता है)।
यह पूरे फ्लो में एकमात्र कमांड है जिसे sudo की आवश्यकता होती है, और स्क्रिप्ट इसे आपके लिए कभी नहीं चलाती। इसके साथ एक जोड़ें:
sudo flatpak remote-add --system --no-gpg-verify oci-poc oci+http://127.0.0.1:19876
(flatpak में कोई --oci फ्लैग नहीं है, कम से कम 1.19.0 तक, जिस संस्करण पर यह कार्य आधारित है; oci+ URL प्रीफिक्स ही रिमोट को OCI रजिस्ट्री बनाता है।) जब कोई रजिस्ट्री नहीं चल रही हो तो "Warning: Could not update extra metadata" संदेश अपेक्षित है; रिमोट फिर भी जोड़ा जाता है।
bash poc_arch_traversal.sh
स्क्रिप्ट एक निजी D-Bus बस और --session मोड में एक हेल्पर शुरू करती है, सब एक अस्थायी डायरेक्टरी के अंतर्गत। यह पेलोड ../../../../../root/.ssh के साथ DeployAppstream को कॉल करती है और सत्यापित करती है कि एस्केप्ड डायरेक्टरी <workdir>/root/.ssh पर बनाई गई थी, जो वास्तविक लक्ष्य को प्रतिबिंबित करती है। आउटपुट के बीच में एक D-Bus त्रुटि की अपेक्षा करें: यह डायरेक्टरी पहले से बन जाने के बाद OCI इंडेक्स फ़ेच विफल हो रहा है, और यह अपेक्षित व्यवहार है।
bash poc_arch_traversal.sh prod
स्क्रिप्ट कभी पासवर्ड नहीं मांगती। यह एक OCI रिमोट को ऑटो-डिटेक्ट करती है, ट्रैवर्सल पेलोड के साथ अनधिकृत रूप से DeployAppstream को ट्रिगर करती है, और हेल्पर की प्रतिक्रिया प्रिंट करती है। root हेल्पर /root/.ssh बनाता है और फिर अगम्य रजिस्ट्री पर विफल हो जाता है, जो अपेक्षित D-Bus त्रुटि प्रिंट करता है। यदि प्रतिक्रिया इसके बजाय एक ऑथेंटिकेशन त्रुटि है, तो आप एक सक्रिय लोकल सेशन में नहीं हैं; इसे मशीन के कंसोल से चलाएं। एक विशिष्ट रिमोट को bash poc_arch_traversal.sh prod <remote> के साथ बाध्य किया जा सकता है।
ट्रिगर स्वयं अनविशेषाधिकारित रूप से चलता है, लेकिन परिणाम की पुष्टि के लिए root की आवश्यकता होती है, इसलिए स्क्रिप्ट इसे आपके लिए छोड़ देती है। रन के बाद, उसी मशीन पर:
sudo ls -laR /root/.ssh
sudo stat -c '%U:%G' /root/.ssh
डायरेक्टरी मौजूद होनी चाहिए और root:root के स्वामित्व में होनी चाहिए। स्क्रिप्ट आउटपुट में D-Bus त्रुटि एक विफलता नहीं है: यह साबित करती है कि mkdir फ़ेच से पहले चला, क्योंकि एस्केप्ड डायरेक्टरी मौजूद है भले ही मेथड कॉल विफल हो गया।
यदि /root/.ssh रन से पहले पहले से मौजूद था (उदाहरण के लिए sshd चल रहे होस्ट पर), तो रन उस पथ पर एक नो-ऑप है और पीछे कुछ नहीं छोड़ता: हेल्पर की lock फाइल क्षणिक होती है और मेथड लौटने पर हटा दी जाती है, और icons केवल सफल इंडेक्स फ़ेच के बाद लिखी जाती है। साफ सत्यापन के लिए, उस पथ के विरुद्ध चलाएं जो अभी तक मौजूद नहीं है।
sudo rm -rf /root/.ssh # only if it did not exist before the run
sudo flatpak remote-delete --system oci-poc
शोध और लेखन Yehia Ali Mohamed Ezzat द्वारा।
इस रिपॉजिटरी में दस्तावेज़ीकरण और कोड शैक्षिक उद्देश्यों के लिए प्रदान किए गए हैं। अपने जोखिम पर और केवल वहीं उपयोग करें जहां आप अधिकृत हैं।