CVE-2026-24061: Execução remota de código no Telnetd – análise técnica e prova de conceito

Escrito por  Diego Tellaroli

Em 20 de janeiro de 2026, foi identificada uma vulnerabilidade crítica de bypass de autenticação no serviço GNU telnetd, descoberta por Kyu Neushwaistein (Carlos Cortes Alvarez). A falha foi catalogada sob o identificador CVE-2026-24061.

A vulnerabilidade permite que um usuário não autenticado contorne os mecanismos de autenticação do serviço, obtendo acesso direto como usuário root. Como consequência, um atacante remoto pode alcançar execução remota de código (RCE) com privilégios máximos no sistema. A vulnerabilidade recebeu uma pontuação CVSS v3.1 de 9.8 (Crítica) e está presente em todas as versões do GNU telnetd até a 2.7-2.

O GNU telnetd é o daemon responsável por implementar o protocolo Telnet em sistemas Unix-like, permitindo o acesso remoto a um sistema por meio de uma interface de linha de comando. Ele faz parte do pacote GNU Inetutils e atua escutando conexões na porta TCP 23. O protocolo Telnet é um protocolo de rede utilizado para acesso remoto a sistemas por meio de uma interface de linha de comando, permitindo que um usuário se conecte a um host remoto para executar comandos como se estivesse localmente presente.

Ao realizar uma consulta pelo termo “telnet” no Shodan, um motor de busca voltado para dispositivos e serviços expostos à internet, foram identificados mais de 200 mil servidores executando serviços Telnet acessíveis publicamente na internet. Apenas no Brasil foram identificados mais de 16 mil servidores com o serviço exposto.

A seguir, um exemplo de uma conexão Telnet simples, utilizando o binário telnet, no qual é possível se conectar a um host executando o serviço GNU telnetd, realizar a autenticação e, em seguida, obter uma shell interativa no sistema remoto.

O Telnet não implementa criptografia em sua comunicação; dessa forma, todo o tráfego pode ser facilmente interceptado e visualizado em texto puro. Isso inclui as credenciais de acesso, os comandos executados na shell e também as respostas retornadas pelo sistema remoto.

CVE-2026-24061

Para realizar a análise da vulnerabilidade, foi analisado o commit fa3245ac8c, realizado em 2015, no qual a falha foi introduzida no código-fonte. Ao analisar o arquivo telnetd/telnetd.c, é possível visualizar as mudanças realizadas na linha 62, aonde foi inserido o valor “%U” concatenado com a string “PATH_LOGIN”.

Ao analisar o arquivo paths, observa-se que a string “PATH_LOGIN” referencia diretamente o caminho do utilitário login do Linux. Esse utilitário é responsável por iniciar sessões de usuário no sistema, realizando a validação das credenciais fornecidas e estabelecendo o ambiente de execução após a autenticação bem-sucedida.

Dessa forma, foi identificado que, na linha 62, a string “PATH_LOGIN”, que referencia o caminho do utilitário login no Linux, é concatenada com diversos parâmetros, formando uma string que simula um comando de linha de comando, a qual é utilizada para executar diretamente o binário “/usr/bin/login” com argumentos específicos.

No mesmo commit, é possível visualizar outra alteração no código no arquivo telnetd/utility.c, na linha 1700. Nessa modificação, foi adicionado um novo case ao switch responsável pelo processamento de parâmetros, introduzindo o identificador ‘U’.

Esse novo case define que, ao encontrar o caractere “U”, o código irá obter o valor da variável de ambiente “USER” por meio da função getenv(). Caso essa variável esteja definida, seu conteúdo é retornado. Caso contrário, uma string vazia é utilizada.

Ao receber uma conexão Telnet, o serviço precisa identificar quem está tentando acessar o sistema antes de permitir qualquer interação. Para isto, o telnetd utiliza o utilitário “/usr/bin/login”, um componente nativo do Linux encarregado de realizar a verificação das credenciais. Após a autenticação bem-sucedida, esse utilitário estabelece o ambiente do usuário e inicializa uma shell interativa com o client, possibilitando a execução de comandos no sistema remoto. Para invocar o utilitário login, o telnetd utiliza a string “login_invocation”, que define os parâmetros da execução, realizando a chamada direta do binário “/usr/bin/login” por meio da função execv().

Na linha 129, a função “expand_line” é utilizada para processar a string “login_invocation”, que contém o template do comando usado para executar o “/usr/bin/login” com os parâmetros passados. Essa função é responsável por expandir os placeholders presentes na string (como %h, %u, %U, etc.), substituindo-os por seus respectivos valores em tempo de execução. O resultado dessa expansão é uma string final de comando, armazenada na variável “cmd”, pronta para ser convertida em argumentos e executada. Na linha 132 é realizado a conversão da string do comando em uma lista de argumentos (argv e argc), preparando-a para ser executada pelo execv(). Finalmente, na linha 133, ocorre a execução efetiva do comando previamente construído.

Abaixo é demonstrada a forma como a string “login_invocation” é construída. Na linha 60, observa-se o trecho de código responsável por concatenar o valor da variável de ambiente “USER” (%U) à string que será executada, sem qualquer tipo de sanitização.

Dessa forma, torna-se evidente o seguinte fluxo de execução:

  • Para realizar o processo de autenticação, o telnetd utiliza o binário “/usr/bin/login”.
  • A construção do comando a ser executado ocorre por meio da string “login_invocation”, definida no arquivo telnetd/telnetd.c, que contém o caminho do utilitário login, na string “LOGIN_PATH”, os parâmetros necessários para a autenticação e a inserção dinâmica do valor associado a %U, para ser utilizado em conjunto com o utilitário login.
  • Caso a variável de ambiente “USER” esteja definida, seu valor é inserido no placeholder %U durante a expansão da string.
  • Após a criação e expansão da string “login_invocation”, o comando é executado no sistema dentro da função “start_login”, no arquivo telnetd/pty.c, invocando o utilitário login para dar continuidade ao fluxo de autenticação do Telnet.

Desta forma, abaixo está um pseudocódigo que será executado dentro da função “start_login”. A variável CMD recebe o comando com o caminho “/usr/bin/login”, seus devidos parâmetros e o parâmetro da variável de ambiente “USER” inserido.

Como é possível manipular um dos parâmetros repassados ao “/usr/bin/login”, é possível verificar se esse utilitário possui opções que possam ser exploradas nesse contexto. Para isso, ao executar o comando /usr/bin/login --help, é possível visualizar as opções e parâmetros suportados. Um dos parâmetros identificados foi o “-f”, que instrui o utilitário login a ignorar o processo de autenticação por senha e a assumir que o usuário já foi previamente autenticado, iniciando diretamente a sessão informada.

Dessa forma, ao manipular o valor da variável de ambiente “USER” para que contenha o valor “-f root”, é possível provocar um argument injection no momento em que o telnetd invoca o binário “/usr/bin/login”. Com isso, o parâmetro “-f root” é repassado ao utilitário login, fazendo com que o processo ignore completamente o fluxo de autenticação e inicie diretamente uma sessão como root. Esse comportamento resulta na abertura de uma shell com privilégios máximos, uma vez que o serviço telnetd é executado em um contexto privilegiado.

Para explorar a vulnerabilidade, podemos então chamar o client do telnet passando a variável de ambiente “USER” com “-f root”, a fim de ignorar a autenticação.

USER="-f root" telnet -a 127.0.0.1

Dessa forma, é possível contornar o mecanismo de autenticação do telnetd nas versões vulneráveis, resultando na obtenção de uma shell interativa com privilégios de root.

Correção

A vulnerabilidade foi corrigida no commit ccba9f748a por meio da implementação de uma validação baseada em regex que restringe os caracteres permitidos na entrada do usuário. A correção bloqueia valores iniciados por “-“ e entradas contendo caracteres especiais, reduzindo o risco de injeção de comandos ou de argumentos durante a construção da linha de execução.

A função foi implementada no arquivo “telnetd/utility.c” na linha 1687 e está sendo chamada durante a construção dos argumentos utilizados na invocação do utilitário login, especificamente ao sanitizar o valor obtido da variável de ambiente “USER”.

Desta forma, a entrada proveniente da variável de ambiente é validada antes de ser utilizada na composição da linha de comando, impedindo que um atacante consiga fazer uma injeção de argumentos no utilitário login, uma vez que a função “sanitize” está filtrando caracteres especiais.

Conclusão

A exploração dessa vulnerabilidade permite que um atacante remoto não autenticado obtenha, de forma relativamente simples, execução remota de código (RCE) em servidores que estejam executando versões vulneráveis do GNU telnetd (até a 2.7-2).

Levantamentos realizados indicam a existência de mais de 200 mil servidores expostos à internet executando o serviço Telnet, o que amplia significativamente a superfície de ataque. Devido à baixa complexidade de exploração, essa vulnerabilidade pode ser facilmente automatizada, viabilizando campanhas em larga escala por parte de atacantes.

Como medida de mitigação, recomenda-se a atualização imediata do GNU telnetd, por meio da instalação de uma versão corrigida do GNU Inetutils (posterior à 2.7). Além disso, é fortemente aconselhável não expor serviços Telnet diretamente à internet, restringindo seu acesso a redes internas ou desabilitando-o sempre que possível. Sempre que houver necessidade de acesso remoto, o uso do Telnet deve ser substituído por protocolos modernos e seguros, como o SSH, que oferecem comunicação criptografada e mecanismos de autenticação mais robustos.

Referências

Logo da Hakai.