2015-01-17 8 views
11

Eine beliebte Möglichkeit, die Prozesse vor dem Benutzer zu verbergen, ist die Iterate-Funktion für das/Proc-Verzeichnis zu hijacken. Dies kann wie folgt dar:Linux-Kernel-Modul: Re-Hijacking der Iterate-Funktion des virtuellen Dateisystems

struct file *filep = filp_open("/proc", O_RDONLY, 0)); 
filep->f_op->iterate = p // We swap the pointer with our hacked iterate 

ich auf einem Nachweisverfahren arbeite, wo Ich mag würde die ursprüngliche Iterierte Funktion wiederherzustellen (vorausgesetzt, es wurde bereits entführt worden). Gibt es eine Möglichkeit, die ursprüngliche Iterate-Funktion zu finden, die für das Verzeichnis/proc verwendet wird?

+1

Sie können [proc_map_files_readdir] (http://lxr.free-electronics.com/source/fs/proc/base.c#L1841) direkt verwenden. Wenn der Angreifer Schreibzugriff auf den Kernel hat, kann er das natürlich auch ändern. – zch

+0

@zch Können Sie mir sagen, wie ich auf diese Funktion zugreifen kann? Es ist nicht in der sysmap vorhanden. – AlexSee

+0

Richtig, es ist eine statische Funktion, also bin ich mir nicht sicher, ob dieses Symbol überhaupt im resultierenden Kernel vorhanden sein wird. Sie können versuchen, zweite 'procfs' zu mounten und vielleicht können Sie dort einige einfache Angriffe dieser Art entdecken. – zch

Antwort

1

Sie können einen heuristischen Ansatz versuchen. Die Adresse der ursprünglichen Funktion befindet sich im selben allgemeinen Bereich wie die anderen proc-Funktionen, während sich die Adresse der Hijacker-Funktion merklich unterscheidet. Dann parst du den Maschinencode der Hijacker-Funktion. Die Hijacker-Funktion muss zu der ursprünglichen Funktion verzweigen, bevor sie zurückkehrt, so dass Sie sich alle Verzweigungsanweisungen ansehen und prüfen, welche zu den anderen ursprünglichen Adressen passen würde.

0

Ich nehme an, Sie wissen, welche Version des Kernels Sie verwenden?

Kopieren Sie einfach diese Version der Funktion in Ihr Modul und überschreiben Sie den iterativen Zeiger mit der Adresse Ihrer Kopie.

Dies sollte funktionell gleichwertig sein, obwohl es keine Aussage darüber gibt, welche anderen Übel das Rouge-Modul entfesseln könnte.

+0

Ich fürchte, es ist nicht so einfach, wenn Sie die Funktion wortwörtlich kopieren, gibt es immer noch eine Menge anderer Dinge, die diese Funktion benötigt und nicht finden kann der Adressraum des Moduls. Vielleicht ist es irgendwie möglich, aber ich habe es nicht geschafft, es zu kompilieren. – AlexSee