Systemaufrufe des Dateisystem abfangen

8

Ich schreibe eine Anwendung, für die ich einige Systemsystemaufrufe abfangen muss, z. Verknüpfung aufheben Ich möchte eine Datei abc speichern. Wenn der Benutzer die Datei löscht, muss ich sie an einen anderen Ort kopieren. Also muss ich den Link aufheben, um meinen Code vor dem Löschen von abc aufzurufen, damit ich ihn speichern kann. Ich habe Threads durchlaufen, die Systemaufrufe abfangen, aber Methoden wie LD_PRELOAD funktionieren in meinem Fall nicht, weil ich möchte, dass dies sicher ist und im Kernel implementiert ist, so dass diese Methode nicht nützlich ist. inotify benachrichtigt nach dem Ereignis, so dass ich es nicht speichern konnte. Können Sie eine solche Methode vorschlagen? Ich möchte dies in einem Kernel-Modul implementieren, anstatt den Kernel-Code selbst zu modifizieren. Eine andere Methode, wie von Graham Lee vorgeschlagen, hatte ich an diese Methode gedacht, aber es hat einige Probleme, ich brauche hardlink Spiegel aller Dateien, die es keinen Platz verbraucht, aber immer noch problematisch sein könnte, wie ich wiederholt Spiegel Laufwerk um meinen Spiegel zu halten Datum, auch wird es nicht funktionieren, Cross-Partition und auf Partition nicht unterstützt Link, so dass ich eine Lösung, durch die ich Haken an die Dateien / Verzeichnisse anhängen könnte und dann auf Änderungen statt wiederholtes Scannen. Ich möchte auch Unterstützung für das Schreiben modifizierter Dateien hinzufügen, für die ich keine festen Links verwenden kann. Ich möchte Systemaufrufe abfangen, indem ich Systemaufrufe ersetze, aber ich bin nicht in der Lage gewesen, irgendeine Methode zu finden, die das in linux & gt; 3.0. Bitte schlagen Sie eine Methode vor, dies zu tun.

    
gaurav 21.12.2011, 10:31
quelle

4 Antworten

5

Was das Einhängen in den Kernel und das Abfangen von Systemaufrufen angeht, mache ich das in einem Sicherheitsmodul, das ich geschrieben habe:

Ссылка

Betrachte hijacks.c und symbols.c für den Code; wie sie verwendet werden, ist in der Funktion hijack_syscalls in security.c. Ich habe das auf Linux nicht versucht & gt; 3.0 noch, aber das gleiche Grundkonzept sollte noch funktionieren.

Es ist ein bisschen schwierig, und Sie müssen möglicherweise eine Menge Kernel-Code schreiben, um die Dateikopie vor dem Aufheben der Verknüpfung zu machen, aber hier ist es möglich.

    
Corey Henderson 22.12.2011, 17:11
quelle
2

Sie können die Verknüpfung von Ereignissen mit inotify aufheben, auch wenn dies zu spät für Ihre Zwecke passieren könnte Ich weiß es nicht, weil ich deine Absichten nicht kenne, und du solltest experimentieren, um es herauszufinden). Die Kernel-Alternativen basierend auf LSM (mit denen ich meine SMACK, TOMOYO und Freunde) sind wirklich für Obligatorische Access Control also möglicherweise nicht für Ihre Zwecke geeignet.

    
user23743 21.12.2011 11:25
quelle
1

Ein Vorschlag könnte Filesystems in Userspace (FUSE) sein. Das heißt, schreiben Sie ein FUSE-Modul (das im Benutzerbereich gewährt wird), das Dateisystem-bezogene Syscalls abfängt, alle gewünschten Aufgaben ausführt und möglicherweise den "Standard" aufruft. syscall danach.

Sie könnten dann bestimmte Verzeichnisse mit Ihrem FUSE-Dateisystem mounten, und in den meisten Fällen scheint es so, als ob das Standardverhalten von syscall nicht überschrieben werden müsste.

    
poundifdef 21.12.2011 17:14
quelle
0

Wenn Sie nur Löschungen behandeln möchten, können Sie ein "Schatten" -Verzeichnis von Hardlinks (erstellt über link ) für die überwachten Dateien behalten (via inotify , wie von Graham Lee vorgeschlagen).

Wenn das Original jetzt nicht mehr verknüpft ist, können Sie die Shadow-Datei weiterhin wie gewünscht verwenden, ohne ein Kernelmodul zu verwenden.

    
Hasturkun 21.12.2011 13:12
quelle