Tình trạng tương tranh trong trình thu thập rác của nhân Linux có thể dẫn đến leo thang đặc quyền

Jann Horn từ nhóm Google Project Zero, người từng xác định lỗ hổng Spectre và Meltdown, đã công bố kỹ thuật khai thác lỗ hổng (CVE-2021-4083) trong trình thu gom rác nhân Linux. Lỗ hổng này là do tình trạng chạy đua khi dọn sạch bộ mô tả tệp trên ổ cắm unix và có khả năng cho phép người dùng cục bộ không có đặc quyền thực thi mã của họ ở cấp hạt nhân.

Vấn đề rất thú vị vì khoảng thời gian xảy ra tình trạng chạy đua được ước tính là quá nhỏ để tạo ra các hoạt động khai thác thực sự, nhưng tác giả của nghiên cứu đã chỉ ra rằng ngay cả những lỗ hổng đáng nghi ngờ ban đầu như vậy cũng có thể trở thành nguồn gốc của các cuộc tấn công thực sự nếu người tạo ra khai thác có những kỹ năng và thời gian cần thiết. Yann Horn đã chỉ ra cách, với sự trợ giúp của các thao tác filigree, bạn có thể giảm tình trạng chạy đua xảy ra khi gọi các hàm close() và fget() đồng thời thành một lỗ hổng use-after-free hoàn toàn có thể khai thác được và đạt được quyền truy cập vào dữ liệu đã được giải phóng cấu trúc bên trong hạt nhân.

Một tình trạng tương tranh xảy ra trong quá trình đóng bộ mô tả tệp trong khi gọi close() và fget() cùng một lúc. Lệnh gọi close() có thể xảy ra trước khi fget() được thực thi, điều này sẽ gây nhầm lẫn cho trình thu gom rác vì theo số lần đếm lại, cấu trúc tệp sẽ không có tham chiếu bên ngoài nhưng sẽ vẫn được đính kèm với bộ mô tả tệp, tức là. Trình thu gom rác sẽ nghĩ rằng nó có quyền truy cập độc quyền vào cấu trúc, nhưng trên thực tế, trong một khoảng thời gian ngắn, mục nhập còn lại trong bảng mô tả tệp vẫn sẽ trỏ đến cấu trúc được giải phóng.

Để tăng khả năng rơi vào tình trạng chạy đua, một số thủ thuật đã được sử dụng, giúp tăng xác suất khai thác thành công lên 30% khi giới thiệu các tối ưu hóa dành riêng cho hệ thống. Ví dụ: để tăng thời gian truy cập cấu trúc bằng bộ mô tả tệp lên vài trăm nano giây, dữ liệu đã bị xóa khỏi bộ nhớ đệm của bộ xử lý bằng cách rải rác bộ nhớ đệm bằng hoạt động trên một lõi CPU khác, điều này giúp có thể truy xuất cấu trúc từ bộ nhớ thay vì từ bộ đệm CPU nhanh.

Tính năng quan trọng thứ hai là việc sử dụng các ngắt do bộ đếm thời gian phần cứng tạo ra để tăng thời gian điều kiện cuộc đua. Thời điểm được chọn để trình xử lý ngắt sẽ kích hoạt khi xảy ra tình trạng dồn đuổi và làm gián đoạn quá trình thực thi mã trong một thời gian. Để trì hoãn hơn nữa việc trả lại quyền kiểm soát, khoảng 50 nghìn mục nhập trong hàng chờ đã được tạo bằng epoll, yêu cầu tìm kiếm thông qua trình xử lý ngắt.

Kỹ thuật khai thác lỗ hổng đã được tiết lộ sau khoảng thời gian 90 ngày không tiết lộ. Sự cố xuất hiện kể từ kernel 2.6.32 và đã được khắc phục vào đầu tháng 5.16. Bản sửa lỗi được bao gồm trong kernel 2021 và cũng được chuyển sang các nhánh LTS của kernel và gói kernel được cung cấp trong các bản phân phối. Đáng chú ý là lỗ hổng này đã được xác định trong quá trình phân tích sự cố tương tự CVE-0920-XNUMX, xuất hiện trong trình thu gom rác khi xử lý cờ MSG_PEEK.

Nguồn: opennet.ru

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