
BusyBox wget में CVE-2025-60876 HTTP हेडर इंजेक्शन के लिए व्यवहार-संरक्षण फिक्स, प्रूफ-ऑफ-कॉन्सेप्ट, प्रतिशत-एन्कोडिंग पैच, और अपस्ट्रीम सबमिशन आर्टिफैक्ट्स के साथ।
CVE-2025-60876 के लिए एक व्यवहार-संरक्षित फिक्स, जो BusyBox wget में एक HTTP हेडर-इंजेक्शन भेद्यता है, साथ ही proof-of-concept जो इसे प्रदर्शित करता है और फिक्स को अपस्ट्रीम BusyBox में जमा करने के लिए आर्टिफैक्ट्स।
BusyBox wget URL पथ और क्वेरी को HTTP अनुरोध लाइन में शब्दशः कॉपी करता है। एक URL जिसमें कच्चा CR (0x0D), LF (0x0A), या अन्य कंट्रोल बाइट होता है, अनुरोध लाइन को विभाजित कर सकता है और हमलावर-नियंत्रित हेडर इंजेक्ट कर सकता है। एक स्पेस (0x20) का भी यही प्रभाव होता है: यह METHOD SP request-target SP HTTP/1.1 फ्रेमिंग को तोड़ देता है।
प्रभावित: BusyBox 1.37.0 तक (हर समर्थित Alpine शाखा पर भेजा गया pkgver)। अगस्त 2025 में BusyBox मेलिंग सूची पर रिपोर्ट किया गया; CVE को CVE-2025-60876 (NVD CVSS 6.5, Medium) के रूप में निर्दिष्ट किया गया।
अपस्ट्रीम में पहले से दो पैच प्रस्तावित किए जा चुके हैं (Takeuchi Yuma, 2025-08; Radoslav Kolev, 2025-11)। दोनों ही आपत्तिजनक URL को अस्वीकार करते हैं और bb_error_msg_and_die को कॉल करते हैं। यह इंजेक्शन को रोकता है, लेकिन यह एक साधारण स्पेस को भी अस्वीकार करता है, इसलिए जैसा URL जो पहले काम करता था, अब त्रुटि देता है। यही रिग्रेशन कारण है कि फिक्स को डाउनस्ट्रीम में नहीं अपनाया गया है। Alpine अपना बैकपोर्ट इसी पर रोके हुए है ()।
http://example.org/foo barयह फिक्स पथ और होस्ट को अलग-अलग तरीके से संभालता है, जो GNU wget और curl के व्यवहार से मेल खाता है।
पथ: networking/wget.c में percent_encode_target() अनुरोध लाइन बनने से पहले request-target में कंट्रोल बाइट्स (0x00 से 0x1f), स्पेस (0x20), और DEL (0x7f) को percent-encode करता है:
http://example.org/foo bar को /foo%20bar के रूप में भेजा जाता है, जो GNU wget और curl से मेल खाता है। कोई रिग्रेशन नहीं।% को अपरिवर्तित छोड़ दिया जाता है, इसलिए पहले से एनकोड किया गया पथ दोबारा एनकोड नहीं होता।होस्ट: URL होस्ट में समान बाइट्स अस्वीकार कर दिए जाते हैं। एक होस्टनाम में वैध रूप से कंट्रोल वर्ण या स्पेस नहीं हो सकते, और authority घटक के लिए percent-encoding परिभाषित नहीं है। यह प्रॉक्सी मोड में मायने रखता है: होस्ट को absolute-form request-target (GET http://host/path) और Host: हेडर में रखा जाता है, लेकिन इसे स्थानीय रूप से रिज़ॉल्व नहीं किया जाता, इसलिए होस्ट में कच्चा CR या LF अन्यथा इंजेक्ट कर सकता है। GNU wget (CVE-2017-6508 के बाद से) और curl भी होस्ट में कंट्रोल वर्णों को अस्वीकार करते हैं।
यह बदलाव networking/wget.c तक सीमित है और एक हेल्पर जोड़ता है।
दायरे से बाहर: FTP कंट्रोल चैनल (ftpcmd target->path और यूज़र/पासवर्ड को कच्चा भेजता है, जो अपस्ट्रीम-स्वीकृत TODO है) एक अलग इंजेक्शन वर्ग है, CVE-2025-60876 का हिस्सा नहीं है, और यहाँ संबोधित नहीं किया गया है। इसे अलग से ट्रैक किया जाना चाहिए।
BusyBox 1.37.0 के विरुद्ध उसी कॉन्फिग के साथ बनाया गया जो Alpine उपयोग करता है (CONFIG_WERROR और CONFIG_TC बंद)। एक स्थानीय लिसनर उन सटीक बाइट्स को कैप्चर करता है जिन्हें wget वायर पर भेजता है।
| इनपुट URL | Vanilla 1.37.0 | पैच किया हुआ |
|---|---|---|
/x + CRLF + Evil: injected | Evil: injected एक वास्तविक हेडर के रूप में पहुँचता है (भेद्य) | GET /x%0D%0AEvil:%20injected HTTP/1.1, कोई इंजेक्टेड हेडर नहीं |
/foo bar | एक शाब्दिक स्पेस भेजता है | GET /foo%20bar HTTP/1.1 (कोई रिग्रेशन नहीं) |
/foo%20bar (पहले से एनकोडेड) | अपरिवर्तित | GET /foo%20bar HTTP/1.1 (%2520 नहीं) |
/normal | अपरिवर्तित | GET /normal HTTP/1.1 (अपरिवर्तित) |
प्रॉक्सी, host = h + CRLF + PInjected: 1 | PInjected: 1 एक वास्तविक हेडर के रूप में पहुँचता है (भेद्य) | bad character in URL host के साथ समाप्त हो जाता है, कुछ नहीं भेजा जाता |
प्रॉक्सी, host = example.test | सामान्य | GET http://example.test/p HTTP/1.1 (अपरिवर्तित) |
पूरा कैप्चर: test/poc-output.txt। सभी चार BusyBox testsuite/wget परीक्षण पैच किए गए बिल्ड के विरुद्ध उत्तीर्ण होते हैं (test/testsuite-output.txt); वहाँ नोट किए गए अन्य फुल-सूट विफलताएँ असंबंधित हैं (mount/taskset को root चाहिए, और कुछ ज्ञात restricted-container विषमताएँ)। aarch64 defconfig पर आकार प्रभाव +185 बाइट्स है (wget_main +142, .rodata +43, कोई symbol नहीं जोड़ा या हटाया गया), जिसे scripts/bloat-o-meter से मापा गया और cover-letter.txt में दर्ज किया गया।
| फ़ाइल | यह क्या है |
|---|---|
wget-cve-2025-60876.patch | फिक्स git format-patch के रूप में BusyBox networking/wget.c के विरुद्ध, भेजने के लिए तैयार |
commit-message.txt | कमिट संदेश (पैच हेडर भी) |
cover-letter.txt | [PATCH v3] मेलिंग-सूची कवर लेटर जो मौजूदा थ्रेड को पुनर्जीवित करता है |
apply_fix.py | जनरेटर जो networking/wget.c में बदलाव लागू करता है (पैच बनाने के लिए उपयोग किया जाता है) |
test/serve_once.py | सिंगल-कनेक्शन लिसनर जो कच्चे HTTP अनुरोध को प्रतिध्वनित करता है |
test/driver.sh | Vanilla और पैच किए गए BusyBox को बनाता है और direct + proxy before/after PoC चलाता है |
test/finalize.sh | पूर्ण रन: before/after PoC, bloat-o-meter, testsuite/wget, और पैच को पुनः जनरेट करता है |
test/poc-output.txt | कैप्चर किए गए before/after अनुरोध बाइट्स (direct और proxy) |
test/testsuite-output.txt | पैच किए गए बिल्ड के विरुद्ध BusyBox testsuite/wget परिणाम |
test/finalize.sh Docker के साथ alpine:edge कंटेनर के अंदर चलता है और सब कुछ पुनरुत्पादित करता है (PoC, आकार, testsuite, पैच):
docker run --rm -v "$PWD:/work" alpine:edge sh /work/test/finalize.sh
यह BusyBox 1.37.0 डाउनलोड करता है, इसे vanilla बनाता है (इंजेक्शन को सीधे और प्रॉक्सी के माध्यम से दिखाता है), फिक्स लागू करता है, पुनर्निर्माण करता है, ऊपर दिए गए अनुरोध मामलों को दोहराता है, bloat-o-meter और wget testsuite चलाता है, और पैच लिखता है। test/driver.sh एक हल्का PoC-केवल वैरिएंट है।
BusyBox एक मेलिंग-सूची परियोजना है। फिक्स git send-email के माध्यम से [email protected] पर जाता है, Radoslav Kolev के नवंबर 2025 थ्रेड पर [PATCH v3] उत्तर के रूप में, पिछले रिपोर्टरों और समीक्षकों को श्रेय देते हुए। cover-letter.txt देखें। फिक्स GPLv2 है, वही लाइसेंस जो BusyBox का है।