Zastanawiam się nad bezpieczeństwem sygnałów UNIX.
SIGKILL
zabije proces. Co się stanie, gdy proces użytkownika innego niż root wyśle sygnał do procesu użytkownika root? Czy proces nadal wykonuje procedurę obsługi sygnału?
Śledzę przyjętą odpowiedź (gollum) i piszę man capabilites
, i znajduję wiele rzeczy na temat jądra Linuksa. Od man capabilities
:
NAME
capabilities - overview of Linux capabilities
DESCRIPTION
For the purpose of performing permission checks, traditional UNIX
implementations distinguish two categories of processes: privileged
processes (whose effective user ID is 0, referred to as superuser or
root), and unprivileged processes (whose effective UID is nonzero).
Privileged processes bypass all kernel permission checks, while
unprivileged processes are subject to full permission checking based
on the process's credentials (usually: effective UID, effective GID,
and supplementary group list).
Starting with kernel 2.2, Linux divides the privileges traditionally
associated with superuser into distinct units, known as capabilities,
which can be independently enabled and disabled. Capabilities are a
per-thread attribute.
SIGKILL
, co jest szczególnym przypadkiem i całkowicie zarządzanym przez jądro, sygnały są jedynie żądaniem. Proces otrzymywania może z nimi zrobić, co tylko zechce.SIGKILL
iSIGSTOP
...SIGKILL
. PoczątkowoSIGINT
,SIGKILL
iSIGTERM
będzie miał dokładnie taki sam efekt, jedyną różnicą jest to, że proces odbierania może zmienić to ustawienie domyślne dla niektórych z nich.Odpowiedzi:
W systemie Linux zależy to od możliwości plików.
Weź następujące proste
mykill.c
źródło:Zbuduj to:
Teraz jako użytkownik root rozpocznij proces uśpienia w tle:
Teraz, jak zwykły użytkownik, spróbuj go zabić:
Teraz jako użytkownik root zmień
/tmp/mykill
wielkie litery:I spróbuj ponownie jako zwykły użytkownik:
Na koniec proszę usunąć
/tmp/mykill
z oczywistych powodów;)źródło
Nic:
źródło
kill(2)
strona podręcznika wyjaśnia:źródło
sygnał byłby przenoszony, ale właściciel procesu należy do katalogu głównego. więc drugi użytkownik nie ma prawa zakończyć procesu, więc pojawi się problem z błędem uprawnień.
zakończenie procesu jest możliwe tylko wtedy, gdy posiadasz własność (odpowiednie prawa) procesu.
źródło