Prozesse eines Benutzers verstecken
Prozesse eines Benutzers verstecken
Hallo,
ich würde gerne folgendes unter Linux realisieren:
Das Programm ps soll alle Prozesse eines bestimmten Benutzers bzw. einer bestimmten Benutzer-ID nicht anzeigen.
Um dies zu realisieren, sollte man nur die Source(Header)-Dateien des Kernels modifizieren, damit man anschließend den Kernel übersetzen und installieren kann.
Ich wäre sehr froh, wenn mir jemand helfen könnte. Auch nur ein Tipp, wo man z.B ansetzen müsste, wäre sehr hilfreich.
Grüße
wedge
ich würde gerne folgendes unter Linux realisieren:
Das Programm ps soll alle Prozesse eines bestimmten Benutzers bzw. einer bestimmten Benutzer-ID nicht anzeigen.
Um dies zu realisieren, sollte man nur die Source(Header)-Dateien des Kernels modifizieren, damit man anschließend den Kernel übersetzen und installieren kann.
Ich wäre sehr froh, wenn mir jemand helfen könnte. Auch nur ein Tipp, wo man z.B ansetzen müsste, wäre sehr hilfreich.
Grüße
wedge
Was denn nun, die Sourcen oder die Header? Neu kompilieren musst du auf jeden Fall.
Guck dir mal die struct task_struct in /usr/src/linux/include/linux/sched.h an. Da ist unter anderem die uid drin. In kernel/pid.c gibt es eine Funktion get_pid_task(), die eine struct task_struct zu einer PID zurückliefert. Existiert kein Prozess mit dieser PID, liefert sie NULL zurück.
Diese Funktion wird in fs/proc/internal.h get_proc_task() aufgerufen, um zu einer inode in /proc die passende struct task_struct zurückzubekommen. Prüft man nun das Feld uid der struct task_struct, kann man bei einem Treffer NULL zurückgeben, und der Eintrag in /proc wird für diesen Prozess nicht erzeugt. Damit listet ihn das übliche ps auch nicht.
Das ich glaube, dass das ein Contest ist: Ich habe noch eine wichtige Sache weggelassen. Welche?
Janka
Guck dir mal die struct task_struct in /usr/src/linux/include/linux/sched.h an. Da ist unter anderem die uid drin. In kernel/pid.c gibt es eine Funktion get_pid_task(), die eine struct task_struct zu einer PID zurückliefert. Existiert kein Prozess mit dieser PID, liefert sie NULL zurück.
Diese Funktion wird in fs/proc/internal.h get_proc_task() aufgerufen, um zu einer inode in /proc die passende struct task_struct zurückzubekommen. Prüft man nun das Feld uid der struct task_struct, kann man bei einem Treffer NULL zurückgeben, und der Eintrag in /proc wird für diesen Prozess nicht erzeugt. Damit listet ihn das übliche ps auch nicht.
Das ich glaube, dass das ein Contest ist: Ich habe noch eine wichtige Sache weggelassen. Welche?
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
-
- Posts: 430
- Joined: 03. Mar 2006 23:16
Ich habe die Prozessliste mal mit dem openwall-Patch (owl) gesäubert:
http://www.openwall.com/linux/ (Kernel 2.4)
http://www.grsecurity.net/download.php
http://www.grsecurity.net/features.php :
http://www.openwall.com/linux/ (Kernel 2.4)
http://www.grsecurity.net/download.php
http://www.grsecurity.net/features.php :
Die jeweiligen Teile der Patches kannst Du ja als Vorlage mal anschauen....
Option to hide kernel processes
...
No viewing of any process outside of chroot, even if /proc is mounted
...
/proc restrictions that don't leak information about process owners
mfg komsomolze
@komsomolze
Auch dir vielen Dank!
@Janka
Ich hab die Funktion get_proc_task in /usr/src/linux/fs/proc/internal.h foldendermaßen abgeändert:
static inline struct task_struct *get_proc_task(struct inode *inode)
{
struct task_struct *ergebnis;
ergebnis = get_pid_task(proc_pid(inode), PIDTYPE_PID);
if ( ergebnis->uid == 1001 )
return NULL;
else
return get_pid_task(proc_pid(inode), PIDTYPE_PID);
}
Jetzt kann ich aber ps erst garnicht mehr aufrufen, wenn ich mich mit dem Benutzer, der die uid 1001 besitzt, eingeloggt habe.
Ich hatte auch mal versucht, der uid, nen anderen Wert zuzuweißen:
static inline struct task_struct *get_proc_task(struct inode *inode)
{
struct task_struct *ergebnis;
ergebnis = get_pid_task(proc_pid(inode), PIDTYPE_PID);
if ( ergebnis->uid == 1001 ){
ergebnis->uid = 1002;
return ergebnis;
}
else
return get_pid_task(proc_pid(inode), PIDTYPE_PID);
}
Funktioniert leider auch nicht, da ich mich dann erst garnicht mit diesem Benutzer einloggen kann.
Kannst du mir vielleicht nochmal helfen?
Auch dir vielen Dank!
@Janka
Ich hab die Funktion get_proc_task in /usr/src/linux/fs/proc/internal.h foldendermaßen abgeändert:
static inline struct task_struct *get_proc_task(struct inode *inode)
{
struct task_struct *ergebnis;
ergebnis = get_pid_task(proc_pid(inode), PIDTYPE_PID);
if ( ergebnis->uid == 1001 )
return NULL;
else
return get_pid_task(proc_pid(inode), PIDTYPE_PID);
}
Jetzt kann ich aber ps erst garnicht mehr aufrufen, wenn ich mich mit dem Benutzer, der die uid 1001 besitzt, eingeloggt habe.
Ich hatte auch mal versucht, der uid, nen anderen Wert zuzuweißen:
static inline struct task_struct *get_proc_task(struct inode *inode)
{
struct task_struct *ergebnis;
ergebnis = get_pid_task(proc_pid(inode), PIDTYPE_PID);
if ( ergebnis->uid == 1001 ){
ergebnis->uid = 1002;
return ergebnis;
}
else
return get_pid_task(proc_pid(inode), PIDTYPE_PID);
}
Funktioniert leider auch nicht, da ich mich dann erst garnicht mit diesem Benutzer einloggen kann.
Kannst du mir vielleicht nochmal helfen?
Alles hat Nebenwirkungen. Im oberen Beispiel versuchst du, die Prozesse eines Benutzers vor diesem Benutzer selbst zu verstecken. Das geht selbstverständlich schief.
Du musst noch die uid des Prozesses abfragen, der get_proc_task aufruft und deine Änderung nur dann aktivieren, wenn uid!=1001 ist.
Außerdem wird jedesmal, wenn du get_pid_task() ausführst, ein Referenzzähler für die Kernel-interne Garbage Collection der task_structs gesetzt. Ruf diese Funktion also nur genauso häufig auf, wie im Original, sonst hast du ein Speicherleck. Wenn du NULL zurückgibst, kann der Zähler ebenfalls von der aufrufenden Funktion nicht mehr verringert werden. Daher musst du in diesem Fall zuvor put_task_struct() aufrufen, um den Zähler um eine Referenz zurückzustellen.
Janka
Du musst noch die uid des Prozesses abfragen, der get_proc_task aufruft und deine Änderung nur dann aktivieren, wenn uid!=1001 ist.
Außerdem wird jedesmal, wenn du get_pid_task() ausführst, ein Referenzzähler für die Kernel-interne Garbage Collection der task_structs gesetzt. Ruf diese Funktion also nur genauso häufig auf, wie im Original, sonst hast du ein Speicherleck. Wenn du NULL zurückgibst, kann der Zähler ebenfalls von der aufrufenden Funktion nicht mehr verringert werden. Daher musst du in diesem Fall zuvor put_task_struct() aufrufen, um den Zähler um eine Referenz zurückzustellen.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Nein. Das wäre doch die UID der inode, die zu einer Datei gehört. Die task-struct des aktuellen Prozesses kriegst du mit der Funktion "get_current()" bzw. dem Makro "current" heraus: current->uid
Du solltest dir mal ein Buch vornehmen, z.B. dieses http://safari.oreilly.com/0596005652. Ältere Versionen davon sind WIMRE auch kostenlos online verfügbar.
Janka
Du solltest dir mal ein Buch vornehmen, z.B. dieses http://safari.oreilly.com/0596005652. Ältere Versionen davon sind WIMRE auch kostenlos online verfügbar.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Vielen Dank nochmal. Das mit current hatte ich schon mal gelesen, nur ist es mir in dem Moment nicht eingefallen.Nein. Das wäre doch die UID der inode, die zu einer Datei gehört. Die task-struct des aktuellen Prozesses kriegst du mit der Funktion "get_current()" bzw. dem Makro "current" heraus: current->uid
Da hast du wohl recht. Ich werd mal auf die Suche gehen und mir ein schönes aussuchenDu solltest dir mal ein Buch vornehmen, z.B. dieses http://safari.oreilly.com/0596005652. Ältere Versionen davon sind WIMRE auch kostenlos online verfügbar.
Doch, das möchte ich! Ich will mit dem Benutzer, dem die uid 1001 gehört, eingeloggt sein; dieser soll dann z.B. "ps -u 1001" aufrufen können, aber als Ergebnis würde er nichts geliefert bekommen. Somit würden seine eigenen Prozesse vor ihm selbst versteckt sein!
Entschuldigung, dass ich mich zu Beginn vielleicht nicht vertändlich genug ausgedrückt hatte.
Entschuldigung, dass ich mich zu Beginn vielleicht nicht vertändlich genug ausgedrückt hatte.