Bezplikowe złośliwe oprogramowanie atakuje cel, wykorzystując lukę, np. We wtyczce Flash przeglądarki lub w protokole sieciowym.
Proces systemu Linux można zmodyfikować za pomocą wywołania systemowego ptrace()
. To wywołanie systemowe jest zwykle używane przez debuggery do kontroli i zarządzania stanem wewnętrznym procesu docelowego i jest przydatne w rozwoju oprogramowania.
Rozważmy na przykład proces z PID 1234. Całą przestrzeń adresową tego procesu można wyświetlić w pseudo-systemie plików /proc
w lokalizacji /proc/1234/mem
. Możesz otworzyć ten pseudoplik, a następnie dołączyć do tego procesu za pośrednictwem ptrace()
; po wykonaniu tej czynności możesz używać pread()
i pwrite()
pisać w przestrzeni procesu.
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);
(Kod pochodzi stąd . Kolejny artykuł na temat exploita ptrace jest dostępny tutaj .)
Jeśli chodzi o zorientowaną na jądro obronę przed tymi atakami, jedynym sposobem jest zainstalowanie łat dostawcy jądra i / lub wyłączenie określonego wektora ataku. Na przykład w przypadku ptrace możesz załadować moduł blokujący ptrace do jądra, który wyłączy to określone wywołanie systemowe; najwyraźniej sprawia to, że nie można używać ptrace do debugowania.