Nhiều vấn đề bảo mật được phát hiện trong GNU Screen
(openwall.com)- Đợt rà soát bảo mật GNU Screen đã xác nhận các vấn đề như leo thang đặc quyền cục bộ, chiếm quyền TTY, lộ thông tin, điều kiện tranh chấp khi gửi tín hiệu và crash khi gửi lệnh, tập trung vào Screen 5.0.0 và các bản cài đặt setuid-root
- Lỗ hổng nghiêm trọng nhất, CVE-2025-23395, nằm ở việc
logfile_reopen()xử lý đường dẫn do người dùng cung cấp với quyền root, cho phép tạo file thuộc sở hữu root ở vị trí tùy ý hoặc ghi nối log vào file hiện có - Hành vi cũ của chế độ nhiều người dùng cũng bộc lộ vấn đề:
Attach()tạm thời đổi TTY sang 0666, tạo khả năng người dùng khác đọc/ghi và chèn input - Mức độ rủi ro theo từng bản phân phối phụ thuộc vào cách cài đặt; Arch Linux và NetBSD 10.1 cung cấp Screen 5.0.0 dưới dạng setuid-root nên chịu ảnh hưởng lớn từ các lỗ hổng chính
- Khuyến nghị hiện tại là không cài Screen dưới dạng setuid-root; tính năng nhiều người dùng cần opt-in dựa trên nhóm tin cậy, hạ quyền mặc định, nâng quyền có giới hạn và dọn dẹp biến môi trường
Bối cảnh công bố và bản vá
- Tháng 7/2024, maintainer upstream của Screen yêu cầu rà soát codebase hiện tại, và việc rà soát bảo mật thực tế bắt đầu vào tháng 1/2025
- Kết quả rà soát phát hiện một exploit root cục bộ trong bản cập nhật lớn Screen 5.0.0, ảnh hưởng đến các bản phân phối dùng setuid-root
- Ngoài ra còn phát hiện các vấn đề có mức độ nghiêm trọng thấp hơn; một số cũng ảnh hưởng đến Screen 4.9.1 và các phiên bản cũ hơn vẫn còn trong nhiều bản phân phối
- Các vấn đề được chia sẻ lên mailing list distros vào ngày 30/4/2025 và được công bố ngày 12/5/2025
- Báo cáo có đính kèm các gói bản vá theo phiên bản
Cấu hình Screen và chế độ nhiều người dùng
- Screen 5.0.0 được upstream phát hành dưới dạng bản phát hành lớn vào tháng 8/2024; Arch Linux, Fedora 42 và NetBSD 10.1 cung cấp phiên bản này
- Nhiều bản phân phối Linux và UNIX vẫn dùng Screen 4.9.1 tại thời điểm viết
- Chế độ nhiều người dùng của Screen cho phép attach vào phiên Screen do người dùng khác sở hữu khi có thông tin xác thực phù hợp
- Tính năng này chỉ dùng được khi Screen được cài với bit setuid-root
- Vì phần code Screen phức tạp chạy với quyền root, bề mặt tấn công tăng lên
- Trong các hệ thống được rà soát, Arch Linux, FreeBSD và NetBSD cài Screen dưới dạng setuid-root
- Gentoo Linux áp dụng bit setuid-root khi cờ USE
"multiuser"được bật - Một số bản phân phối dùng setgid thay cho setuid
- Mặc định của Gentoo Linux là setgid-utmp, cho phép Screen tạo bản ghi đăng nhập trong cơ sở dữ liệu
utmptoàn hệ thống - Fedora Linux dùng setgid-screen, cho phép Screen đặt socket trong thư mục toàn hệ thống
/run/screen
- Mặc định của Gentoo Linux là setgid-utmp, cho phép Screen tạo bản ghi đăng nhập trong cơ sở dữ liệu
CVE-2025-23395: exploit root cục bộ trong logfile_reopen()
- CVE-2025-23395 ảnh hưởng khi Screen 5.0.0 chạy với quyền setuid-root
- Hàm
logfile_reopen()không hạ quyền khi xử lý đường dẫn do người dùng cung cấp - Người dùng không có đặc quyền có thể tạo file ở vị trí tùy ý với các thuộc tính sau
- Chủ sở hữu:
root - Nhóm: nhóm thực của người dùng gọi
- Chế độ file:
0644
- Chủ sở hữu:
- File đã tồn tại cũng có thể bị khai thác
- Dữ liệu ghi vào Screen PTY sẽ được append vào file đó
- Mode và quyền sở hữu của file hiện có không bị thay đổi
- Screen hạ quyền đúng cách khi mở log file lần đầu, nhưng khả năng leo thang đặc quyền xuất hiện vào thời điểm nó quyết định cần mở lại log file
- Trong kiểm tra
stolen_logfile(), nếu link count của log file ban đầu trở về 0 hoặc kích thước thay đổi ngoài dự kiến,logfile_reopen()sẽ được gọi - Điều kiện này có thể được người dùng không có đặc quyền cố ý kích hoạt
- Patch 0001 cho Screen 5.0.0 đưa lại cách xử lý file an toàn trong quá trình reopen log file
- Vấn đề này phát sinh từ commit cũ
441bca708bd, nơilf_secreopen()bị loại bỏ, và thay đổi đó được đưa vào bản phát hành 5.0.0
CVE-2025-46802: chiếm quyền TTY khi attach phiên nhiều người dùng
- CVE-2025-46802 xảy ra trong hàm
Attach()khi cờmultiattachđược bật - Khi attach vào phiên nhiều người dùng, Screen dùng
chmod()để đổi mode của TTY hiện tại thành 0666 - Đường dẫn TTY được kiểm tra bằng các điều kiện như có nằm dưới
/devhay không vàisatty(), nên riêng hành vi này không tạo thành một exploit root cục bộ độc lập - Vấn đề là trong thời gian quyền TTY tạm thời được nới lỏng, một điều kiện tranh chấp xuất hiện khiến người dùng khác có thể đọc và ghi TTY đó
- Trong thử nghiệm đơn giản dựa trên API
inotifycủa Linux, một script Python có thể mở TTY bị ảnh hưởng sau mỗi hai hoặc ba lần thử - Kẻ tấn công có thể làm các việc sau
- Chặn dữ liệu được nhập vào TTY
- Chèn dữ liệu vào TTY
- Đánh lừa người dùng nhập mật khẩu
- Chèn control sequence để gây nhầm lẫn cho nạn nhân hoặc nhắm vào các vấn đề liên quan trong terminal emulator
- Ở một số đường return của
Attach(), mode TTY ban đầu không được khôi phục- Ví dụ: không tìm thấy phiên đích và đối số
"quiet"được đặt
- Ví dụ: không tìm thấy phiên đích và đối số
- Bản vá loại bỏ thao tác
chmod()tạm thời- Patch 0001 cho Screen 4.9.1
- Patch 0004 cho Screen 5.0.0
- Ngay trước khi công bố, có xác nhận rằng bản vá này có thể phá vỡ một số trường hợp reattach, nhưng những trường hợp đó cũng đã bị lỗi trong Screen 4.9.1
- Vấn đề này tồn tại trong các phiên bản Screen ít nhất từ năm 2005 và ảnh hưởng đến các bản phân phối Linux cũng như BSD cung cấp hỗ trợ nhiều người dùng bằng setuid-root
- Ngay cả khi không dùng setuid-root, về lý thuyết vẫn có ảnh hưởng vì người dùng có quyền đổi mode TTY của chính mình, nhưng Screen không tiếp tục vào phiên của người dùng khác nếu không có quyền root
CVE-2025-46803: giá trị mặc định PTY world-writable trong Screen 5.0.0
- CVE-2025-46803 là vấn đề trong Screen 5.0.0 khi mode mặc định của PTY do Screen cấp phát đổi từ 0620 sang 0622
- Với giá trị mặc định này, bất kỳ ai trong hệ thống cũng có thể ghi vào Screen PTY
- Về bảo mật, vấn đề tương tự CVE-2025-46802, nhưng không bao gồm khía cạnh rò rỉ thông tin
- Trong Screen 4.9.1, giá trị mặc định ở mức code là 0622, nhưng giá trị mặc định 0620 của cấu hình autotools được áp dụng, nên giá trị mặc định an toàn được sử dụng
- Trong Screen 5.0.0,
configure.acđược viết lại làm mất giá trị mặc định 0620 ở cấp autoconf, sau đó công tắc configurepty-modeđược đưa lại với mặc định 0622 - Không xác nhận được release note của 5.0.0 và chỉ có một số mục trong ChangeLog; thay đổi mode mặc định của PTY dường như không phải là quyết định có chủ ý
- Patch 0002 cho Screen 5.0.0 khôi phục mode PTY mặc định an toàn trong
configure.ac- Cần chạy
autoreconfđể áp dụng thay đổi
- Cần chạy
- Các packager được khuyến nghị truyền rõ công tắc configure
--with-pty-mode=0620 - Gentoo Linux và Fedora Linux truyền rõ
--with-pty-modean toàn - Arch Linux và NetBSD không truyền công tắc này nên nhận giá trị mặc định mới và bị ảnh hưởng
CVE-2025-46804: lộ sự tồn tại của file qua thông báo lỗi đường dẫn socket
- CVE-2025-46804 là rò rỉ thông tin mức nhẹ xảy ra khi Screen chạy với quyền setuid-root
- Được xác nhận trong cả các phiên bản Screen cũ hơn và 5.0.0
- Screen kiểm tra
SocketPathvới quyền root và làm lộ thông tin đường dẫn mà người dùng không đặc quyền thường không biết được qua thông báo lỗi - Khi dùng biến môi trường
SCREENDIR, có thể suy luận các thông tin sau/root/.lesshstcó phải file thường hay không- Thư mục
/root/.cachecó tồn tại hay không - Đường dẫn
/root/testcó không tồn tại hay không
- Bản vá thay đổi để trong bản cài setuid-root, khi đường dẫn đích không do UID thực của tiến trình kiểm soát, chỉ hiển thị thông báo lỗi chung
- Patch 0002 cho Screen 4.9.1
- Patch 0005 cho Screen 5.0.0
- Tất cả bản phân phối được rà soát đều bị ảnh hưởng
CVE-2025-46805: điều kiện tranh chấp TOCTOU khi gửi tín hiệu
- CVE-2025-46805 là điều kiện tranh chấp TOCTOU phát sinh khi gửi tín hiệu tới PID do người dùng cung cấp trong ngữ cảnh setuid-root
CheckPid()hạ quyền xuống ID người dùng thực rồi kiểm tra liệu kernel có cho phép gửi tín hiệu tới PID đích hay không- Tín hiệu thực tế được gửi sau đó qua
Kill(), và lúc này có thể sử dụng quyền root - Giữa bước kiểm tra và bước gửi thực tế, PID đã được kiểm tra trước đó có thể bị thay thế bằng một privileged process khác
- Cũng có khả năng đánh lừa tiến trình daemon Screen đặc quyền gửi tín hiệu cho chính nó
- Hiện tại chỉ có thể gửi SIGCONT và SIGHUP, nên tác động nhiều khả năng nằm trong phạm vi từ chối dịch vụ cục bộ hoặc xâm phạm tính toàn vẹn ở mức nhẹ
- Vấn đề này bắt nguồn từ bản sửa chưa hoàn chỉnh của CVE-2023-24626
- Trước bản sửa đó, các tín hiệu tương ứng có thể được gửi đến tiến trình tùy ý mà không cần điều kiện tranh chấp
- Bản vá thay đổi để tín hiệu thực tế cũng được gửi với quyền UID thực như
CheckPid()- Patch 0003 cho Screen 4.9.1
- Patch 0006 cho Screen 5.0.0
- Tất cả bản phân phối được rà soát đều bị ảnh hưởng
Crash khi gửi lệnh do sử dụng strncpy() trong Screen 5.0.0
- Screen 5.0.0 có một vấn đề liên quan đến
strncpy()không được xem là vấn đề bảo mật, nhưng cần ưu tiên sửa - Trong commit
0dc67256, nhiều lời gọistrcpy()được thay bằngstrncpy() strncpy()không phải là hàm xử lý chuỗi an toàn, mà là hàm padding buffer độ dài cố định bằng số 0; vì vậy nó ghi số 0 đến hết buffer đích ngay cả sau byte\0đầu tiên- Trong vòng lặp xử lý đối số dòng lệnh của
attacher.c, sau lần lặp đầu tiên vẫn truyềnMAXPATHLENlàm kích thước đích - Vì con trỏ
pđã tăng nhưng vẫn truyền cùng kích thước, các lời gọistrncpy()sau đó sẽ ghi byte\0vượt quá cuối buffer - Trên Arch Linux, khi gửi hơn một đối số lệnh tới phiên Screen đang chạy, lỗi sau được quan sát trong bản build bật
_FORTIFY_SOURCE*** buffer overflow detected***: terminatedAborted (core dumped)
- Nếu không có
_FORTIFY_SOURCE, có thể không có lỗi thấy được, và-fsanitize=addresscũng có thể không hiển thị lỗi - Người gọi có thể ghi đè bằng số 0 lên
MAXPATHLENbyte sau buffercmd, nhưng vì ngay sau đó có bufferwriteback[MAXPATHLEN]cùng kích thước, khả năng khai thác có lợi cho kẻ tấn công được đánh giá là không có - Patch 0003 cho Screen 5.0.0 thay
strncpy()bằngsnprintf()và truyền chính xác kích thước buffer đích còn lại - Tất cả bản phân phối cung cấp Screen 5.0.0 đều bị ảnh hưởng
Phạm vi ảnh hưởng theo bản phân phối
| Hệ thống | Phiên bản Screen | Đặc quyền đặc biệt | Ảnh hưởng |
|---|---|---|---|
| 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 | Không có | một phần 3.b |
| Ubuntu 24.04.2 | 4.9.1 | Không có | một phần 3.b |
| Fedora 42 | 5.0.0 | setgid-screen | một phần 3.b, 3.f |
| Gentoo | 4.9.1 | setgid-utmp, setuid-root khi cờ USE multiuser được bật | một phần 3.b |
| openSUSE TW | 4.9.1 | Không có | một phần 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 | Không có | một phần 3.b |
Lo ngại và khuyến nghị về thiết kế setuid-root
- Chế độ nhiều người dùng của Screen liên quan đến ba UID
- effective UID 0 cho privileged operation
- UID thực của người dùng tạo phiên
- UID thực của người dùng attach vào phiên
- Code Screen hiện tại có vẻ có cấu trúc khó phản ánh đúng sự phân biệt này
- Phiên nhiều người dùng Screen do
roottạo sẽ “hạ quyền” xuống UID thực 0 của người tạo phiên, nên về thực chất không hề hạ quyền - Trong quá trình refactor Screen 5.0.0, logic bảo mật tồn tại lâu năm đã bị phá vỡ, dẫn đến CVE-2025-23395 và CVE-2025-46803
- Trước khi refactor thêm, cần có test suite có thể xác minh các thuộc tính bảo mật của triển khai
- Nhà phát triển xử lý binary setuid-root cần hiểu rủi ro của khu vực này
- Screen tiếp tục chạy với quyền nâng cao rồi chỉ hạ quyền có chọn lọc ở các thao tác được xem là nguy hiểm
- Một chương trình setuid-root vững chắc nên mặc định hạ quyền và chỉ nâng quyền ở những thao tác thực sự cần quyền nâng cao
- Trong ngữ cảnh setuid-root, cần có logic chỉ giữ lại các biến môi trường được cho phép rõ ràng và loại bỏ phần còn lại
- Các biến môi trường như
PATHcần được dọn dẹp để chỉ trỏ tới các thư mục hệ thống đáng tin cậy - Hiện tại, khuyến nghị là không cài dưới dạng setuid-root không chỉ Screen 5.0.0 mà cả nhánh 4.9 cũ hơn
- Một phương án thay thế là cung cấp tính năng nhiều người dùng theo kiểu opt-in và chỉ cho thành viên của nhóm tin cậy chạy phiên bản Screen hỗ trợ nhiều người dùng
Quá trình điều phối công bố và trạng thái upstream
- Tháng 2/2025, các vấn đề được báo cáo riêng cho upstream Screen và đề xuất công bố có điều phối
- Upstream bày tỏ mong muốn giữ kín các vấn đề trước khi công bố để sửa lỗi và cho biết cần 1–2 tháng
- Khoảng một tháng sau, hoạt động và thảo luận bản vá từ phía upstream bắt đầu, nhưng cuộc thảo luận không đủ hiệu quả
- Đến khi gần hết thời hạn embargo tối đa 90 ngày, không có thêm trao đổi; trong thời gian đó, các bản phân phối như NetBSD đã cập nhật lên Screen 5.0.0 và trở nên bị ảnh hưởng hoàn toàn bởi CVE-2025-23395
- Có đánh giá rằng upstream chưa đủ quen với codebase Screen và chưa hiểu đầy đủ các vấn đề bảo mật được báo cáo
- Upstream muốn công bố sớm hơn trong khi một số vấn đề vẫn chưa được xử lý, nên bản nháp được chuyển nhanh tới mailing list distros
- Sau đó, phía SUSE trực tiếp phát triển các bản sửa còn thiếu, đồng thời điều chỉnh và tài liệu hóa các bản vá đã được thảo luận ở dạng nháp với upstream
- Nếu có năng lực upstream chuyên trách, quy trình công bố có điều phối được cho là có thể hoàn tất trong khoảng 2 tuần
- Upstream của Screen dường như thiếu nhân lực và chuyên môn, điều này đáng lo ngại vì đây là một tiện ích mã nguồn mở được dùng rộng rãi
Mốc thời gian chính
- 2024-07-01: Nhận yêu cầu rà soát từ upstream
- 2025-01-08: Bắt đầu công việc rà soát bảo mật
- 2025-02-07: Báo cáo riêng cho upstream Screen và đề xuất công bố có điều phối
- 2025-02-11: Tạo bug riêng tư trên bug tracker GNU Savannah
- 2025-04-30: Quyết định gán CVE và chia sẻ bản nháp lên mailing list distros
- 2025-05-07: Chia sẻ bản vá hoàn chỉnh cho Screen 4.9.1 và 5.0.0 lên mailing list distros và upstream
- 2025-05-12: Báo cáo được công bố trên blog và mailing list oss-security
1 bình luận
Ý kiến trên Hacker News
Tôi không biết Screen có chế độ đa người dùng như vậy, nhưng có lẽ chính tính năng này là lý do các công cụ như tmate có thể hoạt động
Nghe nói nếu có thông tin xác thực phù hợp, bạn có thể gắn vào một phiên Screen do người dùng khác sở hữu, và tính năng này chỉ khả dụng khi Screen được cài dưới dạng setuid-root
Vì vậy tôi bắt đầu tự hỏi liệu tmux có bị ảnh hưởng bởi cùng loại lỗ hổng hay không
Tôi không biết vì sao screen lại chọn cách setuid ở đây; trông có vẻ hoàn toàn không cần quyền root
Ở phần dưới bài viết có một lời giải thích khá hợp lý rằng các nhà phát triển screen hiện tại không hoàn toàn quen thuộc với codebase; nếu vậy, có thể setuid-root là cách dễ nhất để làm cho tính năng này hoạt động
Trong một buổi đào tạo, tôi từng cấp cho mỗi học viên một tài khoản đăng nhập trên laptop của mình, giới hạn shell SSH ở
screen -x, rồi dùng danh sách kiểm soát truy cập của screen để mỗi học viên chỉ dùng được cửa sổ của họTrong lúc thực hành, với tư cách là chủ sở hữu screen, tôi có thể đưa màn hình của từng học viên lên máy chiếu để cả lớp xem kết quả
Nếu có nhiều lỗ hổng bảo mật thì tôi cũng không ngạc nhiên
screen -xTrên Debian, GNU screen không được cài với quyền setuid-root
Trước đây tôi luôn không thích việc Debian thường tụt hậu về phiên bản phần mềm, nhưng giờ thì ngoài vài ứng dụng như trình duyệt, nơi tôi thật sự không muốn phụ thuộc vào phần mềm quá cũ và dùng nguồn gói khác, còn lại tôi vẫn ổn với các gói cũ
/usr/bin/screentrỏ tớiscreen-4.9.0, và file thực thi cũng không có suidTuy nhiên trên Gentoo, nó có SETGID cho nhóm
utmp, nhưng tôi không rõ tác động của việc đó là gìBài blog đã render nằm ở đây: https://security.opensuse.org/2025/05/12/screen-security-iss...
Tôi từng gửi email cho tác giả GNU Screen về việc tính năng ghi log ra file không được tài liệu hóa đầy đủ: http://www.zoobab.com/screenrc
GNU cần một hệ thống theo dõi issue tốt hơn
https://undeadly.org/cgi?action=article&sid=20090712190402
Việc Discord bị chỉ trích vì khiến những thông tin như vậy không thể truy cập được là hợp lý, nhưng IRC mà một số dự án vẫn dùng thực ra còn tệ hơn thế gấp đôi
Tôi mong các dự án như vậy chuyển sang những nơi như Gitea, Forgejo, Codeberg, GitLab, GitHub để gom nội dung liên quan lại một chỗ và bảo đảm khả năng được tìm thấy
Zellij là một lựa chọn thay thế hiện đại khá tốt cho screen và tmux, có mặc định rất ổn và UI được thiết kế để dễ khám phá
Tôi khuyên dùng cho những ai từng thấy lợi ích so với công sức bỏ ra của terminal multiplexer là chưa rõ ràng
https://zellij.dev
https://github.com/zellij-org/zellij
Nhưng so với tmux thì độ trễ khá dễ nhận thấy, nên tôi vẫn tiếp tục dùng tmux
Khi đó tôi vốn đã dùng một kết nối có độ trễ, nên có lẽ tôi cũng hơi nhạy cảm
Tôi dùng tính năng đó rất nhiều nên không thể thiếu, và cho đến khi nó được thêm vào thì tôi đành phải dùng tmux
Tôi đã dùng nó hơn 20 năm
Tôi ngạc nhiên là upstream có tham gia vào chuyện này
Khoảng 5 năm trước tôi đã buồn bã kết luận rằng việc phát triển GNU screen đã dừng hẳn, nên giờ tự hỏi không biết có còn như vậy không
Tôi không biết screen vẫn còn tính năng thêm cửa sổ mới mà không gắn vào screen hiện có hay không
Có vẻ họ thiếu nhân lực phát triển, và upstream có thể không có đủ chuyên môn để bảo trì đúng cách
Nếu đúng vậy thì thật đáng buồn. Tôi biết có tmux và các lựa chọn thay thế khác, nhưng rất nhiều người đã dùng Screen trong thời gian rất dài, và thật đáng tiếc khi thấy một công cụ dần mục ruỗng
Có vẻ họ đã yêu cầu rà soát bảo mật nhưng khó duy trì liên lạc, còn toàn bộ tình hình thì tôi không rõ
Bản phân phối nào cấu hình như vậy thì dễ bị tấn công, bản nào không thì không
Tôi xem đó là mức tham gia rất nông. Nếu upstream quá chậm, bản phân phối sẽ tự vá
Về cơ bản có thể xem đó là dấu hiệu của một công cụ đã hoàn thiện
Không có động lực để chuyển ngay, vì đó không phải là cập nhật mà là chuyển đổi
Ngược lại, việc ai đó mua nhãn hiệu của phần mềm cũ rồi biến nó thành thứ hoàn toàn khác như trường hợp Audacity cũng tệ
Vì vậy có vẻ không có giải pháp tốt
Bản đã render: https://security.opensuse.org/2025/05/12/screen-security-iss...
Nếu tôi nhớ đúng, tmux đã được đưa vào hệ thống cơ sở từ OpenBSD 4.6 và là công cụ đã được, hoặc vẫn đang được, audit
Đây là lựa chọn tốt cho những ai muốn một phương án an toàn hơn một chút
Hành vi được quan sát đã tồn tại trong các phiên bản Screen ít nhất từ năm 2005, và từ lâu như vậy nó đã là một anti-pattern; các công cụ như rkhunter cũng đã xử lý vấn đề này
Dù vậy, tôi nghĩ screen đã là setuid root từ những năm 90
Thực sự có bao nhiêu lập trình viên đang vận hành những công cụ mã nguồn mở phổ biến nhất?
Các ngành đang sử dụng những công cụ đó có bao nhiêu tiền?