So deaktivieren Sie den Befehl „kill“ unter Linux

So deaktivieren Sie den Befehl „kill“ unter Linux

Ich möchte alle Kill-Befehle deaktivieren (auch für den Root-Benutzer). Ich habe versucht, die Berechtigungen zu ändern, aber der Befehl kann immer noch ausgeführt werden. Gibt es eine Möglichkeit, das zu tun?

Antwort1

Das "Deaktivieren" killvon root, selbst wenn es möglich wäre, hätte höchstwahrscheinlich unerwünschte Nebenwirkungen, wie z. B. Fehlfunktionen von Systemskripten, und im schlimmsten (aber wahrscheinlichsten) Szenario würde es verhindern, dass Ihr Computer richtig startet (oder sogarHerunterfahrenrichtig).

Auch für einen Benutzer würde es Probleme verursachen. Ich habe beispielsweise Skripte, die ich als nicht privilegierter Benutzer ausführe und die prüfen, ob bestimmte Prozesse mit ausgeführt werden kill -0 $pid. Diese Skripte würden nicht mehr funktionieren.

Sie selbst könnten aliasden killBefehl auch anders formulieren, etwa echo "kill":

$ alias kill='echo "kill"'

Dies würde killzumindest verhindern, dass auf der Befehlszeile sinnvolle Aktionen ausgeführt werden:

$ kill -s HUP $$
kill -s HUP 11985

Antwort2

Verwenden Sie dieses Kernelmodul, um den killSystemaufruf zu deaktivieren amd64.
Die Verwendung erfolgt auf eigene Gefahr. Es sind verheerende Nebenwirkungen zu erwarten.

#include <linux/module.h>

MODULE_LICENSE("GPL");

int __init init(void) __attribute__((noreturn))
{
     unsigned long long cr0 = read_cr0();
     write_cr0(cr0 & ~(1 << 16));  /* Clear Write Protection (WP) bit */
     *(unsigned char *)sys_kill = 0xc3;  /* opcode for "ret" */
     write_cr0(cr0);

     /* This makes sure that delete_module below won't complain */
     __this_module.refcnt = 1;
     __this_module.state = MODULE_STATE_LIVE;

     asm volatile
     (
          "mov %0, %%rsp\n\t" /* It seems GCC refuses to mess with the stack pointer */
          "jmp sys_delete_module\n\t"  /* call delete_module(name, flags) */
          :: "r"(current->stack + THREAD_SIZE - sizeof(struct pt_regs) - 8), "D"(__this_module.name), "S"(0) :
     );
}

void __exit exit(void)
{
    return;
}

Kompilieren Sie es wie jedes andere Modul. Verwenden Sie insmodes dann.

Antwort3

Dusollte nichtDeaktivieren Sie es systemweit, da es in Systemskripten (z. B. im /etc/init.d/functionsPaket initscripts) verwendet wird.

Sie können es deaktivierenfür die Login-Shell(und seine Unterschalen) durchalias'ing es beispielsweise auf true/ false(oder etwas wie kill_disabled, wenn Sie einen Fehler statt eines No-Op erhalten möchten).

Beachten Sie, dass diese Methode nicht narrensicher ist: Sie wirkt sich nur auf direkt ausgeführte Befehle aus (nicht auf solche in Skripten). Und der Benutzer kann den Alias ​​mit entfernen unalias.


Führen Sie dazu den folgenden Befehl aus

alias kill=kill_disabled

oder fügen Sie es zu einem geeignetenbashStartdateium es bei jeder Anmeldung auszuführen.

Die interaktive Ausführung führt nun killzu Folgendem:

$ kill 9999
-bash: kill_disabled: command not found

Wie gesagt, der obige Weg kann leicht unterlaufen werden. Wenn Sie einen narrensicheren Weg brauchen, besteht die einzige Lösung darin, die gesamte Login-Shell-Sitzung in einemchrootUmgebung. Es deaktiviert weiterhin nur dieLagerbefehl,kein direkter Systemaufruf, jedoch erfolgt. Letzteres kann nicht deaktiviert werden, da es für den normalen Betrieb unerlässlich ist (z. B. sendet jedes Ctrl+ , Pipes erfordern und Hintergrundprozesse werden mit mehr als fünf verschiedenen Signalen gesteuert). Das Einrichten einer Chroot-Umgebung ist eine fortgeschrittene Aufgabe und im Allgemeinen unpraktisch, wenn der Benutzer auf das gesamte Dateisystem zugreifen muss.CSIGINTSIGPIPE

Antwort4

Wenn Sie möchten, dass die Benutzer es normal verwenden können, killaußer wenn sie versuchen, Ihr spezielles Programm zu beenden, können Sie killim .bashrcBenutzerprofil eine Funktion definieren und innerhalb dieser Funktion prüfen, ob der Benutzer versucht, Ihr Programm zu beenden. Wenn nicht, können Sie das killDienstprogramm innerhalb Ihrer Funktion selbst aufrufen.

Als Beispiel habe ich eine kleine Kill-Funktion geschrieben, die das Dienstprogramm nicht beendet, sleepsondern für alle anderen bereitgestellten Parameter wie ein normales Kill-Dienstprogramm funktioniert.

function kill() {
    process=$(ps -p "${@: -1}" | awk 'END{print $(NF)}');
    if [[ $process == "sleep"]]
    then
        echo "Killing $process is not allowed"
    else
        /bin/kill $@
    fi
}

verwandte Informationen