Lỗ hổng bảo mật trong nhân Linux có thể giả mạo các tệp chỉ đọc

Một lỗ hổng đã được xác định trong nhân Linux (CVE-2022-0847) cho phép ghi đè nội dung của bộ đệm trang đối với bất kỳ tệp nào, kể cả những tệp ở chế độ chỉ đọc, được mở bằng cờ O_RDONLY hoặc nằm trên hệ thống tệp được gắn ở chế độ chỉ đọc. Trong thực tế, lỗ hổng này có thể được sử dụng để chèn mã vào các quy trình tùy ý hoặc làm hỏng dữ liệu trong các tệp đã mở. Ví dụ: bạn có thể thay đổi nội dung của tệp ủy quyền cho quy trình sshd. Một nguyên mẫu khai thác đã có sẵn để thử nghiệm.

Vấn đề được đặt tên mã là Dirty Pipe, tương tự như lỗ hổng nghiêm trọng Dirty COW được xác định vào năm 2016. Cần lưu ý rằng xét về mức độ nguy hiểm thì Dirty Pipe có cùng mức độ với Dirty COW nhưng dễ vận hành hơn rất nhiều. Lỗ hổng này được xác định trong quá trình phân tích các khiếu nại về lỗi định kỳ của các tệp được tải xuống qua mạng trong hệ thống tải xuống các kho lưu trữ nén từ máy chủ nhật ký (37 lỗi trong 3 tháng trên một hệ thống được tải), quá trình chuẩn bị sử dụng thao tác splice() và những đường ống không tên.

Lỗ hổng xuất hiện bắt đầu từ nhân Linux 5.8, được phát hành vào tháng 2020 năm 11, tức là. có trong Debian 20.04, nhưng không ảnh hưởng đến kernel cơ sở trong Ubuntu 8 LTS. Các hạt nhân RHEL 15.x và openSUSE/SUSE 5.16.11 ban đầu dựa trên các nhánh cũ, nhưng có thể thay đổi gây ra sự cố đã được đưa vào chúng (chưa có dữ liệu chính xác). Bạn có thể theo dõi việc xuất bản các bản 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. Bản sửa lỗi cho lỗ hổng bảo mật đã được đề xuất trong các bản phát hành 5.15.25, 5.10.102 và XNUMX. Bản sửa lỗi cũng được bao gồm trong kernel được sử dụng trong nền tảng Android.

Lỗ hổng này xảy ra do thiếu khởi tạo giá trị “buf->flags” trong mã của hàm copy_page_to_iter_pipe() và push_pipe(), mặc dù thực tế là bộ nhớ không bị xóa khi cấp phát cấu trúc và trong một số thao tác nhất định với các đường ống không tên, một giá trị từ một hoạt động khác. Sử dụng tính năng này, người dùng cục bộ không có đặc quyền có thể đạt được sự xuất hiện của giá trị PIPE_BUF_FLAG_CAN_MERGE trong cờ, cho phép bạn tổ chức ghi đè dữ liệu trong bộ đệm trang bằng cách chỉ cần ghi dữ liệu mới vào một ống không tên được chuẩn bị đặc biệt.

Đối với một cuộc tấn công, tệp mục tiêu phải có thể đọc được và vì quyền truy cập không được kiểm tra khi ghi vào pipe, nên việc thay thế trong bộ đệm trang cũng có thể được thực hiện đối với các tệp nằm trong phân vùng được gắn ở chế độ chỉ đọc (ví dụ: đối với tệp c CD- ROM). Sau khi thay thế thông tin trong bộ đệm trang, khi đọc dữ liệu từ một tệp, quá trình sẽ không nhận được dữ liệu thực tế mà là dữ liệu được thay thế.

Hoạt động bao gồm việc tạo một kênh không tên và điền dữ liệu tùy ý vào kênh đó để đảm bảo rằng cờ PIPE_BUF_FLAG_CAN_MERGE được đặt trong tất cả các cấu trúc vòng được liên kết với nó. Tiếp theo, dữ liệu được đọc từ kênh, nhưng cờ vẫn được đặt trong tất cả các phiên bản của cấu trúc pipe_buffer trong cấu trúc vòng pipe_inode_info. Sau đó, lệnh gọi splice() được thực hiện để đọc dữ liệu từ tệp đích vào một ống không tên, bắt đầu từ offset mong muốn. Khi ghi dữ liệu vào pipe không tên này, do cờ PIPE_BUF_FLAG_CAN_MERGE được đặt, dữ liệu trong bộ đệm trang sẽ bị ghi đè thay vì tạo một phiên bản mới của cấu trúc pipe_buffer.

Nguồn: opennet.ru

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