Lỗ hổng thực thi mã tùy ý phá vỡ sandbox trong KDE Plasma
(blog.kimiblock.top)- PoC xác nhận rằng do hành vi quản lý cửa sổ của KDE Plasma, một ứng dụng bị sandbox có thể thực thi binary tùy ý trên host khi người dùng nhấp chuột
- Nguyên nhân cốt lõi là KWin tin tưởng app_id do ứng dụng cung cấp và vẫn giữ đường dẫn thực thi dựa trên
/proc/PID/cmdlinemà không đối chiếu với tệp.desktopthực tế - PoC kết hợp host Arch Linux, ứng dụng Flatpak và Mesa
eglgears_waylandđã chỉnh sửa để tái hiện luồng trong đó/usr/bin/kcalcđược chạy bên ngoài sandbox - Khi người dùng chọn Open New Window trên biểu tượng ở thanh tác vụ hoặc nhấp chuột giữa, tiến trình mục tiêu được khởi chạy trong trạng thái lộ diện ở cgroup
app.slicevà mount namespace của host - Để giảm thiểu, cần xác minh app ID từ security context của sandbox,
XdpAppInfo, control groups, và chặn việc khởi chạy cửa sổ mới đối với các cửa sổ không khớp với tệp.desktop
Luồng thoát sandbox mà PoC cho thấy
- Ứng dụng sandbox độc hại có thể giả mạo một ứng dụng khác và thực thi binary tùy ý trên host ngay lúc người dùng gọi Open New Window
- PoC được tái hiện bằng Flatpak, nhưng bài viết tổng kết rằng vấn đề cũng có thể áp dụng cho các sandbox khác, bất kể có hỗ trợ security context hay không
- Cấu hình thử nghiệm như sau
- Host Arch Linux
- Phụ thuộc build
wget,unzip,meson - Ứng dụng Flatpak không được cấp quyền
io.github.johannesboehler2.BmiCalculator - Do khó build trong sandbox, chỉ truyền đường dẫn binary độc hại vào Flatpak
- Binary mục tiêu được chỉ định
/usr/bin/kcalc
- Khi chạy binary độc hại, biểu tượng KCalc sẽ hiển thị trên thanh tác vụ
- Khi người dùng nhấp chuột phải rồi chọn Open New Window,
/usr/bin/kcalcđược khởi động bên ngoài sandbox- Vị trí thực thi là cgroup
app.slice - Mount namespace thuộc phía host
- Kết quả là nó chạy trong trạng thái hoàn toàn lộ diện
- Vị trí thực thi là cgroup
Quá trình phát hiện và các manh mối
- Trong khi kiểm thử sandbox Portable bằng máy ảo QEMU trên KDE Plasma, một số cửa sổ không được liên kết với tệp
.desktopphù hợp nên hiển thị trên thanh tác vụ bằng biểu tượng Wayland chung - Hiện tượng này đã được báo cáo trong KWin trusts on Apps fully for app_id, dẫn đến vấn đề ứng dụng có thể giả mạo ứng dụng khác
- Sau đó, khi vô tình nhấp chuột giữa trên thanh tác vụ, hành vi mặc định Open New Window được gọi
- Cửa sổ mới đã được chạy, nhưng không sử dụng thông tin đăng nhập đã lưu và cấu hình đã chỉnh sửa; khi kiểm tra cùng lúc PID trong KWin Debug Console và thông tin control groups cùng rootfs trong procfs, việc thoát sandbox đã lộ ra
Cách lỗ hổng hoạt động
- Ngay cả khi KWin không thể liên kết cửa sổ với tệp
.desktopthực tế, vẫn còn một đường dẫn để tìmargv0sẽ được thực thi - Kết quả thử nghiệm cho thấy phỏng đoán rằng giá trị được đọc qua
/proc/PID/cmdlinelà đúng - Vấn đề không chỉ dừng ở mức chạy một instance ứng dụng hiện có bên ngoài sandbox
- Mọi tiến trình, bao gồm cả tiến trình không có đặc quyền, đều có thể thay đổi argv0
- Mount namespace cũng có thể là một lựa chọn, nhưng được tổng kết là kém linh hoạt hơn
- Việc thiếu bảo vệ đối với app_id do ứng dụng cung cấp kết hợp với tính không an toàn của việc đọc
/proc/PID/cmdlinekhiến thực thi mã tùy ý trên host trở nên khả thi
Demo và kịch bản tấn công thực tế
- Mã demo do GalaxySnail viết, sử dụng
eglgears-waylandcủa Mesa - Luồng demo như sau
- Clone repository
mesa-demos-argv0 - Sửa lệnh được chỉ định trong hàm
maincủasrc/egl/opengl/eglgears.cthành lệnh mong muốn - Build bằng
meson setup build && meson compile -C build - Chạy
./build/src/egl/opengl/eglgears_wayland - Nhấp chuột giữa vào biểu tượng trên thanh tác vụ hoặc chọn Open New Window trong menu ngữ cảnh
- Binary độc hại đã chỉ định được khởi động
- Clone repository
- Trong tấn công thực tế, có thể tạo shell script dưới
$HOME$HOMEthường cũng nằm ở cùng đường dẫn trên host- Ứng dụng độc hại có thể âm thầm tạo
argv0hoặc thay bằng binary đã tải xuống - Nếu người dùng nhấp Open New Window hoặc vô tình nhấp chuột giữa vào biểu tượng ứng dụng, kẻ tấn công có thể kiểm soát hoàn toàn phiên làm việc
Hướng sửa được đề xuất
- Để KDE Plasma ngăn chặn exploit này, không nên tin tưởng nguyên trạng ID do ứng dụng cung cấp
- Bài viết đề xuất lấy app ID từ các đường dẫn sau
- security context của sandbox
XdpAppInfo- control groups
- Nếu một cửa sổ cụ thể không khớp với tệp
.desktop, không nên cho phép Open New Window - Hiện chưa nhận được cập nhật từ email KDE Security
Dòng thời gian công khai
- Trong email ban đầu, arbitrary code execution đã bị ghi nhầm là RCE
- Tất cả sự kiện dựa trên UTC+8, định dạng 24 giờ
- 23:51 ngày 1 tháng 4 năm 2026, gửi email đầu tiên đến
security@kde.org - 00:15 ngày 2 tháng 4 năm 2026, David Edmundson phản hồi xác nhận báo cáo
- 00:24 ngày 2 tháng 4 năm 2026, David Edmundson trả lời rằng tính năng này dùng
Exec=trong tệp.desktopvà ông cho rằng không thể dùng để thực thi mã tùy ý - 11:59 ngày 2 tháng 4 năm 2026, với sự giúp đỡ của GalaxySnail, xác nhận một PoC khác không phụ thuộc vào tệp
.desktophoạt động - 18:26 ngày 2 tháng 4 năm 2026, gửi email tiếp theo kèm tệp exploit và mô tả đến
security@kde.org, nhưng không nhận được phản hồi - 11:59 ngày 2 tháng 5 năm 2026, xác nhận exploit chưa được vá trong Plasma 6.7 Beta
- 18:30 ngày 2 tháng 7 năm 2026, exploit vẫn hoạt động và đã vượt quá thời gian chờ 90 ngày nên tiến hành công khai
- Vì lỗ hổng chưa được vá, không nhận được phản hồi tiếp theo và thời gian chờ thông thường 90 ngày đã trôi qua, tác giả quyết định công khai để nâng cao nhận thức
- Tác giả nói thêm rằng đây không phải là nỗ lực chỉ trích các nhà phát triển KDE; các dự án OSS gần đây phải chịu nhiều spam và con người cũng có giới hạn về năng lực xử lý, nhưng quy trình có thể được cải thiện hơn
1 bình luận
Các ý kiến trên Lobste.rs
Với sandboxing ứng dụng desktop, đó là một mô hình tốt hơn nhiều so với mớ cách tiếp cận lộn xộn đang được chồng chất trên Linux để cố làm điều tương tự. Launcher truyền tập quyền ban đầu, tức các file descriptor, dựa trên metadata; ứng dụng không thể truy cập gì ngoài chúng, còn powerbox cung cấp quyền mở/lưu các tệp khác
Nó nhìn chung phù hợp với môi trường nơi một tiến trình kiểu “thần thánh” điều phối dịch vụ, như dịch vụ Kubernetes, nhưng không hợp lắm trên desktop. Người dùng muốn đi vào một cgroup/namespace có quyền thấp hơn từ user space, nhưng lại phải đi qua các nghi thức như root daemon hoặc setuid, rốt cuộc kéo theo rủi ro leo thang đặc quyền
SCM_RIGHTS+ Wayland + D-Bus làm các thành phần nền tảngNếu nheo mắt nhìn thì cũng thấy được phác thảo của một desktop an toàn
Nhưng triển khai thực tế nhìn chung hoặc quá rộng rãi, hoặc thiếu linh hoạt, hoặc hỏng dở dang. Dường như không có mấy ai quan tâm đến bảo mật desktop đầu-cuối nhiều như việc chăm lo bảo mật workload máy chủ. Vì vậy gVisor và Firecracker hoạt động tốt, còn Flatpak thì khó chạy nổi một ứng dụng Gtk+ cơ bản mà không làm hỏng phông chữ, và mọi Wayland compositor đều phải tự triển khai lại một nửa nền tảng desktop đáng tin cậy
Càng đáng xấu hổ hơn khi nghĩ rằng Android đã làm khá tốt vai trò một bản phân phối Linux được gia cố đủ để chạy mã không đáng tin cậy, còn iOS và macOS đã cho thấy sandboxing ứng dụng hướng người dùng cũng có thể đủ dễ dùng. Chỉ cần làm theo cách họ làm là được. Rốt cuộc tại sao lại có thứ gì đó bên trong trình quản lý cửa sổ đang đọc
/proc/{pid}/cmdline?Nói vậy hoàn toàn không phải là chỉ trích nhà nghiên cứu
Có lẽ nếu quen thuộc hơn với cấu trúc nội bộ của KDE hoặc Flatpak thì sẽ hiểu tốt hơn nhiều