intercepter les appels système du système de fichiers

J’écris une application pour laquelle je dois intercepter certains appels système du système de fichiers, par exemple. dissocier. Je voudrais sauvegarder certains fichiers, disons abc. Si l’utilisateur supprime le fichier, je dois le copier à un autre endroit. J’ai donc besoin de dissocier pour appeler mon code avant de supprimer abc afin de pouvoir le sauvegarder. Je suis passé par les threads liés à l’interception des appels système mais des méthodes comme LD_PRELOAD ne fonctionneront pas dans mon cas car je veux que ce soit sécurisé et implémenté dans le kernel, donc cette méthode ne sera pas utile. inotify notifie après l’événement pour que je ne puisse pas le sauvegarder. Pourriez-vous suggérer une telle méthode? Je voudrais l’implémenter dans un module du kernel au lieu de modifier le code du kernel lui-même. Une autre méthode, suggérée par Graham Lee, je pensais à cette méthode, mais il y a quelques problèmes, j’ai besoin de tous les fichiers qui ne consumnt pas d’espace mais qui peuvent être problématiques car je dois répéter mon disque date, aussi il ne fonctionnera pas la partition croisée et sur la partition ne supportant pas le lien ainsi je veux une solution par laquelle je pourrais attacher des crochets aux fichiers / répertoires et puis regarder des changements au lieu de l’parsing répétée. Je voudrais également append un support pour l’écriture de fichier modifié pour lequel je ne peux pas utiliser de liens durs. Je voudrais intercepter les appels système en remplaçant les appels système mais je n’ai pas pu trouver de méthode pour le faire sous Linux> 3.0. Veuillez suggérer une méthode pour y parvenir.

En ce qui concerne le raccordement au kernel et l’interception des appels système, c’est ce que je fais dans un module de sécurité que j’ai écrit:

https://github.com/cormander/tpe-lkm

Regardez hijacks.c et symbols.c pour le code; comment ils sont utilisés dans la fonction hijack_syscalls dans security.c. Je n’ai pas encore essayé ceci sur Linux> 3.0, mais le même concept de base devrait toujours fonctionner.

C’est un peu compliqué, et vous devrez peut-être écrire beaucoup de code du kernel pour faire la copie du fichier avant la dissociation, mais c’est possible ici.

Vous pouvez regarder les événements sans lien avec inotify , bien que cela puisse arriver trop tard pour vos objectives (je ne sais pas parce que je ne connais pas vos objectives, et vous devriez expérimenter pour le découvrir). Les alternatives au kernel basées sur LSM (dont je veux dire SMACK, TOMOYO et les amis) sont vraiment destinées au contrôle d’access obligatoire. Elles peuvent donc ne pas convenir à vos besoins.

Une suggestion pourrait être Filesystems in Userspace (FUSE). Autrement dit, écrivez un module FUSE (qui est, dans l’espace utilisateur) qui intercepte les appels système liés au système de fichiers, effectue les tâches souhaitées et appelle ensuite l’appel système “par défaut”.

Vous pourriez alors monter certains répertoires avec votre système de fichiers FUSE et, pour la plupart de vos cas, il semblerait que le comportement par défaut de syscall ne devrait pas être remplacé.

Si vous souhaitez gérer uniquement les suppressions, vous pouvez conserver un répertoire “shadow” de link durs (créés via un link ) vers les fichiers surveillés (via inotify , comme suggéré par Graham Lee).

Si l’original est maintenant dissocié, vous avez toujours le fichier shadow à gérer comme vous le souhaitez, sans utiliser de module du kernel.