Machen Sie einen Prozess unter Linux unkillable

14

Ich arbeite an einer Passwort-Manager-Anwendung und möchte aus Sicherheitsgründen einen nicht abschließbaren Prozess starten.

Außerdem möchte ich nicht, dass dieses Programm ein Daemon ist, da ich von der Standardeingabe lesen und darauf schreiben muss.

Gibt es eine Möglichkeit, dies zu tun?

Mohammad Razeghi
quelle
11
"Aus Sicherheitsgründen möchte ich einen nicht zu tötenden Prozess starten." Nur eine Anmerkung - wenn dies erlaubt wäre, könnten die Leute es aus schändlichen Gründen leicht ausnutzen - z. B. eine unaufhaltsame Gabelbombe abschießen.
VLAZ,
32
Das klingt nach einem XY-Problem . Ich vermute, was auch immer Sie wirklich erreichen wollen, ein nicht zu tötender Prozess ist nicht der richtige Weg. "Aus Sicherheitsgründen" ist sehr vage. Was genau möchten Sie den Benutzer davon abhalten, zu tun? Welchen Zugang haben sie?
Nate Eldredge,
4
Jeder Prozess, der in jeder Hinsicht nicht zu töten ist, ist ein Virus.
Naftuli Kay
3
@NateEldredge: Lassen Sie das Programm die Signale eher ignorieren. Das ist die typische Vorgehensweise. Andernfalls könnte jemand unter Umgehung des Terminals ein SIGINT oder SIGTSTP direkt an den Prozess senden.
Noah Spurrier,
2
@ NoahSpurrier: Ich stelle mir eine Situation vor, in der Sie einen Benutzer haben, der Dinge auf der Konsole eingeben kann, aber sonst keinen Code auf dem Computer ausführen kann (wie ein Kiosk). Sie richten es so ein, dass kein Schlüssel, den sie eingeben können, einen unerwarteten Effekt hat. Wenn sie anderen Code ausführen können, hilft es nicht, SIGINT und SIGTSTP sowie SIGQUIT zu ignorieren. Jeder, der diese Signale direkt an den Prozess senden kann, kann auch SIGKILL oder SIGSTOP senden, die Sie nicht ignorieren können.
Nate Eldredge

Antworten:

41

Machen Sie die Passwort - Manager läuft unter einem separaten Benutzer und Griff / ignorieren / Blockendgeräte erzeugten Signale ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, und SIGTTOU).

Sie können keine Signale an (= kill) -Prozesse senden, die unter einem anderen Benutzer ausgeführt werden (Benutzer, dessen tatsächliche und gespeicherte UID sich von Ihrer effektiven UID unterscheidet), es sei denn, Ihre effektive ID ist 0 (root).

Alle Prozesse können weiterhin von root abgebrochen werden.

Weitere Einzelheiten finden Sie unter kill (2) .

PSkocik
quelle
15

Die einzige Möglichkeit, einen Prozess zum Absturz zu bringen, besteht darin, ihn als Kernel-Thread zu implementieren , was nicht trivial ist.

Sie können es immer noch töten, aber das wäre ein Kollateralschaden beim Herunterfahren des Betriebssystems.

Sie können auch ein benutzerdefiniertes Kernelmodul entwickeln, das das SIGNAL_UNKILLABLEFlag für Ihren Prozess setzt. Dieses Flag ist so konzipiert, dass es nur für init(oder systemdunabhängig vom Startprozess des Kernels) gesetzt wird, die die einzigen Userland-Prozesse sind, die vor einem bedingungslosen Kill geschützt sind, aber nichts scheint zu verbieten, dass dieses Flag für einen regulären Prozess vorhanden ist.

jlliagre
quelle
1
Es könnte der Init-Prozess sein
muhmuhten
@muhmuhten Sie haben recht, init ist ein Userland-Prozess, der vor einem bedingungslosen Kill geschützt ist. Es ist jedoch nicht zum Anpassen gedacht, da es definitiv eine API für Kernelmodule und Threads gibt.
Juli
Um meine eigene Antwort zu erläutern, gehe ich davon aus, dass Sie keinen Zugriff auf ein Root-Konto haben (was im Übrigen darauf hindeutet, dass es sich entweder um ein Spielzeugbeispiel, ein Kursprojekt oder um Malware handelt). Dies schließt die Idee aus, dass Sie ein Kernelmodul für diesen Zweck verkabeln könnten. Beachten Sie auch, dass das SIGNAL_UNKILLABLE-Flag für normale Prozesse nicht verfügbar ist und einige wichtige normale Vorgänge (z. B. Vforking) ausschließt. Ich würde es daher als einen normalerweise unpraktischen Randfall betrachten.
GregD
@jlliagre ist es in der Tat nicht.
Muhmuhten
@dudek Ein nicht tötbarer Prozess ist bereits ein normalerweise unpraktischer Randfall.
Juli
11

Technisch gesehen gibt es keine Möglichkeit, einen Prozess nicht zum Erliegen zu bringen.

Natürlich können Nicht-Root-Benutzer nur Prozesse beenden, die dieselbe Benutzer-ID wie sie haben. Wenn Sie also unterschiedliche Konten einrichten können, können Sie eine "eindeutige" Benutzer-ID für den Prozess verwenden, die dann nur von Root beendet werden kann.

Eine einfache, aber weniger robuste Lösung besteht darin, dass Ihr Prozess so viele Signale wie möglich erfasst (möglicherweise ignoriert). Dies ist nur für Spielzeugbeispiele oder nicht-kontroverse Umgebungen geeignet, da es keine Möglichkeit gibt, das KILL-Signal (Signal 9) abzufangen, ansonsten können Sie vermeiden, von ihnen getötet zu werden.

Schließlich können Sie veranlassen, dass Ihr Prozess erneut gestartet wird, wenn er getötet wird. Dies ist ebenfalls zerbrechlich (sehr zerbrechlich), erschwert jedoch das Löschen. Dies kann mithilfe eines eigenen Monitorprozesses oder mithilfe von inittab erfolgen. Für einen Gegner, der weiß, was er tut, kann dies leicht umgangen werden, indem mehrere Prozesse gleichzeitig beendet werden.

GregD
quelle
1
Aber (außer inittab) ist es möglich, dass der Monitorprozess auch beendet werden kann, oder?
Roaima
Nein, Gerätetreiber (Kernelmodule) können Prozesse erstellen, die nicht von root beendet werden können.
Noah Spurrier