
CVE-2026-24061 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो USER पर्यावरण चर में तर्क इंजेक्शन के माध्यम से telnetd प्रमाणीकरण बायपास है, जो बिना प्रमाणीकरण के रूट शेल एक्सेस की अनुमति देता है।
GNU InetUtils के telnetd में आर्गुमेंट इंजेक्शन। संस्करण 1.9.3 से 2.7। CVSS 9.8। CISA KEV में 26.01.2026 से, यानी खुलेआम शोषित किया जा रहा है।
पूरी तरकीब यह है कि telnetd क्लाइंट से NEW-ENVIRON (RFC 1572) के माध्यम से USER पर्यावरण चर का मान लेता है और उसे बिना किसी सत्यापन के सीधे login(1) कॉल में चिपका देता है। यदि क्लाइंट USER="-f root" भेजता है, तो telnetd निम्न चलाएगा:
/usr/bin/login -p -h <host> -f root
login में -f फ्लैग का अर्थ है "इस उपयोगकर्ता को बिना पासवर्ड के लॉगिन करें"। रूट शेल, शून्य प्रमाणीकरण।
telnetd/telnetd.c में login कॉल का टेम्पलेट है:
char *login_invocation = PATH_LOGIN " -p -h %h %?u{-f %u}{%U}";
%u telnet प्रमाणीकरण से उपयोगकर्ता है (विश्वसनीय)। %U क्लाइंट से env USER का कच्चा मान है (अविश्वसनीय)। जब प्रमाणीकरण सक्रिय नहीं होता है, तो %U का उपयोग किया जाता है।
चर विस्तार telnetd/utility.c में फ़ंक्शन _var_short_name में स्थित है:
case 'U':
return getenv("USER") ? xstrdup(getenv("USER")) : xstrdup("");
शून्य फ़िल्टरिंग। क्लाइंट USER में जो कुछ भी भेजता है वह सीधे login की कमांड लाइन में जाता है। केवल -f root ही काम नहीं करता, सैद्धांतिक रूप से कोई भी तर्क जो login स्वीकार करता है, इंजेक्ट किया जा सकता है।
बग 2015-03-19 (fa3245ac) के अपस्ट्रीम सुरक्षा-गार्ड कमिट में पेश किया गया था। विडंबना यह है कि इस कमिट का उद्देश्य USER चर की हैंडलिंग को सुधारना था। Debian के पास 2019 में इसके लिए पैच था (0028-telnetd-Scrub-USER-from-environment.patch), लेकिन Debian 10 में CVE-2020-10188 के फिक्स के दौरान पैच खो गया और बग वापस आ गया। इसलिए Debian 10+, Ubuntu और उनके व्युत्पन्न भी संवेदनशील हैं।
main.py एक न्यूनतम telnet क्लाइंट है जो:
IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SE के साथ उत्तर देता हैlogin -f root चलाता है, आपको शेल मिलता हैक्लाइंट सर्वर
|--- tcp connect ------------------->|
|<-- IAC DO NEW_ENVIRON -------------|
|--- IAC WILL NEW_ENVIRON ---------->|
|<-- IAC SB NEW_ENVIRON SEND --------|
|--- SB NEW_ENVIRON IS |
| VAR "USER" VALUE "-f root" |
| IAC SE ------------------------>|
| [telnetd: login -p -h x -f root]|
|<-- root@host:~# ------------------|
python3 main.py <host>
python3 main.py <host> -p <port>
Ctrl+C सत्र समाप्त करता है।
उन सिस्टमों पर यह प्रयास न करें जिनमें inetutils-telnetd नहीं है। netkit का telnetd पैकेज अलग कोड है, यह इस विशिष्ट बग के लिए संवेदनशील नहीं है। यदि आप कनेक्ट करते हैं और सामान्य login प्रॉम्प्ट मिलता है शेल के बजाय, तो या तो सर्वर पर पैच लगा हुआ है, या यह inetutils telnetd नहीं है।
पेलोड को -f <अन्य_उपयोगकर्ता> में न बदलें यह उम्मीद करते हुए कि यह हर सिस्टम पर काम करेगा। कुछ डिस्ट्रीब्यूशन के login(1) में -f पर अतिरिक्त प्रतिबंध हैं। मानक Debian/Ubuntu पर -f root बिना किसी समस्या के काम करता है।
| सॉफ्टवेयर | संस्करण |
|---|---|
| GNU InetUtils | 1.9.3 - 2.7 |
| Debian 10+ | inetutils-telnetd (पैच तक) |
| Debian 11 | 2:2.0-1+deb11u3 में ठीक किया गया |
| Ubuntu | inetutils-telnetd (पैच तक) |
आधिकारिक फिक्स एक sanitize() फ़ंक्शन जोड़ता है जो - से शुरू होने वाले या शेल मेटाकैरेक्टर वाले मानों को अस्वीकार करता है। केवल USER पर नहीं, विस्तार में सभी चरों पर लागू किया गया।
static char *
sanitize (const char *u)
{
if (u && *u != '-' && !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")])
return u;
else
return "";
}
fd702c0 - USER पैचccba9f7 - सभी चरों की सैनिटाइज़ेशन