Lỗ hổng nghiêm trọng trong PolKit cho phép truy cập root trên hầu hết các bản phân phối Linux

Qualys đã xác định một lỗ hổng (CVE-2021-4034) trong thành phần hệ thống Polkit (trước đây là PolicyKit) được sử dụng trong các bản phân phối nhằm cho phép người dùng không có đặc quyền thực hiện các hành động yêu cầu quyền truy cập nâng cao. Lỗ hổng này cho phép người dùng cục bộ không có đặc quyền leo thang đặc quyền của họ để root và giành toàn quyền kiểm soát hệ thống. Sự cố có tên mã là PwnKit và đáng chú ý là đã tạo ra một lỗ hổng hoạt động chạy trong cấu hình mặc định trên hầu hết các bản phân phối Linux.

Sự cố xảy ra trong tiện ích pkexec của PolKit, đi kèm với cờ gốc SUID và được thiết kế để chạy các lệnh với đặc quyền của người dùng khác theo các quy tắc PolKit đã chỉ định. Do việc xử lý không chính xác các đối số dòng lệnh được truyền tới pkexec, người dùng không có đặc quyền có thể bỏ qua xác thực và chạy mã của họ dưới quyền root, bất kể quy tắc truy cập đã đặt. Đối với một cuộc tấn công, bất kể cài đặt và hạn chế nào được chỉ định trong PolKit, chỉ cần đặt thuộc tính gốc SUID cho tệp thực thi bằng tiện ích pkexec là đủ.

Pkexec không kiểm tra tính hợp lệ của số lượng đối số dòng lệnh (argc) được truyền khi bắt đầu một quá trình. Các nhà phát triển pkexec giả định rằng mục đầu tiên trong mảng argv luôn chứa tên của tiến trình (pkexec) và mục thứ hai là giá trị NULL hoặc tên của lệnh được khởi chạy qua pkexec. Vì số lượng đối số không được kiểm tra dựa trên nội dung thực tế của mảng và được giả định là luôn lớn hơn 1, nên nếu một quá trình được truyền một mảng argv trống, như hàm execve của Linux cho phép, pkexec sẽ coi NULL là đối số đầu tiên ( tên tiến trình) và tên tiếp theo nằm ngoài bộ nhớ đệm, giống như nội dung tiếp theo của mảng. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "chương trình" "-option" NULL "giá trị" "PATH=name" NULL

Vấn đề là sau mảng argv có một mảng envp trong bộ nhớ chứa các biến môi trường. Do đó, nếu mảng argv trống, pkexec sẽ trích xuất dữ liệu về lệnh chạy với các đặc quyền nâng cao từ phần tử đầu tiên của mảng có các biến môi trường (argv[1] trở nên giống hệt envp[0]), nội dung của nó có thể được kiểm soát bởi kẻ tấn công.

Sau khi nhận được giá trị của argv[1], pkexec sẽ thử, tính đến các đường dẫn tệp trong PATH, để xác định đường dẫn đầy đủ đến tệp thực thi và ghi một con trỏ vào chuỗi có đường dẫn đầy đủ quay lại argv[1], mà dẫn đến ghi đè giá trị của biến môi trường đầu tiên, vì argv[1] giống hệt envp[0]. Bằng cách thao tác tên của biến môi trường đầu tiên, kẻ tấn công có thể thay thế một biến môi trường khác trong pkexec, chẳng hạn như thay thế biến môi trường “LD_PRELOAD”, biến này không được phép trong các chương trình suid và sắp xếp để tải thư viện dùng chung của chúng vào quá trình.

Cách khai thác đang hoạt động bao gồm việc thay thế biến GCONV_PATH, biến này được sử dụng để xác định đường dẫn đến thư viện chuyển mã ký hiệu, được tải động khi gọi hàm g_printerr(), mã của hàm này sử dụng iconv_open(). Bằng cách xác định lại đường dẫn trong GCONV_PATH, kẻ tấn công có thể đảm bảo rằng đó không phải là thư viện iconv tiêu chuẩn được tải mà là thư viện riêng của nó, các trình xử lý từ đó sẽ được thực thi khi thông báo lỗi được hiển thị ở giai đoạn khi pkexec vẫn đang chạy với quyền root và trước khi quyền khởi chạy được kiểm tra.

Cần lưu ý rằng mặc dù thực tế là sự cố xảy ra do hỏng bộ nhớ nhưng nó vẫn có thể được khai thác một cách đáng tin cậy và lặp lại bất kể kiến ​​trúc phần cứng được sử dụng. Bản khai thác đã chuẩn bị sẵn đã được thử nghiệm thành công trên Ubuntu, Debian, Fedora và CentOS nhưng cũng có thể được sử dụng trên các bản phân phối khác. Cách khai thác ban đầu vẫn chưa được công khai, cho thấy rằng nó không đáng kể và có thể dễ dàng được các nhà nghiên cứu khác tạo lại. Vì vậy, điều quan trọng là phải cài đặt bản cập nhật bản vá càng sớm càng tốt trên các hệ thống nhiều người dùng. Polkit cũng có sẵn cho các hệ thống BSD và Solaris, nhưng chưa được nghiên cứu để sử dụng trên chúng. Điều được biết là cuộc tấn công không thể được thực hiện trên OpenBSD, vì hạt nhân OpenBSD không cho phép truyền giá trị null argc khi execve() được gọi.

Vấn đề đã xuất hiện từ tháng 2009 năm 6, kể từ khi bổ sung lệnh pkexec. Bản sửa lỗi cho lỗ hổng PolKit hiện có sẵn dưới dạng bản vá (không có bản vá nào được phát hành), nhưng do các nhà phát triển phân phối đã được thông báo trước về sự cố nên hầu hết các bản phân phối đều xuất bản bản cập nhật đồng thời với việc tiết lộ thông tin về lỗ hổng. Sự cố đã được khắc phục trong RHEL 7/8/0755, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux và Manjaro. Là một biện pháp tạm thời để chặn lỗ hổng bảo mật, bạn có thể xóa cờ gốc SUID khỏi chương trình /usr/bin/pkexec (“chmod XNUMX /usr/bin/pkexec”).



Nguồn: opennet.ru

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