Prozesse eines Benutzers verstecken

Post Reply
Message
Author
wedge
Posts: 8
Joined: 22. May 2007 16:27

Prozesse eines Benutzers verstecken

#1 Post by wedge »

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wedge
Posts: 8
Joined: 22. May 2007 16:27

#3 Post by wedge »

Vielen Dank für die schnelle und hilfreiche Antwort!!!!!
Ich werde mich heute abend gleich mal dransetzen und es versuchen hinzubekommen.

PS: Dies soll wirklich kein Contest darstellen :-) Es ist eine Praktikumsaufgabe, die ich zu erledigen habe.

komsomolze
Posts: 430
Joined: 03. Mar 2006 23:16

#4 Post by komsomolze »

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 :
...
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
Die jeweiligen Teile der Patches kannst Du ja als Vorlage mal anschauen.
mfg komsomolze

wedge
Posts: 8
Joined: 22. May 2007 16:27

#5 Post by wedge »

@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?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#6 Post by Janka »

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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wedge
Posts: 8
Joined: 22. May 2007 16:27

#7 Post by wedge »

Du musst noch die uid des Prozesses abfragen, der get_proc_task aufruft und deine Änderung nur dann aktivieren, wenn uid!=1001 ist.
Wie mache ich das? Mit der struct inode, die der Funktion übergeben wird?

if ( inode->i_uid != 1001) {
.......

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#8 Post by Janka »

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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wedge
Posts: 8
Joined: 22. May 2007 16:27

#9 Post by wedge »

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
Vielen Dank nochmal. Das mit current hatte ich schon mal gelesen, nur ist es mir in dem Moment nicht eingefallen.
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.
Da hast du wohl recht. Ich werd mal auf die Suche gehen und mir ein schönes aussuchen :-)

wedge
Posts: 8
Joined: 22. May 2007 16:27

#10 Post by wedge »

Warum muss ich die Änderung nur dann aktivieren, wenn uid != 1001? Ich will doch die Prozesse verstecken, die zur uid 1001 gehören!
Und welche uid ist denn von beiden den gemeint? Ich hab schon einiges ausprobiert, ps kann ich aber dann immer noch nicht starten.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#11 Post by Janka »

Du willst aber doch nicht die Prozesse des Benutzers vor diesem selbst verstecken?

Das geht natürlich auch, dann musst du aber mit solchen Problemen rechnen wie oben mit "ps" rechnen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wedge
Posts: 8
Joined: 22. May 2007 16:27

#12 Post by wedge »

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.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#13 Post by Janka »

Das dürfte ohne Probleme mit den üblichen Systemwerkzeugen nicht zu bewerkstelligen sein, wie du ja schon gemeldet bekamst. Mal ganz abgesehen davon, dass ich den Sinn dieser Änderung nicht verstehe.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply