- Các lỗ hổng bảo mật nghiêm trọng đã được phát hiện trong GNU Screen 5.0.0 và các bản cài đặt setuid-root
- Các vấn đề chính gồm leo thang đặc quyền root cục bộ, chiếm quyền TTY, tạo PTY có thể ghi bởi mọi người
- Nhiều bản phân phối Linux và UNIX bị ảnh hưởng một phần hoặc toàn bộ
- Đã có bản vá tạm thời và nhiều bản phân phối cần ưu tiên xử lý
- Bản thân thiết kế setuid-root của Screen có rủi ro bảo mật mang tính nền tảng
1. Giới thiệu
- Vào tháng 7/2024, việc rà soát bảo mật bắt đầu khi maintainer upstream của Screen yêu cầu review mã
- Trước đây không phát hiện vấn đề đáng kể nào, nhưng lần này đã tìm thấy lỗ hổng leo thang đặc quyền root nghiêm trọng trong Screen 5.0.0 khi chạy với cấu hình setuid-root
- Ngoài ra, cũng xác nhận nhiều lỗ hổng bảo mật mức nhẹ ảnh hưởng đến các phiên bản trước đó (4.9.1, v.v.)
- Báo cáo đính kèm bộ bản vá lỗ hổng theo từng phiên bản (4.9.1, 5.0.0)
- Nội dung gồm cấu hình và phiên bản Screen theo từng bản phân phối, các lỗ hổng chính, rủi ro phát triển liên quan đến setuid-root, khuyến nghị tăng cường bảo mật, vấn đề trong quá trình điều phối công bố, và ma trận ảnh hưởng
2. Tổng quan cấu hình và phiên bản Screen
- Tháng 8/2024, Screen 5.0.0 được phát hành và được đưa vào Arch Linux, Fedora 42, NetBSD 10.1
- Bản 5.0.0 bao gồm rất nhiều đợt refactoring, trong đó một số phần là mã đã tồn tại hơn 10 năm
- Một số lỗ hổng được đưa vào mới ở 5.0.0, và một số khác cũng tồn tại ở các phiên bản trước (4.9.1, v.v.)
- Phần lớn các bản phân phối vẫn đang dùng 4.9.1
- Chế độ đa người dùng của Screen chỉ dùng được khi cài đặt dưới dạng setuid-root, và do độ phức tạp của mã nên làm tăng đáng kể bề mặt tấn công
- Trong các bản phân phối lớn, Arch Linux, FreeBSD, NetBSD cài Screen dưới dạng setuid-root; Gentoo chỉ có thể cài setuid-root khi dùng USE flag “multiuser”
3. Chi tiết các vấn đề bảo mật
3.a) Giành quyền root cục bộ thông qua logfile_reopen() (CVE-2025-23395)
- Khi Screen 5.0.0 chạy dưới setuid-root, hàm logfile_reopen() tạo tệp theo đường dẫn do người dùng nhập mà không hạ đặc quyền
- Kẻ tấn công có thể tạo tệp tùy ý thuộc sở hữu root để ghi và khai thác dữ liệu terminal
- Ngay cả tệp đã tồn tại cũng có thể bị lợi dụng, ví dụ chèn mã vào shell script có đặc quyền
- Arch Linux, NetBSD 5.0.0 bị ảnh hưởng hoàn toàn; Fedora và một số môi trường của Gentoo bị ảnh hưởng một phần
- Bản vá được áp dụng bằng cách khôi phục xử lý tệp an toàn, với mức ảnh hưởng cụ thể khác nhau theo từng bản phân phối
3.b) Chiếm quyền TTY khi kết nối vào phiên đa người dùng (CVE-2025-46802)
- Trong hàm Attach(), khi bật cờ multiattach, quyền của TTY tạm thời bị đổi thành 0666
- Trong quá trình này, một race condition cho phép người dùng thứ ba có quyền đọc/ghi vào TTY đó
- Có nguy cơ nghe lén dữ liệu nhập, sửa đổi dữ liệu, đánh cắp mật khẩu, v.v.
- Cũng tồn tại các nhánh mã mà quyền TTY không được khôi phục về trạng thái ban đầu
- Bản vá loại bỏ thao tác chmod 666; dù một số trường hợp tái kết nối có thể bị hỏng, chúng vốn dĩ cũng không hoạt động trước đó
3.c) Lỗ hổng quyền mặc định của PTY (CVE-2025-46803)
- Trong 5.0.0, quyền mặc định của PTY bị đổi từ 0620 → 0622 (mọi người đều có thể ghi)
- Mức rủi ro tiềm ẩn về bảo mật tăng lên, đặc biệt vì mọi người dùng đều có thể ghi vào PTY của người khác
- Thay đổi này có vẻ được đưa vào do nhầm lẫn, và bản vá khắc phục bằng cách khôi phục giá trị mặc định an toàn khi biên dịch (0620)
- Arch Linux, NetBSD là các đối tượng bị ảnh hưởng chính
3.d) Rò rỉ thông tin về sự tồn tại của tệp qua thông báo lỗi socket (CVE-2025-46804)
- Có thể dùng biến môi trường SCREENDIR và thông báo Error để kiểm tra sự tồn tại của tệp/thư mục thực tế với đặc quyền root
- Đây là rò rỉ thông tin mức nhẹ, nhưng mọi môi trường cài đặt setuid-root đều có rủi ro
3.e) Race condition TOCTOU trong việc gửi tín hiệu (CVE-2025-46805)
- Do độ trễ thời gian giữa các hàm CheckPid() và Kill(), có nguy cơ gửi tín hiệu với quyền root đến PID khác ngoài ý định
- Chủ yếu chỉ cho phép các tín hiệu như SIGCONT, SIGHUP nên tác động bị giới hạn, nhưng vẫn có thể gây từ chối dịch vụ (DoS) hoặc ảnh hưởng nhẹ đến tính toàn vẹn
3.f) Tràn bộ đệm khi gửi lệnh do dùng strncpy() sai cách
- Trong 5.0.0, việc dùng
strncpy() sai cách gây tràn bộ đệm và làm chương trình crash
- Nếu không được vá đúng cách, việc gửi lệnh có thể ghi đè bộ nhớ sau MAXPATHLEN và dẫn đến tình trạng dịch vụ không hoạt động
- Đây không phải vấn đề bảo mật, nhưng cần sửa sớm vì độ ổn định
4. Rủi ro bổ sung liên quan đến triển khai setuid-root
- Đã xác nhận logic xử lý UID nhiều người dùng trong chế độ multi-user còn yếu
- Logic hạ đặc quyền ở trạng thái setuid-root là không đầy đủ
- Trong các phiên do root tạo ra, việc hạ đặc quyền hiệu quả không diễn ra đầy đủ, khiến rủi ro tổng thể tăng cao
5. Khuyến nghị chung để tăng cường bảo mật
- Trong quá trình refactoring quy mô lớn, đã xác nhận logic bảo mật hiện có bị phá vỡ
- Do đặc tính của binary setuid-root, cần đưa vào bộ kiểm thử bảo mật và thiết kế bảo thủ cho mọi xử lý liên quan đến filesystem/biến môi trường
- Đặc biệt không khuyến nghị chạy toàn bộ dưới setuid-root; tính năng multi-user chỉ nên bị giới hạn theo cơ chế opt-in cho nhóm đáng tin cậy
- Các biến môi trường (PAH, v.v.) bắt buộc phải chỉ được chỉ định bằng đường dẫn đáng tin cậy
6. Các vấn đề trong quá trình điều phối công bố lỗ hổng
- Quá trình điều phối với upstream diễn ra kém hiệu quả, dẫn đến chậm trễ trong việc phát triển bản vá và công bố
- Do thiếu hiểu biết và năng lực đối với mã nguồn phía upstream, việc phối hợp chặt chẽ gặp khó khăn
- Cuối cùng phía các bản phân phối đã chủ động phát triển bản vá, và báo cáo được công bố theo lịch đã điều phối
- Cũng cho thấy thiếu năng lực duy trì và quản lý của chính dự án Screen
7. Ma trận ảnh hưởng
- Arch Linux (5.0.0, setuid-root): bị ảnh hưởng bởi toàn bộ các lỗ hổng 3.a, 3.b, 3.c, 3.d, 3.e, 3.f
- Debian/Ubuntu và nhiều bản phân phối khác: 3.b (ảnh hưởng một phần)
- Fedora 42 (5.0.0, setgid-screen): 3.b (ảnh hưởng một phần), 3.f
- Gentoo (4.9.1, setgid-utmp): 3.b (ảnh hưởng một phần), với ebuild unstable + USE flag multiuser thì ảnh hưởng giống 5.0.0
- FreeBSD 14.2 (4.9.1, setuid-root): bị ảnh hưởng bởi 3.b, 3.d, 3.e
- NetBSD 10.1 (5.0.0, setuid-root): bị ảnh hưởng bởi 3.a, 3.b, 3.c, 3.d, 3.e, 3.f
- OpenBSD 7.7 (4.9.1): 3.b (ảnh hưởng một phần)
- openSUSE TW: 3.b (ảnh hưởng một phần)
8. Lịch trình
- 2024-07-01: nhận yêu cầu review mã từ upstream
- 2025-01-08: bắt đầu rà soát
- 2025-02-07: báo cáo riêng tư các lỗ hổng cho upstream, yêu cầu công bố có điều phối
- 2025-02~04: thảo luận bản vá, điều chỉnh lại lịch do vấn đề về thời gian embargo
- 2025-05-12: công bố báo cáo này và thông báo chính thức
9. Liên kết tham khảo
- GNU Savannah [trang dự án Screen]
- openSUSE Bugzilla, các bản vá liên quan, các CVE tham khảo, liên kết tới bug report và tài liệu
1 bình luận
Ý kiến Hacker News
screen -x <cửa sổ của người dùng cụ thể>để học viên chỉ có thể dùng những cửa sổ được ACL của screen cho phép, tôi dùng projector để lần lượt kiểm tra và trình chiếu màn hình của từng học viên, nhưng việc nó đầy lỗ hổng bảo mật thì cũng không quá bất ngờscreen -xchmod u+scho screen để xử lý một vấn đề kỳ lạ, cảm giác việc phải làm vậy rất khó chịu, nhưng rồi mới biết screen có những tính năng phụ thuộc vào setuid và trên một số hệ thống nó thực sự được phát hành mặc định như vậy, và khi đặtu+sthì screen lại đọc~/.screenrccủa root thay vì~/.screenrccủa tôi (tôi đành chấp nhận như một cách chữa cháy), tôi nghĩ mỗi bản build của screen có thể khác nhau về hỗ trợ setuid