发布时间:2026年1月22日
涉及组件:GNU Inetutils (telnetd)
漏洞类型:参数注入 (Argument Injection) / 认证绕过
危害等级:Critical (CVSS 3.1: 9.8)攻击复杂度:低 (Low)
1. 漏洞概述
北京时间 2026年1月21日,安全社区披露了一个位于GNU Inetutils的telnetd服务中的严重漏洞,编号为CVE-2026-24061。
该漏洞源于telnetd在处理客户端传递的环境变量时存在严重的**参数注入(Argument Injection)**缺陷。远程攻击者无需任何凭证,只需通过构造恶意的USER环境变量值(例如-f root),即可欺骗后端的login程序,绕过密码验证直接以 root 权限登录系统。
鉴于 Telnet 协议虽然古老但在某些遗留系统、嵌入式设备及内部网络中仍有使用,该漏洞的影响不容小觑。
2. 受影响范围
受影响软件:GNU Inetutils
受影响组件:
telnetd守护进程受影响版本:1.9.3 至 2.7
据悉,该漏洞代码最早引入于 2015 年,潜伏长达 10 年之久。
3. 技术原理分析
要理解这个漏洞,需要了解telnetd如何与系统的/bin/login程序交互。
3.1 背景:Telnet 环境变量传递
Telnet 协议支持一个名为RFC 1408 (Telnet Environment Option)的扩展,允许客户端向服务器传递环境变量(如USER,DISPLAY等)。正常情况下,这些变量用于设置用户的会话环境。
3.2 漏洞根源:不安全的execv调用
当telnetd接收到客户端的连接请求时,它会准备参数并调用login程序来处理认证。在受影响的版本中,telnetd将客户端传入的USER环境变量直接用于构建login的参数列表,而未进行充分的过滤或分隔符处理。
漏洞代码逻辑大致如下(伪代码):
C
// 漏洞逻辑示意 char *user = get_env_var("USER"); // 从客户端获取,攻击者可控 char *argv[] = { "login", "-h", host, "-p", user, NULL }; execv("/bin/login", argv);3.3 攻击向量:利用login的-f参数
大多数 Linux/Unix 系统的login程序支持一个特殊的参数:-f(force)。
功能:
-f username告诉login程序,用户已经通过了认证(Pre-authenticated),不需要再输入密码。正常场景:这通常由
rlogind或其他受信任的守护进程使用。
攻击流程:
攻击者使用修改过的 Telnet 客户端或脚本,发起连接。
在 Telnet 握手阶段,通过
ENVIRON选项发送恶意的环境变量:USER=-froot(或者-f root,取决于具体实现解析)。服务端
telnetd将其拼接进参数列表。最终执行的命令变为:
/bin/login -h <IP> -p -frootlogin程序解析参数,看到-froot,认为已认证为root用户。结果:攻击者直接获得 root Shell,无需输入任何密码。
4. 漏洞复现 (PoC 概念)
攻击者无需复杂的利用代码,只需控制 Telnet 协议交互即可。
利用脚本逻辑 (Python 伪代码):
Python
import socket # Telnet 协议常量 IAC = b'\xff' SB = b'\xfa' SE = b'\xf0' NEW_ENV_VAR = b'\x27' VAR = b'\x00' VALUE = b'\x01' USER = b'USER' # 连接目标 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("target-ip", 23)) # ... (省略常规握手) ... # 发送恶意环境变量 # 构造 payload: USER = "-froot" payload = IAC + SB + NEW_ENV_VAR + \ b'\x00' + \ # IS VAR + USER + \ # 变量名 USER VALUE + b'-froot' + \ # 变量值 -froot (注入点) IAC + SE s.send(payload) # 此时服务端 login 程序会直接放行,返回 root shell 提示符 print(s.recv(1024))5. 修复与缓解措施
5.1 官方补丁
GNU Inetutils 维护团队已发布紧急补丁(参考上游提交fd702c0和ccba9f7)。修复逻辑主要涉及对USER变量进行严格校验,禁止参数以-开头,或强制使用--分隔符防止参数注入。
5.2 缓解建议
立即停止使用 Telnet: 这是最彻底的方案。Telnet 是明文传输协议,本质上是不安全的。请全面迁移至SSH (OpenSSH)。
防火墙策略: 如果必须保留 Telnet,请严格限制 TCP 23 端口的访问权限,仅允许受信任的内网 IP 连接。
升级软件包: 各大 Linux 发行版(Ubuntu, Debian, RedHat 等)正在紧急推送
inetutils-telnetd的安全更新,请立即执行apt update && apt upgrade。
6. 总结
CVE-2026-24061 是一个经典的“参数注入”漏洞,它再次提醒我们:在处理外部输入并将其传递给系统命令(如exec系列函数)时,必须保持极度的谨慎。即使是像telnetd这样成熟且古老的软件,也会因为对遗留代码的疏忽而暴露出致命弱点。
对于运维人员而言,这也敲响了警钟:彻底淘汰过时协议(Legacy Protocols)刻不容缓。不要让 20 世纪的协议成为 2026 年网络防线的缺口。