Ich frage mich über die Sicherheit von UNIX-Signalen.
SIGKILL
bricht den Prozess ab. Was passiert also, wenn ein Nicht-Root-Benutzer ein Signal an den Prozess eines Root-Benutzers sendet? Führt der Prozess den Signalhandler noch aus?
Ich folge der akzeptierten Antwort (gollum's), tippe man capabilites
und finde viele Dinge über den Linux-Kernel. Von 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
, was ein Sonderfall ist und vollständig vom Kernel verwaltet wird, sind Signale lediglich eine Anfrage. Der Empfangsprozess kann mit ihnen alles machen, was sie wollen.SIGKILL
undSIGSTOP
...SIGKILL
abgebrochen. Am AnfangSIGINT
,SIGKILL
undSIGTERM
wird genau die gleiche Wirkung hat, ist der einzige Unterschied , dass der Empfangsprozess für einige von ihnen diese Standardeinstellung ändern.Antworten:
Unter Linux hängt es von den Dateifunktionen ab.
Nehmen Sie die folgende einfache
mykill.c
Quelle:baue es:
Starten Sie nun als Benutzer root einen Sleep-Prozess im Hintergrund:
Jetzt als normaler Benutzer versuchen, es zu töten:
Ändern Sie nun als Root-Benutzer die
/tmp/mykill
Caps:Und versuchen Sie es als normaler Benutzer erneut:
Zum Schluss bitte
/tmp/mykill
aus offensichtlichen Gründen streichen ;)quelle
Nichts:
quelle
kill(2)
Manpage erklärt:quelle
das Signal würde tragen, aber der Prozessbesitzer gehört zu root. Daher hat der andere Benutzer nicht das Recht, den Vorgang zu beenden, sodass Sie ein Berechtigungsfehlerproblem erhalten.
Das Beenden eines Prozesses ist nur möglich, wenn Sie das Eigentum (die entsprechenden Rechte) an dem Prozess besitzen.
quelle