Chỉ trong cùng một cách modprobe
"đánh bại" bảo mật bằng cách tải mã mới vào kernel.
Vì nhiều lý do, đôi khi có ý nghĩa hơn khi có mã bán đặc quyền (như trình điều khiển đồ họa bên trong máy chủ X) chạy trong không gian người dùng thay vì luồng nhân.
- Có thể
kill
dễ dàng hơn, trừ khi nó khóa CTNH.
- Có yêu cầu trang mã / dữ liệu của nó từ các tệp trong hệ thống tệp. (Bộ nhớ kernel không thể phân trang)
- Cung cấp cho nó không gian địa chỉ ảo của riêng nó, nơi các lỗi trong máy chủ X có thể làm sập máy chủ X mà không lấy kernel.
Nó không làm được gì nhiều cho bảo mật, nhưng có những lợi thế lớn về độ tin cậy và kiến trúc phần mềm.
Trình điều khiển đồ họa nướng vào kernel có thể làm giảm chuyển đổi ngữ cảnh giữa máy khách X và máy chủ X, giống như chỉ một người dùng-> kernel-> người dùng thay vì phải đưa dữ liệu vào một quy trình sử dụng không gian khác, nhưng về mặt lịch sử, máy chủ X quá lớn và quá lỗi muốn chúng đầy đủ trong kernel.
Có, mã độc với những quyền riêng tư này có thể chiếm quyền hạt nhân nếu nó muốn, sử dụng /dev/mem
để sửa đổi mã hạt nhân.
Hoặc trên x86 chẳng hạn, hãy chạy một cli
lệnh để vô hiệu hóa các ngắt trên lõi đó sau khi thực hiện một iopl
cuộc gọi hệ thống để đặt mức đặc quyền IO của nó thành chuông 0.
Nhưng ngay cả x86 iopl
"chỉ" cung cấp quyền truy cập vào một số hướng dẫn : vào / ra (và các phiên bản chuỗi in / outs) và cli / sti. Nó không cho phép bạn sử dụng rdmsr
hoặc wrmsr
đọc hoặc ghi "các thanh ghi cụ thể của mô hình" (ví dụ: IA32_LSTAR
đặt địa chỉ điểm nhập hạt nhân cho lệnh x86-64 syscall
) hoặc sử dụng lidt
để thay thế bảng mô tả ngắt (sẽ cho phép bạn hoàn toàn lấy qua máy từ kernel hiện có, ít nhất là trên lõi đó.)
Bạn thậm chí không thể đọc các thanh ghi điều khiển (như CR3 chứa địa chỉ vật lý của thư mục trang cấp cao nhất, một quá trình tấn công có thể hữu ích như một sự bù đắp /dev/mem
để sửa đổi các bảng trang của chính nó như là một thay thế cho mmap
nhiều hơn /dev/mem
. )
invd
(làm mất hiệu lực tất cả các bộ nhớ cache mà không cần ghi lại !! ( trường hợp sử dụng = BIOS sớm trước khi RAM được cấu hình)) là một điều thú vị khác luôn yêu cầu CPL 0 đầy đủ (mức đặc quyền hiện tại), không chỉ IOPL. Thậm chí wbinvd
là đặc quyền bởi vì nó rất chậm (và không bị gián đoạn), và phải xóa tất cả các bộ nhớ cache trên tất cả các lõi. (Xem Có cách nào để xóa toàn bộ bộ đệm CPU liên quan đến chương trình không? Và cách sử dụng lệnh WBINVD )
Lỗi dẫn đến việc nhảy đến một địa chỉ xấu đang chạy dữ liệu dưới dạng mã do đó không thể thực hiện bất kỳ hướng dẫn nào trong số các hướng dẫn này trong máy chủ X không gian người dùng.
Mức đặc quyền hiện tại (ở chế độ dài và được bảo vệ) là 2 bit thấp của cs
(bộ chọn phân đoạn mã) . mov eax, cs
/ and eax, 3
hoạt động ở bất kỳ chế độ nào để đọc cấp đặc quyền.
Để viết cấp đặc quyền, bạn thực hiện jmp far
hoặc call far
đặt CS:RIP
(nhưng mục nhập GDT / LDT cho phân khúc mục tiêu có thể hạn chế cấp dựa trên cấp đặc quyền cũ, đó là lý do tại sao không gian người dùng không thể làm điều này để tự nâng cao). Hoặc bạn sử dụng int
hoặc syscall
để chuyển sang vòng 0 tại điểm nhập kernel.
iopl
không cho phép tất cả các hướng dẫn đặc quyền, vì vậy nó vẫn hữu ích để đảm bảo chương trình không gian người dùng bị lỗi không vô tình chạyinvd
bằng cách nhảy qua một con trỏ hàm bị hỏng chỉ vào bộ nhớ thực thi bắt đầu bằng0F 08
byte. Tôi đã thêm một câu trả lời với một số lý do không bảo mật tại sao việc xử lý không gian người dùng nâng cao đặc quyền của họ là hữu ích.