- GNU Screen 보안 검토에서 Screen 5.0.0과 setuid-root 설치를 중심으로 로컬 권한 상승, TTY 하이재킹, 정보 노출, 시그널 전송 경쟁 조건, 명령 전송 크래시가 확인됨
- 가장 심각한 CVE-2025-23395는
logfile_reopen()이 사용자 제공 경로를 root 권한으로 처리해, 임의 위치에 root 소유 파일을 만들거나 기존 파일에 로그를 덧붙일 수 있게 함 - 멀티유저 모드의 오래된 동작도 문제로 드러났으며,
Attach()가 TTY를 일시적으로 0666으로 바꾸면서 다른 사용자의 읽기·쓰기와 입력 주입 가능성이 생김 - 배포판별 위험은 설치 방식에 따라 갈리며, Arch Linux와 NetBSD 10.1은 Screen 5.0.0을 setuid-root로 제공해 주요 취약점 영향을 크게 받음
- 현재 권고는 Screen을 setuid-root로 설치하지 않는 것이며, 멀티유저 기능은 신뢰 그룹 기반 opt-in과 기본 권한 강등, 제한적 권한 상승, 환경 변수 정리가 필요함
공개 배경과 패치
- 2024년 7월 upstream Screen 관리자가 현재 코드베이스 검토를 요청했고, 실제 보안 검토는 2025년 1월 시작됨
- 검토 결과 Screen 5.0.0 주요 업데이트에서 setuid-root 배포판에 영향을 주는 로컬 root 익스플로잇이 발견됨
- 추가로 더 낮은 심각도의 문제들이 확인됐으며, 일부는 다수 배포판에 남아 있는 Screen 4.9.1 및 이전 버전에도 영향을 줌
- 문제들은 2025년 4월 30일 distros 메일링 리스트에 공유됐고, 2025년 5월 12일 공개됨
- 보고에는 버전별 패치 묶음이 첨부됨
Screen 구성과 멀티유저 모드
- Screen 5.0.0은 2024년 8월 upstream에서 주요 릴리스로 공개됐고, Arch Linux, Fedora 42, NetBSD 10.1이 이 버전을 제공함
- 다수 Linux 및 UNIX 배포판은 작성 시점에 여전히 Screen 4.9.1을 사용함
- Screen의 멀티유저 모드는 적절한 자격 증명이 있을 때 다른 사용자가 소유한 Screen 세션에 attach할 수 있게 함
- 이 기능은 Screen이 setuid-root 비트로 설치된 경우에만 사용 가능함
- 복잡한 Screen 코드가 root 권한으로 실행되므로 공격 표면이 커짐
- 검토 대상 시스템 중 Arch Linux, FreeBSD, NetBSD는 Screen을 setuid-root로 설치함
- Gentoo Linux는
"multiuser"USE 플래그가 설정되면 setuid-root 비트가 적용됨 - 일부 배포판은 setuid 대신 setgid를 사용함
- Gentoo Linux 기본값은 setgid-utmp로, Screen이 시스템 전체
utmp데이터베이스에 로그인 기록을 만들 수 있음 - Fedora Linux는 setgid-screen으로, Screen이
/run/screen의 시스템 전체 디렉터리에 소켓을 둘 수 있음
- Gentoo Linux 기본값은 setgid-utmp로, Screen이 시스템 전체
CVE-2025-23395: logfile_reopen() 로컬 root 익스플로잇
- CVE-2025-23395는 Screen 5.0.0이 setuid-root 권한으로 실행될 때 영향을 줌
logfile_reopen()함수가 사용자 제공 경로를 처리하면서 권한을 강등하지 않음- 비권한 사용자는 임의 위치에 다음 속성의 파일을 만들 수 있음
- 소유자:
root - 그룹: 호출 사용자의 실제 그룹
- 파일 모드:
0644
- 소유자:
- 이미 존재하는 파일도 악용 가능함
- Screen PTY에 쓰인 데이터가 해당 파일에 append됨
- 기존 파일의 모드와 소유권은 변경되지 않음
- Screen은 로그 파일을 처음 열 때는 권한을 올바르게 강등하지만, 로그 파일을 다시 열어야 한다고 판단하는 순간 권한 상승 가능성이 생김
stolen_logfile()검사에서 원래 로그 파일의 link count가 0이 되거나 크기가 예기치 않게 변하면logfile_reopen()이 호출됨- 이 조건은 비권한 사용자가 의도적으로 유발할 수 있음
- Screen 5.0.0용 patch 0001은 로그 파일 reopen 과정에서 안전한 파일 처리를 다시 도입함
- 이 문제는 오래된 commit
441bca708bd에서lf_secreopen()이 제거되며 생겼고, 해당 변경이 5.0.0 릴리스에 포함됨
CVE-2025-46802: 멀티유저 세션 attach 중 TTY 하이재킹
- CVE-2025-46802는
multiattach플래그가 설정된Attach()함수에서 발생함 - Screen은 멀티유저 세션 attach 시 현재 TTY에 대해
chmod()로 모드를 0666으로 변경함 - TTY 경로는
/dev아래인지와isatty()조건 등으로 검증되므로, 이 동작만으로 별도 로컬 root 익스플로잇이 되지는 않음 - 문제는 TTY 권한이 일시적으로 완화되는 동안 다른 사용자가 해당 TTY를 읽고 쓸 수 있는 경쟁 조건이 생긴다는 점임
- Linux
inotifyAPI 기반 간단한 테스트에서는 Python 스크립트가 매 두세 번 시도마다 영향을 받는 TTY를 열 수 있었음 - 공격자는 다음을 할 수 있음
- TTY에 입력되는 데이터를 가로챔
- TTY에 데이터를 주입함
- 사용자가 비밀번호를 입력하도록 오도함
- 제어 시퀀스를 주입해 피해자를 혼란스럽게 하거나 관련 터미널 에뮬레이터 문제를 노림
Attach()의 일부 return 경로에서는 원래 TTY 모드가 복원되지 않음- 예: 대상 세션을 찾지 못했고
"quiet"인자가 설정된 경우
- 예: 대상 세션을 찾지 못했고
- 패치는 임시
chmod()를 제거함- Screen 4.9.1용 patch 0001
- Screen 5.0.0용 patch 0004
- 공개 직전 이 패치가 일부 reattach 사용 사례를 깨뜨릴 가능성이 확인됐지만, 해당 사용 사례는 Screen 4.9.1에서도 이미 깨져 있던 것으로 확인됨
- 이 문제는 최소 2005년 이후 Screen 버전에 존재했으며, setuid-root로 멀티유저 지원을 제공하는 Linux 배포판과 BSD에 영향을 줌
- setuid-root가 아닌 경우에도 사용자가 자기 TTY의 모드를 바꿀 권한은 있으므로 이론적으로 영향을 받지만, Screen은 다른 사용자의 세션에 root 권한 없이 계속 진행하지 않음
CVE-2025-46803: Screen 5.0.0의 world-writable PTY 기본값
- CVE-2025-46803은 Screen 5.0.0에서 Screen이 할당하는 PTY 기본 모드가 0620에서 0622로 바뀐 문제임
- 이 기본값에서는 시스템 내 누구나 Screen PTY에 쓸 수 있음
- 보안상 CVE-2025-46802와 유사한 문제가 생기지만, 정보 유출 측면은 제외됨
- Screen 4.9.1에서는 코드 레벨 기본값이 0622였지만 autotools 구성의 기본값 0620이 적용되어 안전한 기본값이 사용됨
- Screen 5.0.0에서는
configure.ac가 다시 작성되며 autoconf 레벨의 0620 기본값이 사라졌고, 이후pty-modeconfigure 스위치가 기본 0622로 재도입됨 - 5.0.0 릴리스 노트는 확인되지 않았고 ChangeLog 일부 항목만 있었으며, PTY 모드 기본값 변경은 의도적 결정으로 보이지 않음
- Screen 5.0.0용 patch 0002는
configure.ac에서 안전한 기본 PTY 모드를 복원함- 변경을 적용하려면
autoreconf실행이 필요함
- 변경을 적용하려면
- 패키저에게는
--with-pty-mode=0620configure 스위치를 명시적으로 전달할 것이 권고됨 - Gentoo Linux와 Fedora Linux는 안전한
--with-pty-mode를 명시적으로 전달함 - Arch Linux와 NetBSD는 해당 스위치를 전달하지 않아 새 기본값이 적용되고 취약함
CVE-2025-46804: 소켓 경로 오류 메시지를 통한 파일 존재 여부 노출
- CVE-2025-46804는 Screen이 setuid-root 권한으로 실행될 때 발생하는 경미한 정보 유출임
- older Screen 버전과 5.0.0 모두에서 확인됨
- Screen은
SocketPath를 root 권한으로 검사하고, 비권한 사용자가 일반적으로 알 수 없는 경로 정보를 오류 메시지로 노출함 SCREENDIR환경 변수를 사용하면 다음 정보를 추론할 수 있음/root/.lesshst가 일반 파일인지/root/.cache디렉터리가 존재하는지/root/test경로가 존재하지 않는지
- 패치는 setuid-root 설치에서 대상 경로가 프로세스의 실제 UID에 의해 제어되지 않을 때 일반적인 오류 메시지만 출력하도록 바꿈
- Screen 4.9.1용 patch 0002
- Screen 5.0.0용 patch 0005
- 검토한 모든 배포판이 영향을 받음
CVE-2025-46805: 시그널 전송 TOCTOU 경쟁 조건
- CVE-2025-46805는 setuid-root 문맥에서 사용자 제공 PID에 시그널을 보낼 때 생기는 TOCTOU 경쟁 조건임
CheckPid()는 실제 사용자 ID로 권한을 낮춘 뒤 커널이 대상 PID에 시그널 전송을 허용하는지 검사함- 실제 시그널은 나중에
Kill()을 통해 보내지며, 이때 root 권한이 사용될 수 있음 - 검사와 실제 전송 사이에 이전에 검사한 PID가 다른 privileged process로 대체될 수 있음
- privileged Screen daemon 프로세스가 자기 자신에게 시그널을 보내도록 속일 가능성도 있음
- 현재는 SIGCONT와 SIGHUP만 보낼 수 있어 영향은 로컬 서비스 거부 또는 경미한 무결성 침해 영역일 가능성이 큼
- 이 문제는 CVE-2023-24626의 불완전한 수정에서 비롯됨
- 해당 수정 전에는 경쟁 조건 없이도 임의 프로세스에 해당 시그널을 보낼 수 있었음
- 패치는 실제 시그널도
CheckPid()처럼 실제 UID 권한으로 보내도록 바꿈- Screen 4.9.1용 patch 0003
- Screen 5.0.0용 patch 0006
- 검토한 모든 배포판이 영향을 받음
Screen 5.0.0의 strncpy() 사용으로 인한 명령 전송 크래시
- Screen 5.0.0에는 보안 이슈로 보지는 않지만 우선 수정해야 하는
strncpy()관련 문제가 있음 - commit
0dc67256에서 여러strcpy()호출이strncpy()로 교체됨 strncpy()는 안전한 문자열 처리를 위한 함수가 아니라 고정 길이 버퍼를 0으로 패딩하는 함수이므로, 첫\0바이트 뒤에도 대상 버퍼 끝까지 0을 씀attacher.c의 명령줄 인자 처리 루프에서 첫 반복 이후에도MAXPATHLEN을 목적지 크기로 전달함- 포인터
p가 이미 증가한 뒤에도 같은 크기를 넘기므로, 이후strncpy()호출은 버퍼 끝을 넘어\0바이트를 씀 - Arch Linux에서 실행 중인 Screen 세션에 둘 이상의 명령 인자를 보내면
_FORTIFY_SOURCE가 켜진 빌드에서 다음 오류가 관찰됨*** buffer overflow detected***: terminatedAborted (core dumped)
_FORTIFY_SOURCE가 없으면 가시적 오류가 없을 수 있고,-fsanitize=address에서도 오류가 보이지 않을 수 있음- 호출자는
cmd버퍼 뒤의MAXPATHLEN바이트를 0으로 덮을 수 있지만, 뒤에 같은 크기의writeback[MAXPATHLEN]버퍼가 있어 공격자에게 유리하게 악용할 가능성은 없을 것으로 판단됨 - Screen 5.0.0용 patch 0003은
strncpy()를snprintf()로 바꾸고 남은 대상 버퍼 크기를 정확히 전달함 - Screen 5.0.0을 제공하는 모든 배포판이 영향을 받음
배포판별 영향 범위
| 시스템 | Screen 버전 | 특수 권한 | 영향 |
|---|---|---|---|
| Arch Linux | 5.0.0 | setuid-root | 3.a, 3.b, 3.c, 3.d, 3.e, 3.f |
| Debian 12.10 | 4.9.0 | 없음 | 3.b 일부 |
| Ubuntu 24.04.2 | 4.9.1 | 없음 | 3.b 일부 |
| Fedora 42 | 5.0.0 | setgid-screen | 3.b 일부, 3.f |
| Gentoo | 4.9.1 | setgid-utmp, multiuser USE 플래그 설정 시 setuid-root | 3.b 일부 |
| openSUSE TW | 4.9.1 | 없음 | 3.b 일부 |
| FreeBSD 14.2 | 4.9.1 | setuid-root | 3.b, 3.d, 3.e |
| NetBSD 10.1 | 5.0.0 | setuid-root | 3.a, 3.b, 3.c, 3.d, 3.e, 3.f |
| OpenBSD 7.7 | 4.9.1 | 없음 | 3.b 일부 |
setuid-root 설계에 대한 우려와 권고
- Screen 멀티유저 모드에는 세 가지 UID가 관련됨
- privileged operation을 위한 effective UID 0
- 세션을 만든 사용자의 실제 UID
- 세션에 attach하는 사용자의 실제 UID
- 현재 Screen 코드는 이 구분을 적절히 반영하기 어려운 구조로 보임
root가 만든 Screen 멀티유저 세션은 세션 생성자의 실제 UID인 0으로 “권한 강등”하므로, 실질적으로 권한 강등이 일어나지 않음- Screen 5.0.0의 리팩터링 과정에서 오랫동안 존재하던 보안 로직이 깨졌고, 그 결과 CVE-2025-23395와 CVE-2025-46803이 발생함
- 추가 리팩터링 전에는 구현의 보안 속성을 검증할 수 있는 테스트 스위트가 필요함
- setuid-root 바이너리를 다루는 개발자는 해당 영역의 위험을 이해해야 함
- Screen은 상승 권한으로 계속 실행하다가 위험하다고 보는 작업에서만 선택적으로 권한을 낮춤
- 견고한 setuid-root 프로그램은 기본적으로 권한을 낮추고, 실제로 상승 권한이 필요한 작업에서만 권한을 올리는 방식이어야 함
- setuid-root 문맥에서는 명시적으로 허용된 환경 변수만 남기고 제거하는 로직이 필요함
PATH같은 환경 변수는 신뢰할 수 있는 시스템 디렉터리만 가리키도록 정리해야 함- 현재는 Screen 5.0.0뿐 아니라 이전 4.9 계열도 setuid-root로 설치하지 않는 것이 권고됨
- 대안으로 멀티유저 기능을 opt-in 방식으로 제공하고, 신뢰된 그룹 구성원만 멀티유저 버전 Screen을 실행하게 할 수 있음
공개 조율 과정과 upstream 상태
- 2025년 2월 Screen upstream에 비공개로 문제를 보고하고 조율 공개를 제안함
- upstream은 공개 전 버그 수정을 위해 문제를 비공개로 유지하는 데 관심을 보였고, 1~2개월이 필요하다고 전달함
- 약 한 달 뒤 upstream 측 활동과 패치 논의가 시작됐지만, 논의는 충분히 생산적이지 않았음
- 최대 90일 embargo 기간이 가까워진 시점까지 추가 소통이 없었고, 그 사이 NetBSD 같은 배포판이 Screen 5.0.0으로 업데이트되어 CVE-2025-23395에 완전히 영향받게 됨
- upstream이 Screen 코드베이스에 충분히 익숙하지 않고 보고된 보안 문제를 완전히 이해하지 못한다는 판단이 내려짐
- upstream은 일부 문제가 미해결인 상태에서 더 이른 공개를 원했고, 이에 따라 distros 메일링 리스트에 초안이 빠르게 전달됨
- 이후 SUSE 측이 누락된 수정 사항을 직접 개발하고, upstream에서 초안 형태로 논의된 패치도 조정 및 문서화함
- 전용 upstream 역량이 있었다면 조율 공개 절차는 약 2주 내 완료 가능했을 것으로 판단됨
- Screen upstream은 인력과 전문성 부족을 겪는 것으로 보이며, 널리 쓰이는 오픈소스 유틸리티라는 점에서 우려가 큼
주요 일정
- 2024-07-01: upstream의 검토 요청 전달
- 2025-01-08: 보안 검토 작업 시작
- 2025-02-07: Screen upstream에 비공개 보고 및 조율 공개 제안
- 2025-02-11: GNU Savannah 버그 트래커에 비공개 버그 생성
- 2025-04-30: CVE 할당 결정 및 distros 메일링 리스트에 초안 공유
- 2025-05-07: Screen 4.9.1 및 5.0.0용 패치 완성본을 distros 메일링 리스트와 upstream에 공유
- 2025-05-12: 보고서가 블로그와 oss-security 메일링 리스트에 공개됨