
Samba의 인증되지 않은 RCE 2건(CVE-2026-4408 및 CVE-2026-4480)과 TelnetD의 로컬 권한 상승(CVE-2026-28372)을 위한 개념 증명 스크립트
이 저장소에는 Black Hat USA 2026과 DEF CON 34에서 발표된 "잊혔지만 사라지지 않은: 레거시 Linux 서비스의 인증 없는 RCE 및 LPE" 프레젠테이션에서 소개된 취약점들에 대한 개념 증명(PoC) 스크립트가 포함되어 있습니다.
TelnetD의 로컬 권한 상승: 권한이 없는 공격자는 TelnetD의 환경 변수 기능을 악용하여 루트 권한 셸을 획득할 수 있습니다. 설계상, 그리고 해당 RFC에 따르면 Telnet 프로토콜은 클라이언트가 셸 세션에 대한 환경 변수를 설정할 수 있게 합니다. 이 기능은 보안 관점에서 제대로 설계되지 않았습니다. 이 서비스는 인증되지 않은 클라이언트가 telnetd 프로세스 자체와 그 모든 하위 프로세스에 대한 환경 변수를 설정하도록 허용했습니다. 그 하위 프로세스 중 하나는 /usr/bin/login입니다. 원격 telnet 클라이언트로서 환경 변수를 설정함으로써 "CREDENTIALS_DIRECTORY" 환경 변수와 함께 /usr/bin/login을 실행할 수 있었습니다. 이로 인해 login 프로세스는 "CREDENTIALS_DIRECTORY"가 지정한 디렉터리에서 "login.noauth"라는 파일을 검색하게 됩니다. 파일에 "yes" 문자열이 포함되어 있으면 login 프로세스는 인증을 건너뛰고 클라이언트가 지정한 사용자로 실행되는 셸을 클라이언트에게 제공합니다. 클라이언트가 지정한 사용자는 무엇이든 될 수 있으며 root도 가능합니다.
SAMR을 통한 Samba의 인증 없는 원격 코드 실행: Samba는 구성 파일(smb.conf)에 설정된 셸 명령을 사용하여 새 네트워크 공유 추가, 새 프린터 추가 등 클라이언트가 요청한 다양한 작업을 수행합니다. 이러한 셸 명령 중 일부는 클라이언트가 보낸 요청에 따라 매개변수를 전달받습니다. 대부분의 경우 명령을 실행하기 전에 셸 주입을 방지하기 위해 매개변수를 삭제하고 특수 문자를 이스케이프합니다.
취약점은 "check_password_complexity" 함수에 있으며, 이 함수는 클라이언트가 지정한 문자열을 삭제하지 않고 셸 명령으로 포맷합니다. 이 취약점이 발생하려면 두 가지 조건이 필요합니다:
samba의 RPC 데몬(samba-dcerpcd)을 NCACN_IP_TCP로 구성하려면 메인 samba 서비스의 일부가 아닌 별도의 시스템 서비스로 실행해야 합니다. 또한 구성 파일의 "rpc start on demand helpers" 옵션을 "no"로 설정해야 합니다.
SPOOLSS를 통한 Samba의 인증 없는 원격 코드 실행: generic_job_submit 함수도 클라이언트가 제어하는 문자열을 삭제하지 않고 셸 명령으로 포맷합니다. 다음 구성들의 조합으로 이 취약점이 발생합니다:
인증되지 않은 클라이언트는 spoolss RPC 인터페이스를 통해 프린터 공유에 대한 접근을 요청할 수 있습니다. 그런 다음 RpcStartDocPrinter 함수를 통해 인쇄 작업을 제출할 수 있습니다. 요청에 지정된 문서 이름은 명령의 "%J" 매개변수로 포맷되는 작업 이름으로 사용됩니다. hRpcEndDocPrinter를 호출하면 generic_job_submit이 트리거되어 작업 이름을 삭제 없이 포맷한 후 구성의 "print command"를 실행합니다. 익스플로잇이 보낸 코드는 "nobody" 사용자로 실행됩니다. 프린터 공유 섹션에 "valid users = @users" 구성이 추가되면 익스플로잇은 여전히 동작하지만 유효한 자격 증명이 필요합니다. 인증이 수행된 경우 익스플로잇이 보낸 코드는 "nobody"가 아닌 인증된 사용자로 실행됩니다.