2016-04-01 17 views
0

Ich versuche eine Gabelbombe zu finden, und durch diesen Prozess versuche ich, die Nachkommenzahl jedes Prozesses zu berechnen. Ich möchte jedoch nur die Anzahl der Nachkommen für Nicht-Systemprozesse berechnen, da die Gabelbombe ein Nicht-Systemprozess ist. Ich bin mir jedoch nicht sicher, wie das geht. Das ist, was ich habe, so weit:C - Wie überprüft man, ob ein Prozess ein Systemprozess ist?

struct task_struct *pTask; 
for_each_process(pTask) 
{ 
    struct task_struct *p; 
    *p = *pTask; 

    //trace back to every ancestor 
    for(p = current; p != &init_task; p->parent) 
    { 
     //increment the descendant count of p's parent    
    } 
} 

Diese Schleife geht bis zur init Aufgabe korrekt, da es &init_task ist? Gibt es eine Möglichkeit, stattdessen zum ersten Systemprozess zu gehen und zu stoppen? Weil zum Beispiel die Gabelbombe das unmittelbare Kind eines Systemprozesses ist. Jede Hilfe würde sehr geschätzt werden, danke !!

[EDIT] Und durch Systemprozess, meine ich Dinge wie zum Beispiel, bash. Ich hätte das besser erklären sollen, aber auf der Basisebene möchte ich keinen Prozess löschen, der beim Hochfahren läuft. Alle Prozesse, die aus User-Space stammen, die nach dem Hochfahren ausgeführt werden, sind faires Spiel, andere Prozesse jedoch nicht. Und ich werde nicht nach irgendetwas wie tomcat, httpd suchen, weil ich 100% weiß, dass diese Prozesse nicht ausgeführt werden.

+3

Was ist ein "Systemprozess?" – fuz

+2

Was nennen Sie einen * System * Prozess? Ein Prozess im Besitz von root? Was denkst du über den 'sshd'-Daemon? Was ist mit einem 'Tomcat' oder Apache' httpd' (generell ** nicht ** als root laufen) auf einem Webserver? Möchten Sie eine Whitelist erstellen? Jeder Prozess im System ist ein Enkel von Pid 1 ... –

+0

@SergeBallesta Ich habe meine Frage aktualisiert, Entschuldigung für die unklaren Details! Hoffnung, die Sinn macht. – ocean800

Antwort

1

Ein Login-Shell bashexec von einem anderen Prozess Ed (welcher Prozess abhängt, ob es sich um eine Konsole Login-Shell, SSH Login-Shell, Gnom-Terminal-Shell ist, etc.) Das Verfahren exec ing bashexec durch init ed oder ein anderer Prozess, der von init gestartet wurde, nicht vom Kernel.

Ein Benutzer kann leicht ein Bash-Skript erstellen, das sich selbst forkst. Wenn Sie also /bin/bash von Ihrer Überprüfung ausnehmen, werden in Bash geschriebene Gabel-Bomben nicht erkannt. Zum Beispiel wird das folgende Skript, das in eine Datei mit dem Namen foo eingefügt und im aktuellen Verzeichnis ausgeführt wird, eine Gabelbombe erstellen.

#!/bin/bash 
while [ /bin/true ] 
do 
    ./foo & 
done 

Werfen Sie einen Blick auf ulimit in bash(1) oder setrlimit(2), wenn Sie die Anzahl der Prozesse ein bestimmte Benutzer ausführen kann begrenzen wollen.

Oder Sie könnten einen wirklich hohen Schwellenwert für die Nachkommenzählung festlegen, die das Löschen eines Prozesses auslöst. Wenn die Kette der Eltern zurück zu init mehrere hundert tief ist, dann geht wohl etwas Fischiges vor sich.

1

Sie können die logind/ConsoleKit2 D-Bus-APIs verwenden, um die Sitzung eines Prozesses anhand seiner PID zu ermitteln. "System" -Prozesse (IIRC) haben keine Sitzung.

Offensichtlich erfordert dies Logind (Teil von Systemd) oder ConsoleKit2 ausgeführt werden.

Ohne einen solchen Dienst, der Benutzersitzungen verfolgt, gibt es möglicherweise keine zuverlässige Möglichkeit, einen "System" -Prozess von einem Benutzerprozess zu unterscheiden, außer vielleicht nach Benutzer-ID (vorausgesetzt, dass Ihre Gabelbombe nicht als Systembenutzer). Auf vielen Distributionen sind System-Benutzer-IDs kleiner als 1000, und normale Benutzer-IDs sind> = 1000, mit Ausnahme des Benutzers "nobody" (normalerweise 65534).

Verwandte Themen