Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 19. Nov 2018 17:23

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Prozesse eines Benutzers verstecken
BeitragVerfasst: 22. Mai 2007 16:44 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 22. Mai 2007 23:34 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 23. Mai 2007 9:57 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Jun 2007 20:30 
Offline

Registriert: 03. Mär 2006 23:16
Beiträge: 430
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 :
Zitat:
...
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 14. Jun 2007 1:46 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
@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?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 14. Jun 2007 10:14 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 3:42 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
Zitat:
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) {
.......


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 8:52 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 12:05 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
Zitat:
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.
Zitat:
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 :-)


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 19:58 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 22:51 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 15. Jun 2007 23:29 
Offline

Registriert: 22. Mai 2007 16:27
Beiträge: 8
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16. Jun 2007 19:53 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 13 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de