Ich möchte ein Programm erstellen, das nach dem Start (mit Root-Rechten) nur schwer zu stoppen ist (selbst für den Administrator). Nach dem Start sollte sich der Prozess beim Start selbst fortsetzen, bis er zum Stoppen aufgefordert wird. Der Stoppvorgang sollte einige Zeit dauern (dh teuer sein).
Ich weiß, dass dies wie eine schädliche Software klingt, aber ich möchte es aus einem echten Grund. Ich möchte Site-Blocker auf meinem Laptop ausführen (auf dem ich der Administrator bin). Und ich möchte es mir schwer machen, sie aufzuhalten.
Die Lösung, an die ich gedacht habe, ist die folgende:
Der Prozess sollte jedes Mal mit einem anderen Namen ausgeführt werden, damit ich den Prozessnamen nicht vorhersagen und beenden kann.
Der Prozess speichert sich beim Herunterfahren in /etc/rc5.d
Der Prozess verschlüsselt seinen Namen mit einer Chiffre an einem bekannten Ort. Der Stoppvorgang muss Bruteforce verwenden, um den Programmnamen wiederherzustellen und zu beenden.
Ich würde gerne eine gute Lösung für diese Aufgabe finden.
Antworten:
Ein Ansatz könnte darin bestehen, PID-Namespaces zu verwenden:
Starten Sie Ihr System mit einem
init=/some/cmd
as-Kernel-Parameter, in dem/some/cmd
ein Prozess in einem neuen Namespace (CLONE_NEWPID
) gegabelt und ausgeführt/sbin/init
wird (PID 1 in diesem neuen Namespace und PID 2 im Root-Namespace). Führen Sie dann im übergeordneten Namespace Ihren " Programm".Sie möchten wahrscheinlich eine Möglichkeit, Ihr Programm auf die eine oder andere Weise zu steuern (z. B. TCP- oder ABSTRACT Unix-Socket).
Wahrscheinlich möchten Sie Ihr Programm im Speicher speichern und die meisten Verweise auf das Dateisystem schließen, damit es auf nichts angewiesen ist.
Dieser Prozess wird vom Rest des Systems nicht gesehen. Der Rest des Systems läuft praktisch wie in einem Container.
Wenn dieser Prozess abbricht, gerät der Kernel in Panik, was Ihnen eine zusätzliche Garantie gibt.
Ein unangenehmer Nebeneffekt ist jedoch, dass wir die Kernel-Threads in der Ausgabe von nicht sehen
ps
.Als Proof of Concept (mit diesem Trick können Sie eine Kopie Ihres Systems in einer virtuellen qemu-Maschine starten):
Erstellen Sie ein
/tmp/init
Like:(Sie benötigen
unshare
eine neuere Version von util-linux (2.14)). Oben verwenden wirsocat
als "Programm", das nur auf TCP-Verbindungen an Port 1234 mit der Ausgabe von antwortetps -efH
.Starten Sie dann Ihre VM wie folgt:
Dann sehen wir:
quelle
Ich bin mir nicht sicher, ob es die endgültige Lösung ist oder ob es der beste Weg ist, dies zu tun. Meine Meinungen:
Ändern Sie,
init
da dies der erste Prozess ist, wenn er stirbt. Alle anderen sterben ebenfalls. Ihre Maschine kann also nur damit verwendet werden.Erstellen Sie ein Kernelmodul und laden Sie abhängig davon kritische Module (wenn es getötet wird, führt dies zu einer Kettenreaktion wie im
init
Beispiel).Ändern Sie den Kernel so, dass Kill-Anforderungen für einen bestimmten Prozess ignoriert werden.
Denken Sie daran, dass die letzten beiden im Kernel-Modus ausgeführt werden (der in Bezug auf Bibliotheken und so einen sehr begrenzt ist). Das Ändern
init
wird im Benutzerbereich ausgeführt, sodass Sie viele Funktionen davon verwenden können.quelle