telnetd 参数注入漏洞分析 CVE-2026-24061
之前看到了这个
【已复现】多款 Linux telnetd服务中招,仅需一个参数即可远程获取 Root 权限,GNU Inetutils telnetd 远程认证绕过漏洞(CVE-2026-24061)
然后在openwall找到了poc
oss-security - GNU InetUtils Security Advisory: remote authentication by-pass in telnetd

但是我在ubuntu24上面不知道怎么装telnetd,按照上面复现步骤,/etc/init.d/inetutils-inetd这个文件找不到,用busybox的telnetd复现失败,不知道是不是版本太新
接下来看看代码,在gnu官网上可以找到下载地址
Inetutils - Network utilities - GNU Project - Free Software Foundation
这个源代码一打开就能看到跟登录有关的像参数表一样的东西

这是何意味?结合telnetd的–help可以推测,这大概是/bin/login的参数

而我们的/bin/login是用来登录的,登录成功之后就会给你个shell

经常装ubuntu-server的大伙一定很熟悉,开着vnc装完系统之后就会跳出上面这行登录提示
这个/bin/login支持-f参数,发现这个-f是用来免密登录的


到这里漏洞大概是怎么回事已经心里有数了,但是细节还是要研究一下
查找login_invocation的使用位置,发现telnetd/pty.c里用到了,而且下面还有execv,估计这里就是sink点

顺着调用链一路回溯,发现调用顺序是这样的:telnetd/telnetd.c:209 main->telnetd/telnetd.c:321 telnetd_setup->telnetd/pty.c:39 startslave->telnetd/pty.c:110 start_login
跟着调用顺序一路看代码,发现telnetd_setup这里把USER环境变量删了,然后紧接着调用了getterminaltype

我没看太懂getterminaltype是干嘛用的,下面是一大堆宏,结合AI分析得知,这里是在向客户端发指令,然后等待客户端返回指令结果,其中也有获取环境变量的指令

ttloop就是等待结果的宏,这个宏循环调用io_drain

io_drain接收客户端返回的网络数据,把数据放到静态变量里,然后调用telrcv,这个telrcv根据备注所说,是一个自动机,应该是用来把接收到的数据解析,然后执行相应动作的函数

大伙也知道自动机算法通常都是很复杂的,这个telrcv我也没看懂,直接让ai看,ai找到了设置环境变量的位置是在suboption方法这里,这个suboption也是被telrcv调用的


getterminaltype返回之后,调用startslave

startslave把自己fork了,然后调用start_login

start_login调用expand_line之后执行了命令,看一下expand_line是什么东西

从上面注释可以看到是用来展开格式化串的,也就是一开始看到的那几行

直接搜索相关的标记,可以知道%?是条件表达式,如果用户没有指定user参数,则获取USER环境变量


到这里,攻击者构造的恶意参数就成功注入调用login的命令里面了,后面execv的时候就会直接跳过认证环节
