Phần mềm độc hại không tên tấn công mục tiêu bằng cách khai thác lỗ hổng, ví dụ như trong plugin Flash của trình duyệt hoặc trong giao thức mạng.
Một quy trình Linux có thể được sửa đổi bằng cách sử dụng lệnh gọi hệ thống ptrace()
. Cuộc gọi hệ thống này thường được sử dụng bởi các trình gỡ lỗi để kiểm tra và quản lý trạng thái bên trong của quy trình đích và rất hữu ích trong việc phát triển phần mềm.
Chẳng hạn, hãy xem xét một quy trình với PID 1234. Toàn bộ không gian địa chỉ của quá trình này có thể được xem trong hệ thống tệp giả /proc
tại vị trí /proc/1234/mem
. Bạn có thể mở tệp giả này, sau đó đính kèm vào quy trình này thông qua ptrace()
; sau khi làm như vậy, bạn có thể sử dụng pread()
và pwrite()
ghi vào không gian quy trình.
char file[64];
pid = 1234;
sprintf(file, "/proc/%ld/mem", (long)pid);
int fd = open(file, O_RDWR);
ptrace(PTRACE_ATTACH, pid, 0, 0);
waitpid(pid, NULL, 0);
off_t addr = ...; // target process address
pread(fd, &value, sizeof(value), addr);
// or
pwrite(fd, &value, sizeof(value), addr);
ptrace(PTRACE_DETACH, pid, 0, 0);
close(fd);
(Mã được lấy từ đây . Một bài báo khác về khai thác ptrace có sẵn ở đây .)
Liên quan đến phòng thủ hướng kernel chống lại các cuộc tấn công này, cách duy nhất là cài đặt các bản vá của nhà cung cấp kernel và / hoặc vô hiệu hóa vectơ tấn công cụ thể. Ví dụ, trong trường hợp ptrace, bạn có thể tải mô-đun chặn ptrace vào kernel sẽ vô hiệu hóa lệnh gọi hệ thống cụ thể đó; rõ ràng điều này cũng làm cho bạn không thể sử dụng ptrace để gỡ lỗi.