CVE-2026-32746 : Faille critique dans telnetd — RCE root sans authentification (CVSS 9.8)

Une faille critique (CVSS 9.8) dans GNU InetUtils telnetd permet à un attaquant non authentifié d'exécuter du code en root via le port 23. Guide complet : vérification, mitigation et durcissement.

CVE-2026-32746 : Faille critique dans telnetd — RCE root sans authentification (CVSS 9.8)

En mars 2026, une vulnérabilité critique a été découverte dans GNU InetUtils telnetd, le démon Telnet inclus dans l'utilitaire réseau GNU InetUtils. Référencée sous l'identifiant CVE-2026-32746 et notée CVSS 9.8 (Critique), cette faille permet à un attaquant non authentifié d'exécuter du code arbitraire avec les privilèges root à distance, sans aucune interaction de la victime. Le vecteur d'attaque est le réseau, la complexité est faible, et aucune authentification préalable n'est nécessaire — ce qui en fait l'une des failles les plus dangereuses de l'année.

Dans un contexte où Telnet est souvent considéré comme un protocole obsolète mais reste encore présent sur de nombreux systèmes legacy, équipements embarqués et appliances réseau, cette vulnérabilité rappelle violemment que l'exposition du port 23 en 2026 reste une faute grave. Ce guide vous accompagne pas à pas : compréhension technique, vérification de l'exposition, et mesures de remédiation immédiate.

Détails techniques : buffer overflow dans le handler BSS LINEMODE SLC

La vulnérabilité réside dans le gestionnaire du sous-protocole LINEMODE SLC (Set Local Characters) du démon telnetd, tel qu'implémenté dans GNU InetUtils versions ≤ 2.7. Lors d'une négociation LINEMODE, le client Telnet envoie une option SLC (IAC SB LINEMODE SLC ...) qui contient une liste de caractères de contrôle locaux encodés.

Le problème se situe dans la copie des données SLC reçues vers un buffer statique en segment BSS (Block Started by Symbol — zone mémoire des variables statiques non initialisées). La fonction slc_add_reply() copie les triplets SLC sans vérifier la taille totale accumulée, permettant un dépassement du buffer statique alloué en BSS :

# Extrait simplifié du code vulnérable (telnetd/slc.c, InetUtils <= 2.7)
# static unsigned char slc_buf[SLC_BUFSIZ];  /* buffer BSS fixe */
# static unsigned char *slc_end;
#
# void slc_add_reply(unsigned char func, unsigned char flags, cc_t value)
# {
#     /* Aucune vérification de slc_end < slc_buf + SLC_BUFSIZ */
#     *slc_end++ = IAC;
#     *slc_end++ = func;
#     *slc_end++ = (unsigned char)value;
# }

Un attaquant envoie une séquence IAC SB LINEMODE SLC malformée avec un nombre excessif de triplets SLC. Chaque triplet (3 octets) est ajouté dans slc_buf sans vérification de limite. Le débordement écrase des variables statiques adjacentes en BSS, permettant le contrôle du flux d'exécution.

Pourquoi c'est exploitable en pre-auth

La négociation LINEMODE se produit avant toute authentification : c'est une phase de négociation des options Telnet (RFC 1116, RFC 1184) qui intervient immédiatement après l'établissement de la connexion TCP. L'attaquant n'a donc besoin que d'un accès TCP au port 23 — aucun identifiant n'est requis.

De plus, telnetd s'exécute traditionnellement avec les privilèges root (nécessaire pour appeler login(1) et allouer des pseudo-terminaux). Le code arbitraire injecté s'exécute donc immédiatement en root. Le score CVSS 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) reflète exactement ce scénario.

Systèmes affectés

Sont vulnérables tous les systèmes exposant un démon telnetd issu de GNU InetUtils ≤ 2.7 :

  • GNU/Linux : Debian, Ubuntu, CentOS/RHEL, Fedora, openSUSE avec le paquet telnetd ou inetutils-telnetd non patché
  • Équipements réseau legacy : routeurs, switches, appliances avec firmware embarquant GNU InetUtils
  • Systèmes embarqués : IoT, systèmes industriels (SCADA/ICS) utilisant InetUtils pour leur interface de gestion
  • Conteneurs et images Docker basées sur des distributions avec telnetd activé

Non affectés : les implémentations alternatives comme netkit-telnetd, BSD telnetd, ou BusyBox telnetd (failles distinctes, code différent).

Vérifier si votre système est exposé

Commencez par vérifier si telnetd écoute sur le port 23 :

# Vérifier les ports en écoute avec ss (remplaçant moderne de netstat)
ss -tlnp | grep ':23'

# Avec netstat (si disponible)
netstat -tlnp | grep ':23'

# Vérifier le processus telnetd en cours d'exécution
ps aux | grep telnetd

# Vérifier si le service est actif (systemd)
systemctl is-active telnet.socket 2>/dev/null || systemctl is-active telnetd 2>/dev/null

# Vérifier si inetd/xinetd gère telnet
grep -r "telnet" /etc/inetd.conf /etc/inetd.d/ /etc/xinetd.d/ 2>/dev/null

Pour identifier la version exacte d'InetUtils installée :

# Debian/Ubuntu
dpkg -l | grep -E 'inetutils|telnetd'
dpkg -s inetutils-telnetd 2>/dev/null | grep Version

# RHEL/CentOS/Fedora
rpm -qa | grep -E 'telnet|inetutils'
rpm -qi telnet-server 2>/dev/null | grep Version

# Vérifier la version du binaire directement
telnetd --version 2>/dev/null || /usr/sbin/telnetd --version 2>/dev/null
strings /usr/sbin/telnetd | grep -i "inetutils\|version" | head -5

Depuis un hôte externe, utilisez nmap pour détecter le service :

# Scan basique du port 23
nmap -sV -p 23 

# Scan avec détection de version et scripts NSE
nmap -sV -sC -p 23 

# Scan réseau entier pour détecter les hôtes avec port 23 ouvert
nmap -p 23 --open 192.168.1.0/24

# Scan furtif SYN
nmap -sS -p 23 --open 10.0.0.0/8

Protection et remédiation immédiate

1. Désactiver telnetd (systemd)

Sur les systèmes modernes utilisant systemd, telnetd peut être géré via un socket unit :

# Arrêter et désactiver le socket telnet
sudo systemctl stop telnet.socket
sudo systemctl disable telnet.socket

# Arrêter le service telnetd si déclaré directement
sudo systemctl stop telnetd
sudo systemctl disable telnetd

# Vérifier qu'il ne redémarrera pas
sudo systemctl mask telnet.socket telnetd

# Confirmer l'arrêt
systemctl status telnet.socket telnetd 2>/dev/null

2. Désactiver telnetd via inetd/xinetd

Sur les systèmes plus anciens utilisant inetd ou xinetd :

# Avec inetd — commenter la ligne telnet dans /etc/inetd.conf
sudo sed -i 's/^\(telnet.*\)/#\1/' /etc/inetd.conf
sudo systemctl restart inetd

# Avec xinetd — désactiver le service
sudo bash -c 'echo "disable = yes" >> /etc/xinetd.d/telnet'
# Ou modifier directement :
sudo sed -i 's/disable\s*=\s*no/disable = yes/' /etc/xinetd.d/telnet
sudo systemctl restart xinetd

# Vérifier
sudo grep -i "disable" /etc/xinetd.d/telnet

3. Fermer le port 23 au niveau firewall

Même si vous avez désactivé telnetd, bloquez le port 23 au niveau réseau comme couche de défense supplémentaire :

# Avec firewalld (RHEL/CentOS/Fedora)
sudo firewall-cmd --permanent --remove-service=telnet
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="23" drop'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

# Avec ufw (Debian/Ubuntu)
sudo ufw deny 23/tcp
sudo ufw status verbose

# Avec iptables directement
sudo iptables -I INPUT -p tcp --dport 23 -j DROP
sudo iptables -I FORWARD -p tcp --dport 23 -j DROP
# Sauvegarder les règles
sudo iptables-save | sudo tee /etc/iptables/rules.v4

# Avec nftables
sudo nft add rule inet filter input tcp dport 23 drop

4. Désinstaller telnetd

La mesure la plus radicale et recommandée : supprimer complètement le paquet :

# Debian/Ubuntu
sudo apt-get remove --purge inetutils-telnetd telnetd
sudo apt-get autoremove

# RHEL/CentOS/Fedora
sudo dnf remove telnet-server
# ou
sudo yum remove telnet-server

# Vérifier la suppression
which telnetd 2>/dev/null && echo "ATTENTION: telnetd encore présent" || echo "OK: telnetd supprimé"

5. Migrer vers SSH

Telnet transmet les données (y compris les mots de passe) en clair. Migrez vers OpenSSH :

# Installer OpenSSH server
sudo apt-get install openssh-server   # Debian/Ubuntu
sudo dnf install openssh-server       # RHEL/Fedora

# Activer et démarrer SSH
sudo systemctl enable --now sshd

# Vérifier que SSH est bien en écoute
ss -tlnp | grep ':22'

# Appliquer un durcissement SSH minimal
sudo bash -c 'cat >> /etc/ssh/sshd_config << EOF

# Durcissement post-migration depuis Telnet
PermitRootLogin no
PasswordAuthentication yes
MaxAuthTries 3
Protocol 2
EOF'
sudo systemctl reload sshd

Vérification et audit post-remediation

Après avoir appliqué les mesures correctives, validez l'efficacité :

# 1. Vérifier que le port 23 n'est plus en écoute localement
ss -tlnp | grep ':23' && echo "ATTENTION: port 23 encore ouvert" || echo "OK: port 23 fermé"

# 2. Tester la connexion Telnet localement (doit échouer)
timeout 3 telnet 127.0.0.1 2>&1 | head -3

# 3. Scanner depuis un hôte externe (remplacer  par votre IP publique)
nmap -p 23  2>&1 | grep "23/tcp"
# Résultat attendu : "23/tcp  closed  telnet" ou "filtered"

# 4. Vérifier les règles firewall actives
sudo firewall-cmd --list-all 2>/dev/null || sudo ufw status 2>/dev/null || sudo iptables -L INPUT -n | grep "dpt:23"

# 5. Vérifier qu'aucun processus telnetd ne tourne
pgrep -x telnetd && echo "ALERTE: telnetd en cours d'exécution!" || echo "OK: aucun telnetd actif"

# 6. Audit des services réseau exposés (vue globale)
sudo ss -tlnp
sudo netstat -tlnp 2>/dev/null

Vérifier les logs pour des tentatives d'exploitation

Si votre système était exposé avant la remédiation, auditez les logs :

# Rechercher des connexions sur le port 23 dans les logs système
sudo grep -i "telnet\|port 23\|:23" /var/log/syslog /var/log/messages 2>/dev/null | tail -50

# Vérifier les connexions récentes avec journalctl
sudo journalctl -u telnet.socket --since "7 days ago" 2>/dev/null

# Analyser les connexions réseau historiques (si auditd actif)
sudo ausearch -p 23 2>/dev/null | tail -20

# Vérifier les connexions établies récemment
last | head -20
sudo lastb | head -20

Conclusion

La CVE-2026-32746 est un rappel brutal que Telnet n'a pas sa place dans une infrastructure moderne. Un buffer overflow pre-auth avec exécution de code root en réseau, noté CVSS 9.8, représente le scénario catastrophe absolu : accès total à un serveur sans aucune friction pour l'attaquant.

Les actions prioritaires sont claires :

  • Immédiatement : désactiver et désinstaller telnetd, bloquer le port 23 au firewall
  • Court terme : auditer tous vos systèmes et équipements pour détecter toute exposition résiduelle
  • Moyen terme : migrer définitivement vers SSH pour toute administration à distance
  • Long terme : intégrer le blocage du port 23 dans votre baseline de sécurité et vos scans de conformité

Pour les systèmes ne pouvant pas être migrés immédiatement (legacy, embarqué), isolez-les derrière un pare-feu strict avec liste blanche d'IP, et surveillez activement toute connexion sur le port 23.

Ressources officielles :