Lỗ hổng trong cgroups v1 cho phép thoát khỏi container bị cô lập

Thông tin chi tiết về lỗ hổng (CVE-2022-0492) trong việc triển khai cơ chế giới hạn tài nguyên cgroups v1 trong nhân Linux, có thể được sử dụng để thoát khỏi các vùng chứa bị cô lập, đã được tiết lộ. Sự cố này đã xuất hiện kể từ nhân Linux 2.6.24 và đã được sửa trong các bản phát hành nhân 5.16.12, 5.15.26, 5.10.97, 5.4.177, 4.19.229, 4.14.266 và 4.9.301. Bạn có thể theo dõi các ấn phẩm cập nhật gói trong các bản phân phối trên các trang này: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux.

Lỗ hổng này là do lỗi logic trong trình xử lý tệp Release_agent không thể thực hiện kiểm tra thích hợp khi chạy trình xử lý với đầy đủ đặc quyền. Tệp Release_agent được sử dụng để xác định chương trình sẽ được kernel thực thi khi một quá trình trong nhóm bị chấm dứt. Chương trình này chạy dưới quyền root và có tất cả “khả năng” trong không gian tên gốc. Người ta cho rằng chỉ quản trị viên mới có quyền truy cập vào cài đặt Release_agent, nhưng trên thực tế, việc kiểm tra chỉ giới hạn ở việc cấp quyền truy cập cho người dùng root, điều này không loại trừ cài đặt bị thay đổi từ vùng chứa hoặc bởi người dùng root không có quyền quản trị viên (CAP_SYS_ADMIN ).

Trước đây, tính năng như vậy không được coi là lỗ hổng bảo mật, nhưng tình hình đã thay đổi với sự xuất hiện của không gian tên người dùng (không gian tên người dùng), cho phép bạn tạo người dùng root riêng biệt trong các vùng chứa không trùng lặp với người dùng root của môi trường chính. Theo đó, đối với một cuộc tấn công, việc kết nối trình xử lý Release_agent của bạn trong một vùng chứa có người dùng root riêng trong một không gian ID người dùng riêng biệt là đủ, sau khi hoàn tất quá trình này sẽ được thực thi với đầy đủ các đặc quyền của môi trường chính.

Theo mặc định, cgroupfs được gắn trong một vùng chứa ở chế độ chỉ đọc, nhưng không có vấn đề gì khi kể lại các giả này ở chế độ ghi nếu bạn có quyền CAP_SYS_ADMIN hoặc bằng cách tạo một vùng chứa lồng nhau với một không gian tên người dùng riêng biệt bằng cách sử dụng lệnh gọi hệ thống không chia sẻ, trong đó Quyền CAP_SYS_ADMIN có sẵn cho vùng chứa đã tạo.

Lỗ hổng trong cgroups v1 cho phép thoát khỏi container bị cô lập

Cuộc tấn công có thể được thực hiện nếu bạn có đặc quyền root trong một vùng chứa bị cô lập hoặc khi chạy một vùng chứa không có cờ no_new_privs, điều này cấm có được các đặc quyền bổ sung. Hệ thống phải bật hỗ trợ cho không gian tên người dùng (được bật theo mặc định trong Ubuntu và Fedora, nhưng không được kích hoạt trong Debian và RHEL) và có quyền truy cập vào cgroup gốc v1 (ví dụ: Docker chạy các bộ chứa trong nhóm RDMA gốc). Cuộc tấn công cũng có thể xảy ra nếu bạn có đặc quyền CAP_SYS_ADMIN, trong trường hợp đó không cần hỗ trợ không gian tên người dùng và quyền truy cập vào hệ thống phân cấp gốc cgroup v1.

Ngoài việc thoát khỏi vùng chứa bị cô lập, lỗ hổng này còn cho phép các tiến trình được khởi chạy bởi người dùng root mà không có "khả năng" hoặc bất kỳ người dùng nào có quyền CAP_DAC_OVERRIDE (cuộc tấn công yêu cầu quyền truy cập vào tệp /sys/fs/cgroup/*/release_agent, đó là thuộc sở hữu của root) để có quyền truy cập vào tất cả các “khả năng” của hệ thống.

Cần lưu ý rằng lỗ hổng này không thể bị khai thác khi sử dụng các cơ chế bảo vệ Seccomp, AppArmor hoặc SELinux để cách ly thêm các vùng chứa, vì Seccomp chặn quyền truy cập vào lệnh gọi hệ thống unshare() và AppArmor và SELinux không cho phép gắn cgroupfs ở chế độ ghi.

Nguồn: opennet.ru

Thêm một lời nhận xét